2016-01-08 36 views
0

我試圖從同一個類創建多個動畫兔子,但我似乎無法圍繞它環繞我的頭,也許有人可以提供幫助。目前,我有我的場景只有一個兔子在這裏使用此代碼(它跳躍到右)Java創建具有獨立行爲模式的多個動畫對象

private void constructRootBunny(boolean preview) 
{  
    GameObject bunnyRoot = new GameObject(); 

     game.RemoveBunnyObject(bunnyRoot); 

    bunnyRoot.GetTransform().GetPos().Set(new Vector3f(506+bunny_X,500,506.5+bunny_Z)); 
    bunnyRoot.GetTransform().SetScale(new Vector3f(0.1,0.1,0.1)); 

    bunny_X += 0.005; // bunny 'hops' to the right 

    if(preview == true) { 
      String bunnyFrame = bunny_WalkCycle.get(currentFrame); //obj files 

      Mesh mesh = new Mesh(bunnyFrame); 
      Material material = new Material (new Texture("bunny_Furr1.png"), 
          new Texture("diffuse_NRM.jpg"), 
          new Texture("diffuse_DISP.jpg")); 
      bunnyRoot.AddComponent(new MeshRenderer(mesh, material)); 
     } 

     game.AddBunnyObject(bunnyRoot); 

    currentFrame++; 

    if(currentFrame== 30) { 
     currentFrame= 0; //resets animation 
    } 
} 

看視頻:https://www.youtube.com/watch?v=yHvCHJp85Tc

我能有多個兔子很容易但他們是靜態的,我不能讓他們動畫化(甚至不是同時)..我不知道如何將不同的行爲模式應用到各自的兔子,以便他們最終獨立行動(有不同的動畫,走到不同的動畫地方等)..

任何想法或建議,我可以嘗試嗎?

+1

考慮尋找戰略模式,如果你想控制不同的行爲(不同的跳躍的兔子這麼說)https://en.wikipedia.org/wiki/Strategy_pattern – PNS

+0

聽起來很有趣的感謝! – DisasterCoder

回答

1

您已將動畫硬編碼到您的代碼中。您需要動態分配動畫行爲。

您可以使用一組預定義的行爲並使用Random Number Generator爲兔子分配行爲。

作爲一個想法,考慮創建一個提供抽象方法的Behavior類。那麼也許考慮製作一個延伸BehaviorJumpBehavior類,它要求你指定hopFrequency,maximumHeightmovementDirection。然後,您可以使用不同的參數實例化幾個JumpBehaviors以創建一個唯一行爲數組。

一旦你將這些行爲分配給兔子,你可以在每幀的基礎上更新兔子。

public abstract class Behavior 
{ 
    public abstract void initBehavior(); 
    public abstract void updateBunny(GameObject bunny); 
} 

public class JumpBehavior extends Behavior 
{ 
    private long hopFrequency = 1000; //1 hop/1000 milliseconds. 
    private double maximumHeight = 20, movementVelocity = 0; 

    public JumpBehavior(long hopFrequency, double maximumHeight, double movementVelocity) 
    { 
     this.hopFrequency = hopFrequency; 
     this.maximumHeight = maximumHeight; 
     this.movementVelocity = movementVelocity; 
    } 

    private long previousTimeMillis = 0; 
    private long elapsedTimeMillis = 0; 
    private long timeSinceHop = 0; 

    public void initBehavior() 
    { 
     //Start the clock. 
     previousTimeMillis = System.currentTimeMillis(); 
     elapsedTimeMillis = System.currentTimeMillis(); 
    } 

    public void updateBunny(GameObject bunny) 
    { 
     //Implement logic to control bunny here. 
     //Consider some randomization using a Random Number Generator. 

     //Keep track of time. 
     elapsedTimeMillis = System.currentTimeMillis() - previousTimeMills; 

     //If velocity is negative, then we move left. 
     bunny.X += movementVelocity * elapsedTimeMillis; 

     timeSinceHop += elapsedTimeMillis; 
     if (timeSinceHop >= hopFrequency) 
     { 
      //Reset counter, but keep the extra milliseconds passed. 
      timeSinceHop -= hopFrequency; 

      //Apply an acceleration to the bunny to start the hop. 
      //Maybe add logic to make sure it doesn't hop while in the air. 
      bunny.Velocity.Y += maximumHeight; 
     } 

     previousTimeMillis = elapsedTimeMillis; 
    } 
} 
+0

謝謝,希望不會像你想像的那麼靈活。它實際上只是一個從攪拌機輸出的30幀動畫。在每一幀之後,我用包含這個動畫的下一幀的obj文件替換現有的兔子對象(mesh.obj) - 我的問題是我想要有多個兔子,都有這個希望的動畫,但有不同的移動模式所以說..我會盡快更新我的答案,也許在某個時候你的建議也可以實施,所以謝謝! – DisasterCoder

+0

謝謝我現在可以做出多個兔子..唉動畫現在不起作用,因爲我無法一次跟蹤任何兔子的感覺,大小和旋轉..我想這是一個不同的問題,雖然.. – DisasterCoder

+0

很高興知道你解決了你的第一個問題。與往常一樣,如果需要,隨時發佈另一個問題! –