2012-02-29 16 views
0

これが私の最後の質問にフォローアップされています、私はプログラム的に(する必要がない単一色付きの円を作成し、2-Dの平野を渡ってそれを動かすために私の単純なケースの場合PlayNでサークルをアニメーション化するにはどうすればよいですか?

How can I draw a circle to the screen with PlayN?

たいbox2d libを使用してください)。

実際の例では、複数のサークルをアニメーション化する必要があります。この場合の二つの実例(申し訳ありませんが、私はリンクを削除する必要がありました - 十分ではありませんカルマを!):

  • Browsmosをクロームため
  • 蟻AIチャレンジ

それはでした私の最後の質問に答えて、ImmediateLayer classを使用したいと考えているので、これを私のゲームループに適切に組み込む方法を理解したいと考えています。左から右へ

public class SimpleCircleAnimation implements Game { 

    // Surface  
    private GroupLayer rootLayer; 
    private ImmediateLayer surface; 
    private Canvas canvas; 

    private Circle circle; 
    private CanvasImage circleImage;   

    @Override 
    public void init() { 
     // create root layer 
     rootLayer = graphics().rootLayer(); 

     // a simple circle object 
     int circleX = 0; int circleY = 0; 
     int circleRadius = 20; 
     circle = new Circle(circleX, circleY, circleRadius); 

     // create an immediate layer and add to root layer 
     ImmediateLayer circleLayer = graphics().createImmediateLayer(new ImmediateLayer.Renderer() { 
      public void render (Surface surf) { 
       circleImage = graphics().createImage(circle.radius*2, circle.radius*2); 
       canvas = circleImage.canvas(); 
       canvas.setFillColor(0xff0000eb); 
       canvas.fillCircle(circle.radius, circle.radius, circle.radius); 
       surf.drawImage(circleImage, circle.x, circle.y); 
      } 
     }); 
     rootLayer.add(circleLayer); 
    } 

    @Override 
    public void paint(float alpha) { 
    } 

    @Override 
    public void update(float delta) { 
     // move circle 
     int newX = circle.x + 4; int newY = circle.y + 4; 
     circle.setPoint(newX, newY); 
    } 

    @Override 
    public int updateRate() { 
     return 25; 
    } 
} 

はこれが正常に画面下に斜めに円を移動します。

ここにありますが、私のコードサンプルです。いくつかの質問:

  • これは適切に実装されていますか?
  • 複数のアニメーションサークルの場合、レンダラーコールバック内の各サークルに円画像を作成するというアイデアレイヤーのアイデアですか?または、おそらく各サークルのイミディエイトレイヤーを作成し、それらをルートレイヤーに追加しますか?
+0

私はここに例のリンクを追加することができるかどうか見てみましょう:[Browsmos](のhttp:// html5games。 com/2011/06/browsmos /)、[Ant AI Challenge](http://aichallenge.org/visualizer.php?game=346330) – klenwell

答えて

0

私はImmediateLayer(Surfaceサーフ)アダプターをレンダリングしません。ここでUは、

circleImage = graphics().createImage(circle.radius*2, circle.radius*2); 

画像のレンダリング方法の作成の内側だけで、通常の層を使用してペイント方法で

surf.drawImage(circleImage, circle.x, circle.y); 

これを入れている、uは細かい

絵画でなければなりません塗装方法で行われ、そこに計算を入れないでください 更新は計算のためのもので、物理的なものです

+0

お返事ありがとうございます。このアドバイスは、@samskivertによって与えられたものと矛盾しています:http://stackoverflow.com/a/9486105/1093087。私が説明したケースでは、彼はImmediateLayerを使うとより良いパフォーマンスが得られることを示唆しています。 – klenwell

+0

より、samskivertさんの回答をお待ちしています...私は正確な実装がわからないが、彼がすぐにそうすべきだと言うなら、おそらく正しいだろう。 – Darwly

+0

私の特定のケースは、ロードされたイメージファイル/スプライトをアニメートするのではなく、プログラムでイメージをプログラムで作成していた。しかし、CuteGameはImmediateLayerでロードされたイメージを使用しているので、ImmediateLayerを使用している引数がどういうものかはわかりません。 – klenwell

関連する問題