이 응용 프로그램의 최종 목표는 각 항목에 대한 스레드를 사용하여 동일한 속도의 다른 JPanel에서 여러 항목에 애니메이션을 적용하는 것입니다.하지만 첫 번째 부분은 완료되지만 항목은 동일하게 이동합니다 속도와 나는이 문제를 해결하는 방법에 대해 전혀 모른다.간단한 2 차원 애니메이션을위한 자바 스윙의 멀티 스레딩
package javagamestutos;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
public class Board extends JPanel implements Runnable {
private Star star;
private Thread animator;
ArrayList<Star> items=new ArrayList<Star>();
public Board() {
setBackground(Color.BLACK);
setDoubleBuffered(true);
star=new Star(25,0,0);
Star star2=new Star(50,20,25);
items.add(star2);
items.add(star);
}
public void addNotify() {
super.addNotify();
animator = new Thread(this);
animator.start();
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
for (Star s : this.items) {
g2d.drawImage(s.starImage, s.x, s.y, this);
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
public void run() {
while(true){
try {
for (Star s : this.items) {
s.move();
}
repaint();
Thread.sleep(star.delay);
} catch (InterruptedException ex) {
Logger.getLogger(Board.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
여기는 움직이는 항목 인 별표입니다. ?
package javagamestutos;
import javax.swing.JFrame;
public class Skeleton extends JFrame {
public Skeleton() {
add(new Board());
setTitle("Stars");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(300, 280);
setLocationRelativeTo(null);
setVisible(true);
setResizable(false);
}
public static void main(String[] args) {
new Skeleton();
}
}
이 어떻게 내 목표를 달성하기 위해 내가 proprely 스레드를 사용하고 어떤 생각을 가지고 수행
package javagamestutos;
import java.awt.Image;
import javax.swing.ImageIcon;
/**
*
* @author fenec
*/
public class Star {
Image starImage;
int x,y;
int destinationX=200,destinationY=226;
boolean lockY=true;
int delay;
public Star(int delay,int initialX,int initialY){
ImageIcon ii = new ImageIcon(this.getClass().getResource("star.png"));
starImage = ii.getImage();
x=initialX;
y=initialY;
this.delay=delay;
}
void moveToX(int destX){
this.x += 1;
}
boolean validDestinatonX(){
if(this.x==this.destinationX){
this.lockY=false;
return true;
}
else
return false;
}
void moveToY(int destY){
this.y += 1;
}
boolean validDestinatonY(){
if(this.y==this.destinationY)
return true;
else
return false;
}
void move(){
if(!this.validDestinatonX())
x+=1;
if(!this.validDestinatonY() && !this.lockY)
y+=1;
/*if(!this.validDestinatonY())
y+=1;
*/
}
}
여기에는 JFrame의 확장 애니메이션의 골격입니까? 미리 감사드립니다.
"게시판이 Runnable이 아니므로 애니메이터 = 새 스레드 (컴파일)가 컴파일되지 않아야합니다." 어 ... 네. 'public class Board 확장 JPanel은 Runnable을 구현합니다' – Powerlord
예, 귀하의 의견을 입력 할 때 편집했습니다. 일단 당신이 다시 포맷 한 것을 보았습니다. 너무 좋지 않은 게시물 편집을 upvote 수 있습니다. – akf