0

助けが必要です(ええと)。cocos2dでゲームのランダムなY位置を生成したいと思います。

したがって、状況は次のようになります。ゲームは0.2秒ごとにプラットフォームを生成します。iPhone/iPadは横向きモードです。プラットフォームは画面の右側に表示され(プラットフォームが画面の外側に表示されるように幅よりも大きいx)、を使用して画面の左端に向かって移動を開始しますCCMoveTo。プラットフォームごとにランダムなYを選択します。問題は、プラットフォームを別のプラットフォームの上にスポーンしたくないということです。これは、「すでに取得されていない」randYを作成する必要があることを意味します。私がこれまでに試したコードは次のとおりです。

//this is a part of code from my addPlatform function. This part in particular cares for the generation of my Y coordinate.
int randY = arc4random() % (int)(3 * (winSize.height/4)); //This prevents to spawn a Y larger than 3/4 of the screen

//here I would like to loop long enough to find a good Y
while (![self isGoodPlatformY:randY])
{
    randY = arc4random() % (int)(3 * (winSize.height/4));
}

次の部分は私のisGoodPlatformY機能です

- (bool)isGoodPlatformY:(int)platY
{
    CGSize winSize = [[CCDirector sharedDirector] winSize];
    int padding = 100;
    bool ok = true;
    for (CCSprite *body in [self children])
    {
        if (body.tag > platformBody)
        {
            if (body.position.x < (winSize.width - padding))
            {
                if (abs(body.position.y - platY) < 20)
                {
                    ok = false;
                }
            }
        }
    }
return ok;
}

プラットフォームよりも大きなタグですべてのボディをループします。タグを使用して分離するさまざまなタイプのプラットフォームがあります。ボディがプラットフォームの場合、最初にX座標を確認します。プラットフォームが十分に離れている場合(パディング)、その正確なポイントで新しいプラットフォームをスポーンできるので、次のプラットフォームを確認します。そうでない場合は、そのプラットフォームのYを確認します。この場合、Y座標が20ピクセル未満の場合は、新しいYを見つける必要があります。そのため、boolをfalseに設定し、forループの後に返します。中かっこは必要ないことはわかっていますが、他のことをテストしていたので、そこに入れました。

これはうまくいかないようです。自分が何を達成したいのかを明確にしたいと思います。あなたの側からの助けをいただければ幸いです。私があまりにも初心者のスタイルを見逃していないことを願っています:)

この問題は「どこでも」発生する可能性があるため、他の言語で質問にタグを付けました。

4

2 に答える 2

0

今、私は自分の質問に答えることができることを発見しました:)(愚かな私)。ええ、問題はずっと前に修正されましたが、これを読んでいる可能性のある人にとっては、解決策は行を変更することでした:

if (body.position.x < (winSize.width - padding))

に:

if (body.position.x > (winSize.width - padding))
于 2012-12-04T17:08:47.990 に答える
0

生成されたすべてのプラットフォームに同じタグが付けられていると仮定すると、タグを使用してさまざまなタイプのプラットフォームを分離しているということです。

以前のすべてのプラットフォームは、この行に対して true を返しません

if (body.tag > platformBody)

それらはすべて同じタグを持っているため、(1 > 1) を比較しますが、これは false です。

したがって、メソッドは常に YES (ok のデフォルト値) を返し、プラットフォームが互いに衝突するかどうかを確認することはありません。

これが当てはまるかどうかを確認するために、メソッドをステップ実行することをお勧めします。

于 2012-05-15T00:26:51.227 に答える