0

私は最初のcocos2dゲームを開発しています。ループする背景、すべて異なる速度でループする3つの異なるレイヤーがあります。ループの速度は、ユーザー入力に基づいて変化します。

これが私がそうしている方法です

-(void) update: (ccTime) dt
{
for (CCSprite *bckgrnd in backgroundArray){
    switch (bckgrnd.tag) {
        case 0:
            bckgrnd.position = ccp(bckgrnd.position.x - speed * .30, bckgrnd.position.y);
            break;
        case 1:
            bckgrnd.position = ccp(bckgrnd.position.x - speed * .80, bckgrnd.position.y);
            break;
        case 2:
            bckgrnd.position = ccp(bckgrnd.position.x - speed * .50, bckgrnd.position.y);
            break;

        default:
            break;
    }
    if (bckgrnd.position.x <= -kBacWidth) {
        CGPoint greatestPosition = CGPointMake(0, 0);
        for (CCSprite *sprt in backgroundArray){
            if (sprt.tag == bckgrnd.tag && sprt.position.x > greatestPosition.x) {
                greatestPosition = CGPointMake(sprt.position.x, sprt.position.y);
            }
        }

        bckgrnd.position = ccp(greatestPosition.x + kBacWidth, bckgrnd.position.y); 
    }
}
}

これは機能しますが、2つの問題があります。最初に、2回目のループの後にギャップが作成され、次にギャップがそこにとどまります。もう1つの問題は、背景のさまざまな部分が画面上を左に移動するときに「揺れる」ように見えることです。これにより、個別のスプライトが時々ピクセル単位でオーバーラップします。私は持つことができません。どこが間違っているのですか?前もって感謝します!

4

1 に答える 1

0

垂直スクロール シューティング ゲーム用に ParallaxBackground を実装しました。更新方法は次のとおりです。私も最初にギャップの問題を抱えていたので、それがあなたを刺激するのに役立つことを願っています..

speedFactors は、背景の各ストライプの速度を決定する float オブジェクトの配列です。上部と下部のストライプ (半分に分割された画像) があるため、numStripes に 2 を掛けて、可視範囲から外れたときに再配置できるようにします (条件: if(pos.y < -screenSize.height) )。

スプライトは子としてクラスに追加されますが、必要に応じて CCSpriteBatch または backgroundArray も使用できます。

-(void) update:(ccTime)delta
{
    CCSprite* sprite;
    int factorIndex=0;
    for (int i=0; i<(numStripes*2); i++) {

        sprite = (CCSprite*)[self getChildByTag:firstParallaxSpriteTag+i];

        NSNumber* factor = [speedFactors objectAtIndex:factorIndex];

        CGPoint pos = sprite.position;
        pos.y -= scrollSpeed * [factor floatValue];;

        // Reposition stripes when they're out of bounds
        if (pos.y < -screenSize.height)
        {
            pos.y += (screenSize.height * 2) - 2;
        }
        sprite.position = pos;   
        factorIndex++;
        if(factorIndex>=numStripes){
            factorIndex=0;
        }
    }   
}

コメントでさらに質問することを躊躇しないでください。

PS: 記録として、私のメソッドとクラスは、この本の ShootEmUp の例から ParallaxBackground クラスを変更したものです。ソース コードはリンク先にあります。本も購入することをお勧めします。

PPS: 1 ピクセルのギャップを回避するには、スプライトを再配置するときにそれを削除する必要があります。背景スプライトのギャップを回避するには、背景スプライトの 2 つのインスタンスを割り当てて、画面内で交互に配置する必要があります (1 つが画面の外にある場合)。視覚的な範囲を最初に再配置します-画面の上部または側面、あなたの場合は側面-)、その後、両方の背景スプライトを移動し続けます.

于 2012-06-15T23:01:21.960 に答える