有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用线程的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损失,并同步线程/线程,以便动画将帧切换到一起


共 (3) 个答案

  1. # 1 楼答案

    你可以把精灵放在一个容器上,在一个渲染线程上迭代所有可见的精灵并绘制它们(你甚至可以实现精灵优先级,在精灵之前渲染背景层,…)

  2. # 2 楼答案

    如果你为精灵使用了更多的线程(即,一个线程对应一个精灵),那么它会消耗你的cpu,并且会挂起。在游戏中实现动画的最佳方法是,每次运行线程循环都会更改动画序列(如下一个图像或上一个按键),并在最后绘制精灵。 在这里,如果更多的精灵和绘画将需要更多的时间,那么FPS将在同步最多两个或三个线程时下降

  3. # 3 楼答案

    通常的方法是让一个游戏循环知道所有精灵,并为每一帧调用一个draw方法(或者最好只调用需要重画的精灵)。这样,每当精灵决定要设置动画时,它都会在下一帧之前不这样做。只需使用draw方法制作动画,即下一个()部分。 当然,在游戏循环中,你会把你的延迟,这将决定fps

    要获得与帧速率无关的动画,您可以执行相同的操作,但要在draw方法中添加一个参数,该参数表示自上次绘制以来经过了多少时间,然后根据该参数计算动画量