2009-12-12 8 views
5

レイヤーに一連のスプライトを配置しようとしていますが、すべてのスプライトをグループとして移動したいので、CocosNodeを作成して同じに設定しました画面の中央に配置し、そのノードに追加するのではなく、そのノード(lightNode)にスプライトを追加します。Cocos2d - 親ノード上の複数のスプライト

私が見ているのは、スプライトがlightNodeではなくレイヤーに配置されている場合と比べて、正しい(同じ?)位置に表示されないということです。

XCode Cocos2dアプリケーションテンプレート "Hello World"を使用して問題を示すテストプログラムを作成しました。次にHelloWorldScene.mのHelloWorldクラスの-init()メソッドをこのコードに置き換えました。

-(id) init 
{ 
    if((self=[super init])) 
    { 
     // create my parent node that will contain all the related sprites 
     lightPane = [[CocosNode alloc] init]; 
     CGSize paneSize = { 480, 320 }; 
     [lightPane setContentSize:paneSize]; 
     [lightPane setPosition:ccp(240, 160)]; 

     // add pane to layer  
     [self addChild:lightPane z:0]; 

     // add a series of sprites to demonstrate the problem 
     int y = 40; 
     int x; 
     for (x=30; x<300; x+=20) 
     { 
      Sprite *sp = [Sprite spriteWithFile:@"pause.png"]; 
      [sp setPosition:ccp(x, y)]; 

      NSLog(@"Next sprite at position (%d, %d)", x, y); 

      [lightPane addChild:sp z:1]; 
      //[self addChild:sp z:1]; 
      x+= 20; 
     } 
    } 
    return self; 
} 

このコードは、「pause.png」と呼ばれるPNGファイルを参照する - ジャストサイズが30×30ピクセルについての小さな画像を撮影し、それを実行するには、このプロジェクトに配置します。

スプライトは画面の中央付近から右端に向かって表示されます。

lightPaneにスプライトを追加する行をコメントアウトし、その下の行のコメントを外してサンプルを再実行すると、必要な座標にスプライトが正しく表示されます。

これは明らかにスプライトの親として使用しているCocosNodeと関係があります。誰でも私がここで間違っているのを見ますか?

+0

よく形成された質問、良いコードサンプル! +1 – nash

答えて

3

lightPaneの位置を0,0に設定したいとします。位置はデフォルトで中央揃えではなく、左下隅です。

+0

Doh!何らかの理由で私はCocosNodeがスプライトのように動作することを期待しました - 私はアンカーを中心に設定していると信じていますか?いずれにせよ、あなたは正しいです、それはセンターではなく0、0の位置にある必要があります。ありがとう! –

+1

または、lightPaneノードをアンカー0.5,0.5に設定します。私はこれを早く試してみて誓うことができたし、うまくいかなかった。しかし、私がしたことは、アンカーが240,160であって、.5、.5ではなくアンカーに設定されていると思います。アンカーはコンテンツのサイズに比例し、絶対ポイントではありません。したがって、.5、.5は高さの半分幅の半分である。 –

+0

スプライトは中央のアンカー位置を持つので、アクションは期待通りに動作すると思います。例えばスプライトを回転させ、左下から回転させることを想像してください。 –

0

スプライトアトラスに移動すると機能しません。ベータ版のCocos2d(1.9)の新しいバージョンに移行しない限り、そうではありません。 1.9バージョンでは、アトラススプライトの複雑な子育てを行うことができます。

関連する問題