1

ゲームのバックグラウンドで画像をスクロールするコードを書きます。2 つのスプライトを定義し、それらの位置を設定するだけです。

CGSize screenSize=[[CCDirector sharedDirector]winSize];

sky1 = [CCSprite spriteWithFile:@"sky1.png"];

sky1.position=ccp(screenSize.width/2, screenSize.height/2);
[self addChild:sky1];
CCLOG(@"sky1 position  width=%f    height=%f",sky1.position.x,sky1.position.y);
sky2=[CCSprite spriteWithFile:@"sky2.png"];
sky2.position=ccp(screenSize.width/2, sky1.position.y+sky1.contentSize.height/2+sky2.contentSize.height/2);
[self addChild:sky2];
[self schedule:@selector(scroll:) interval:0.01f];

scroll メソッドでスクロールするためのコードを記述します。

-(void)scroll:(ccTime)delta{
    CGSize screen=[[CCDirector sharedDirector] winSize];
    CCLOG(@"come from schedule method    pos.y=%f",sky1.position.y);
    sky1.position=ccp(sky1.position.x, sky1.position.y-1);
    sky2.position=ccp(sky2.position.x, sky2.position.y-1);
    if(sky1.position.y <= -([sky1 boundingBox].size.height));
    {
         sky1.position=ccp(sky1.position.x, sky2.position.y+[sky2 boundingBox].size.height);

        CCLOG(@"COMING IN first ifin scroll mwthod  position width=%f  pos.y=%f",sky1.position.x,sky1.position.y);
    }
    if(sky2.position.y<= -[sky2 boundingBox].size.height);
    {
        sky2.position=ccp(sky2.position.x, sky1.position.y+[sky1 boundingBox].size.height);
        CCLOG(@"coming in secnond if ");
    }
}

条件を削除すると、if一度は正常に機能します。自分の状態の何が問題なのか、自分のコードで何が起こっているのかわかりません。誰でも説明できますか?

4

1 に答える 1

2

コードが正しく機能しない理由がよくわかりません。私の頭に浮かぶのは、間隔が短すぎるかもしれないということです。つまり、0.01f(1/100)は、ゲームの更新速度である0.016(1/60)よりも短くなります。だから私が最初に試みることはあなたの間隔を多分0.02fに微調整することです。スケジュール呼び出しからinterval引数を削除して、フレームごとに1回だけ実行するようにすることもできます。また、ccTime引数は使用されていないため、削除してみます。

[self schedule:@selector(scroll)];

-(void)scroll {}

しかし、それ以外に、これはおそらくCCActionsを使用して処理するのが最適です。これは、CCMoveToアクションの単純なペアをCCRepeatForeverと組み合わせて、必要な効果を得るように見えます。これが私が行く方法です。

編集:これを達成するためのCCActionsの使用についてもう少し詳しく説明します。同じことを行うには複数の方法がありますが、次の方法を試すことができます。

float moveDuration = 3; // or however fast you want it to scroll
CGPoint initialPosition = ccp(screenSize.width/2, screenSize.height/2);
CGPoint dp = ccp(0, -1*sky1.contentSize.height); // how far you want it to scroll down
CCMoveBy *scrollSky1 = [CCMoveBy actionWithDuration:moveDuration position:dp];
CCMoveTo *resetSky1 = [CCMoveTo actionWithDuration:0 position:initialPosition];
CCSequence *sequence = [CCSequence actionOne:scrollSky1 two:resetSky1];
CCRepeatForever *repeat = [CCRepeatForever actionWithAction:sequence];
[sky1 runAction:repeat];
于 2012-12-12T09:00:05.690 に答える