0

私は現在、iPhone の画面に一連の泡を描かなければならないゲームに取り組んでいます。各バブルには、PhysicsEditor という名前のポリゴン物理エディタを使用して描画された独自のシマリス ボディがあります。それを使用して、シマリスの体を作成するために必要な情報 (質量、弾性、アンカーポイントなど) を含む .plist ファイルを作成しました。

以下は、指定された座標でバブルを作成するために使用するコードです。

- (cpBody *)drawBubblesWithX:(int)x andY:(int)y {

    NSString *name = names[arc4random() % 7];
    CCSprite *sprite; // Will contain the sprite object if name isn't Nil

    // create physics shape
    [[GCpShapeCache sharedShapeCache] anchorPointForShape:@"BubbleSlot"];
    cpBody *body = [[GCpShapeCache sharedShapeCache] createBodyWithName:@"BubbleSlot" inSpace:space withData:nil];

    cpBodySetPos(body, cpv(x, y));
    if (name != nil) { // If a color has been selected

        // create and add sprite
        sprite = [CCSprite spriteWithFile:[NSString stringWithFormat:@"%@.png", name]];
        [self addChild:sprite];

        // set the position of the sprite to be the same as the physics body
        sprite.position = CGPointMake(x, y);

        // set the position of body based on the sprite object
        cpBodySetUserData(body, (__bridge cpDataPointer)(sprite));

    }
    return body;
}

[[GCpShapeCache sharedShapeCache] オブジェクトには、ボディの作成に使用される .plist ファイルが含まれています。.plist には、「BubbleSlot」という名前のボディが 1 つだけあり、ゲーム内のすべてのバブルを作成するためのテンプレートとして使用されます。

ボディのアンカーポイントは約 (0.5, 0.5) です。

私の問題は、cpBodySetPos() 関数が物理オブジェクトの位置を設定しないことです。アンカーポイントによって変更されます。たとえば、cpBody オブジェクトの位置を iPhone 画面の中央に設定するには、cpBodySetPos(body, cpv(160,240)) を実行します。しかし、何らかの理由で、.plist ファイル内のボディのアンカーポイントを (160,240) の値で設定し、それに応じてボディを作成する必要があります。

4

2 に答える 2

1

スプライトにもアンカーポイントがあります。これを、Physics Editor((0.5、0.5)スタイル)で設定したアンカーポイントに設定することをお勧めします。このようにして、スプライトは体の中心がどこにあるかを正しく表示します。

self.sprite.anchorPoint = [[GCpShapeCache sharedShapeCache] anchorPointForShape:@"BubbleSlot"];

PEのアンカーポイントはそれだけだと思います。PEのplistローディングコードは、ボディの位置をアンカーポイントに設定しますが、とにかくボディの位置をより意味のある場所に設定するので、それはかなり役に立ちません。したがって、上記のように、これを使用してスプライトのアンカーポイントを設定します。

また、フレームごとにスプライトの位置をボディの位置で更新していますよね?「更新」または「ステップ」メソッドでのこのようなもの:

    CGPoint pt = cpBodyGetPos(self.body);
    self.sprite.position = pt;

あなたの症状から、あなたはシマリスにそれを更新させるのではなく、あなた自身が体の位置を更新しているように聞こえます。ボディを作成してワールドに追加するときは、一度だけ位置を設定する必要があります。

于 2012-12-16T02:42:00.103 に答える
1

そのため、物理エディタでアンカー ポイント プロパティが何に使用されているのか正確にはわかりませんが、シマリスにはそのような概念はありません。ボディの位置は重心と同じで、トルクが加えられたときに回転するのと同じポイントです。

形状は、その位置を基準にしてボディに取り付けられます。頂点が (0,0) のポリゴン シェイプの場合、ボディの重心になります。(1, 0) の頂点は、体の重心の右側にあります (回転していない場合)。

私の最善の推測では、アンカーポイントは物理エディタが (0, 0) として扱っている場所です。ただし、上記で説明したことでは意味がありません。うーん。

于 2012-12-15T21:28:08.533 に答える