2011-04-27 89 views
0

我在創造我自己的二維遊戲的過程。遊戲世界中的每個對象都有一個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損失,從而使動畫切換幀同步一起線程/線程更有效的方式。

+0

您是否使用Swing? – trashgod 2011-04-27 22:40:41

+0

我不知道動畫,但我知道線程。您必須使currentImage成員var volatile,以便在各個線程之間看到更新。另外,在構造函數中啓動一個Thread幾乎總是一個糟糕的設計(如果我想要繼承此類,Thread將在類完全構造之前啓動)。使用靜態幫助器方法創建類並啓動線程(完全構建後)。 – jtahlborn 2011-04-28 01:08:50

回答

1

這樣做的通常的方法是有一個遊戲循環,知道所有的精靈和它們調用的拉伸方法(或優選地僅那些需要重畫),用於每一幀。這樣,每當一個精靈決定它想要動畫時,直到下一幀纔會這樣做。只要做動畫的繪製方法,e.i.下一個()部分。 和當然,在遊戲圈,你把你的延遲,這將決定FPS。

要得到的幀速率獨立動畫你做同樣的,但加一個參數,其表示自上次戰平多少時間已經過去了抽籤方法,然後計算動畫在此基礎上的金額。

+0

謝謝,在我看到關於線程的一些東西之前,我正在嘗試,我應該堅持下去。效果更好。幸運的是,我使用的是物理幀之間的時間間隔,所以我只需修改sprite類的參數,然後我就開始了。 – Hector 2011-04-28 03:39:20

0

你可以將精靈放在一個容器上,並在渲染線程中遍歷所有可見的精靈並繪製它們(你甚至可以實現精靈優先級,在精靈之前渲染背景層, ...)。

0

如果你使用更多的線程作爲精靈(例如,一個精靈的一個線程),那麼它會吃掉你的CPU,它會掛在遊戲中實現動畫的最佳方式是爲線程的每個運行循環做改變動畫序列(如下一張圖片或先前的按下按鈕)並在最後繪製精靈。 這裏,如果是更多的精靈和油漆將需要更多的時間,那麼FPS將在同一時間下降兩個或三個線程與同步