我在創造我自己的二維遊戲的過程。遊戲世界中的每個對象都有一個Sprite對象,當繪製屏幕時,對象的Sprite被繪製在對象的位置上。精靈動畫管理使用線程
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個相同的物體。 FPS開始降低,一些動畫精靈開始在不同的時間改變幀。這是有道理的,因爲線程在實例化時會開始延遲。
我的問題是是否有處理這個問題,讓我使用起來更加對象,而顯著FPS損失,從而使動畫切換幀同步一起線程/線程更有效的方式。
您是否使用Swing? – trashgod 2011-04-27 22:40:41
我不知道動畫,但我知道線程。您必須使currentImage成員var volatile,以便在各個線程之間看到更新。另外,在構造函數中啓動一個Thread幾乎總是一個糟糕的設計(如果我想要繼承此類,Thread將在類完全構造之前啓動)。使用靜態幫助器方法創建類並啓動線程(完全構建後)。 – jtahlborn 2011-04-28 01:08:50