我正在创建自己的二维游戏。游戏世界中的每个对象都有一个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损失,并同步线程/线程以便动画将帧切换到一起。
答案 0 :(得分:1)
通常的做法是让游戏循环知道所有精灵,并为每个帧调用一个draw方法(或者最好只需要重绘的那些)。这样,只要精灵决定它想要动画,它就不会这样做直到下一帧。只需动画绘制方法,e.i。下一个()部分。 当然,在游戏循环中你会延迟,这将决定fps。
要获得与帧速率无关的动画,您可以执行相同的操作,但为draw方法添加一个参数,该参数表示自上次绘制以来经过了多少时间,然后根据此计算动画量。
答案 1 :(得分:0)
不是在自己的线程上运行每个sprite,而是可以将sprite放在容器上,并在渲染线程上遍历所有可见的sprite并绘制它们(你甚至可以实现sprite优先级,在sprite之前渲染背景层,。 ..)。
答案 2 :(得分:0)
如果你为sprite使用更多的线程(即一个sprite的一个线程),那么它将占用你的cpu并且它将挂起在游戏中实现动画的最佳方式是每次运行的线程循环都会改变动画序列(像下一张图片或之前的关键按下)并在最后画出精灵。 在这里,如果更多的精灵和油漆将花费更多的时间,那么FPS将在同步时最多两个或三个线程下降