나는 내 자신의 2 차원 게임을 만드는 중입니다. 게임 세계의 모든 객체에는 Sprite 객체가 있으며 화면이 그려지면 객체의 스프라이트가 객체의 위치에 그려집니다.스프라이트 애니메이션 관리 스레드를 사용하여
스프라이트 클래스는 단일 이미지 또는 애니메이션 스프라이트를 만드는 데 사용되는 일련의 이미지 일 수 있습니다.
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
public class Sprite implements Runnable{
private int currentImage;
private BufferedImage[] sprites;
private int delayMS;
private Thread animation;
public Sprite(BufferedImage sprite){
sprites = new BufferedImage[1];
sprites[0] = sprite;
}
public Sprite(BufferedImage[] spriteAnimation,int delay){
this.sprites = spriteAnimation;
currentImage = 0;
delayMS = delay;
//start a thread to time animation
animation = new Thread(this);
animation.start();
}
private void next(){
if(currentImage < sprites.length - 1)
currentImage++;
else
currentImage = 0;
}
public void run() {
while (Thread.currentThread() == animation) {
//delay the animation for delayMS
try {
Thread.sleep(delayMS);
} catch (InterruptedException e) {
break;
}
//next image
next();
}
}
public void draw(Graphics2D g,int x,int y){
g.drawImage(sprites[currentImage],null,x,y);
}
}
많은 애니메이션을 실행하기 위해 스레드를 사용한다는 주제에 대한 신뢰할만한 정보를 찾을 수 없었습니다. 이것이 최선의 접근 방식인지 궁금합니다. 내가 세계에 동일한 물건을 200,000 던지기 전까지는 모든 것이 잘 작동합니다. FPS가 낮아지기 시작하고 일부 애니메이션 스프라이트가 다른 시간에 프레임을 변경하기 시작합니다. 스레드가 인스턴스화 될 때 지연되기 시작하기 때문에 이것은 의미가 있습니다.
제 질문은이 문제를 처리 할 수있는 효과적인 방법이 있는지, 중요한 FPS 손실없이 더 많은 개체를 사용하도록 허용하고 스레드/스레드를 동기화하여 애니메이션이 프레임을 함께 전환하도록하는 것입니다.
스윙을 사용하고 있습니까? – trashgod
애니메이션에 대해서는 잘 모르지만 스레딩에 대해 알고 있습니다. currentImage 멤버를 var volatile로 변경해, 다양한 thread간에 갱신이 행해지도록 (듯이) 할 필요가 있습니다. 또한 생성자에서 Thread를 시작하는 것은 거의 항상 나쁜 설계입니다. (이 클래스를 하위 클래스로 만들려면 Thread가 완전히 생성되기 전에 Thread가 시작됩니다.) 정적 도우미 메서드를 사용하여 클래스를 만들고 스레드를 시작합니다 (완전히 생성 된 후). – jtahlborn