1

私はゲームに取り組んでいて、シマリスで物理学のものを実装しています。シマリスと統合するまで、cocos2dの部分はすべて順調に進んでいました。少し背景:

ゲームはブロック付きのゲームです。レベルはプロパティリストで定義され、ブロックの位置、サイズ、重力などはすべて、レベルに表示されるブロックごとに定義されます。

問題は、ブロックが表示されることです。ゲームのメインシーンの一部であるBlockLayerクラスにメソッドがあります。レイヤーの作成時に、プロパティリストが読み取られ、すべてのブロックが作成されます。次のメソッドは、ブロックを作成するために呼び出されます。

-(void)createBlock:(Block *)block withAssets:(NSBundle *)assets
{{
    スプライト*スプライト;
    switch(block.blockColour)
    {{
        ケースkBlockColourGreen:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@ "green" ofType:@ "png" inDirectory:@ "Blocks"]];
            壊す;
        ケースkBlockColourOrange:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@ "orange" ofType:@ "png" inDirectory:@ "Blocks"]];
            壊す;
        ケースkBlockColourRed:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@ "red" ofType:@ "png" inDirectory:@ "Blocks"]];
            壊す;
        ケースkBlockColourBlue:
            sprite = [Sprite spriteWithFile:[assets pathForResource:@ "blue" ofType:@ "png" inDirectory:@ "Blocks"]];
            壊す;
    }
    sprite.position = block.bounds.origin;
    [自己addChild:sprite];
    if(block.blockColour == kBlockColourGreen || block.blockColour == kBlockColourRed)
        スペース->重力=cpvmult(cpv(0、10)、1000);
    cpVect verts [] = {
        cpv(-block.bounds.size.width、-block.bounds.size.height)、
        cpv(-block.bounds.size.width、block.bounds.size.height)、
        cpv(block.bounds.size.width、block.bounds.size.height)、
        cpv(block.bounds.size.width、-block.bounds.size.height)
    };
    cpBody * blockBody = cpBodyNew([block.mass floatValue]、INFINITY);
    blockBody-> p = cpv(block.bounds.origin.x、block.bounds.origin.y);
    blockBody-> v = cpvzero;
    cpSpaceAddBody(space、blockBody);
    cpShape * blockShape = cpPolyShapeNew(blockBody、4、verts、cpvzero);
    blockShape-> e = 0.9f;
    blockShape-> u = 0.9f;
    blockShape-> data = sprite;
    cpSpaceAddShape(space、blockShape);
}

上記のコードでは、スプライトが表示されることはありません。ただし、「cpSpaceAddBody(space、blockBody);」をコメントアウトすると ライン、スプライトが表示されます。

ブロックの位置とサイズは、CGRectであるBlockクラスのインスタンスの「bounds」プロパティに格納されます。

重要かどうかはわかりませんが、アプリの向きは左横向きで、すべての座標はその向きに基づいています。

どんな助けでも大歓迎です。

4

3 に答える 3

0

わかりました。答えを見つけました。問題は、シマリスを設置する際の重力で、信じられないかもしれません。正しく設定していませんでした。重力をcpv(0,0)に設定すると、ブロックが画面に表示されました。その後、他のコードをいじくり回した後、重力を再び導入することができました。私のブロック作成方法をいじくり回す必要がありました。

于 2009-09-20T20:48:50.400 に答える
0

特定のボディが重なっていないことを確認してください。2つのボディが重なると、力の計算アルゴリズムが少しおかしくなり、画面座標の外側に2つのボディができてしまいます。

そうは言っても、はverts array間違っているようです:

cpVect verts[] = {
    cpv(-block.bounds.size.width, -block.bounds.size.height),
    cpv(-block.bounds.size.width, block.bounds.size.height),
    cpv(block.bounds.size.width, block.bounds.size.height),
    cpv(block.bounds.size.width, -block.bounds.size.height)
};

次の理由から、指定された値の半分で作業する必要があります|x| + |-x| = 2x。(そしてあなただけが欲しい1x

cpVect verts[] = {
    cpv(-(block.bounds.size.width/2), -(block.bounds.size.height/2)),
    cpv(-(block.bounds.size.width/2), block.bounds.size.height/2),
    cpv(block.bounds.size.width/2, block.bounds.size.height/2),
    cpv(block.bounds.size.width/2, -(block.bounds.size.height/2))
};
于 2009-09-20T01:52:42.863 に答える
0

ブロックの質量をどのように計算するか聞いてもいいですか?

cpBody* blockBody = cpBodyNew([block.mass floatValue], INFINITY);
于 2010-03-31T12:03:27.730 に答える