使用线程的java Sprite动画管理
我正在制作自己的二维游戏。游戏世界中的每个对象都有一个精灵对象,当绘制屏幕时,对象的精灵将绘制在对象的位置
sprite类可以是单个图像,也可以是用于制作animates 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损失,并同步线程/线程,以便动画将帧切换到一起
# 1 楼答案
你可以把精灵放在一个容器上,在一个渲染线程上迭代所有可见的精灵并绘制它们(你甚至可以实现精灵优先级,在精灵之前渲染背景层,…)
# 2 楼答案
如果你为精灵使用了更多的线程(即,一个线程对应一个精灵),那么它会消耗你的cpu,并且会挂起。在游戏中实现动画的最佳方法是,每次运行线程循环都会更改动画序列(如下一个图像或上一个按键),并在最后绘制精灵。 在这里,如果更多的精灵和绘画将需要更多的时间,那么FPS将在同步最多两个或三个线程时下降
# 3 楼答案
通常的方法是让一个游戏循环知道所有精灵,并为每一帧调用一个draw方法(或者最好只调用需要重画的精灵)。这样,每当精灵决定要设置动画时,它都会在下一帧之前不这样做。只需使用draw方法制作动画,即下一个()部分。 当然,在游戏循环中,你会把你的延迟,这将决定fps
要获得与帧速率无关的动画,您可以执行相同的操作,但要在draw方法中添加一个参数,该参数表示自上次绘制以来经过了多少时间,然后根据该参数计算动画量