Я в процессе создания собственной двумерной игры. Каждый объект в игровом мире имеет объект 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 и синхронизировать поток / потоки, чтобы анимации переключали кадры вместе.