2012-02-14 14 views
3

私はこの問題を抱えている人々がたくさんいますが、私の場合は解決策を見つけることができません。タイトルと同じように、私は同じイメージを含む2つのスプライトを使用して、スクロールバックグラウンドを持っています。私は高さを321(321x480)に設定して問題を解決すると信じていました、少年はそうしませんでした。ここで空想Cocos2D:スクロールバックグラウンドでのギャップ

background = [CCSprite spriteWithFile:@"level1BG.png"]; 
     background.position = ccp(background.contentSize.width/2, background.contentSize.height/2); 
     [self addChild:background]; 

     background2 = [CCSprite spriteWithFile:@"level1BG.png"]; 
     background2.position = ccp(background2.contentSize.width/2, -background2.contentSize.height/2); 
     [self addChild:background2]; 

何もない、ただのセットアップ:

まあ、これは、initの私の設定です。

これは私のスケジュールスクロールです(もちろんccTimeパラメータもあります)。 ああ、背景が上にスクロールしてy値が増えます。

-(void)scroll:(ccTime)dt{ 
    background.position = ccp(background.position.x, background.position.y + GAME_SPEED*dt); 
    background2.position = ccp(background2.position.x, background2.position.y + GAME_SPEED*dt); 

    if(background.position.y >= background.contentSize.width){ 
     background.position = ccp(background.position.x, -background.contentSize.height/2 + 1); 
    }else if(background2.position.y >= background2.contentSize.width){ 
     background2.position = ccp(background2.position.x, -background2.contentSize.height/2 + 1); 

    } 
} 

GAME_SPEEDは50.0に設定されています。私は「+ 1」を追加して、それが問題を解決すると信じていましたが、もう一度間違っていました!

質問には、誰もこの場合ギャップを取り除く方法を知っていますか?永遠に感謝するだろう!ただ、明確化のため

よろしく

+0

あなたはアクションを試しましたか?私は動きのアクションと同様のことを行い、問題なく動作します。 – Setrio

+0

@Setrioとして、私はこれに問題はありません。あなたは動きのないときにそれが存在するかどうかを確認するために縫い目の中間画面でスクロールを停止しましたか? – YvesLeBorg

+0

@Setrioうーん、実際にはアクションでうまくいかない、サンプルコードを貼り付けることはできますか?それは同じ原則ですか? – Alouette

答えて

0

、あなたが321個のピクセルに高さを設定するとき、あなたは位置を調整できますか? (更新)

background.position = ccp(background.contentSize.width/2, (background.contentSize.height - 1)/2); 
background2.position = ccp(background2.contentSize.width/2, -(background2.contentSize.height - 1)/2); 

雲のケースのために私は、代替提案する:(テクスチャは2のべき乗の大きさでなければなりません)、水平方向の雲テクスチャのタイル張りで1つのスプライトを使用しています。次に、スプ​​ライトを移動する代わりにスクロールテクスチャの座標を変更します。しかし、この機能は公式のcocos2dソースにはないので、hereから取得し、CCTextureNodeクラスとマージする必要があります。その後:

  • TextureMoveByアクションと[cloudTexture setTexParameters: ...]
  • スクロール質感を経由して、あるいはここでの更新方法でcloudTexture.texPosition
+0

まあ、これはかなり奇妙だった。まず、いいえ、私は位置を変更するのを忘れた、ありがとう。だから、私はあなたのコードを試してみると、それはギャップを取り除いているようだが、スクロール機能はブレーキを掛けて、背景が浮かぶ。 – Alouette

+0

私は答えの代わりのアプローチを追加しました... – brigadir

2

を調整することにより、クラウドテクスチャ用GL_TEXTURE_WRAP_Sテクスチャパラメータを設定するには、私は雲を作るために使用するいくつかの古いコードですシーンの上に表示されます

Clouds.h

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 

@interface Clouds : CCLayer { 
    CCSprite *first; 
    CCSprite *second; 
    float firstX0; 
    float secondX0; 
    float firstXf; 
    float secondXf; 
    float height; 
    float firstWidth; 
    float secondWidth; 
    float Yvalue; 
    float duration; 
    id moveFirstDone; 
    id moveSecondDone; 
} 

@end 

Clouds.m

Clouds *clouds = [Clouds node]; 
    [self addChild: clouds z:0]; 

を使用して

#import "Clouds.h" 

@implementation Clouds 
-(id) init{ 
    if((self=[super init])) { 
     first = [CCSprite spriteWithFile:@"clouds_1.png"]; 
     firstWidth = first.contentSize.width; 
     height = first.contentSize.height; 
     second = [CCSprite spriteWithFile:@"clouds_2.png"]; 
     secondWidth = second.contentSize.width; 
     Yvalue = 220.0f; 
     duration = 200.0f; 
     CGSize size = [[CCDirector sharedDirector] winSize]; 
     firstXf = -1 * (secondWidth - size.width + firstWidth/2); 
     secondXf = -1 * (firstWidth + secondWidth/2); 
     firstX0 = size.width + firstWidth/2; 
     secondX0 = size.width + secondWidth/2; 

     moveFirstDone = [CCCallFuncN actionWithTarget:self selector:@selector(callFirstDone:)]; 
     moveSecondDone = [CCCallFuncN actionWithTarget:self selector:@selector(callSecondDone:)]; 

     first.position = ccp(firstX0 + -1*firstX0,Yvalue); 
     second.position = ccp(secondX0,Yvalue); 
     [self addChild:first]; 
     [self addChild:second]; 
     [first runAction:[CCSequence actions:[CCMoveTo actionWithDuration:duration position:ccp(firstXf,Yvalue)],moveFirstDone,nil]]; 
     [second runAction:[CCSequence actions:[CCMoveTo actionWithDuration:duration*2 position:ccp(secondXf,Yvalue)],moveSecondDone,nil]]; 
    } 
    return self; 
} 

-(void)callSecondDone:(id)sender{ 
    second.position = ccp(secondX0,Yvalue); 
    [second runAction:[CCSequence actions:[CCMoveTo actionWithDuration:duration*2 position:ccp(secondXf,Yvalue)],moveSecondDone,nil]]; 
} 

-(void)callFirstDone:(id)sender{ 
    first.position = ccp(firstX0,Yvalue); 
    [first runAction:[CCSequence actions:[CCMoveTo actionWithDuration:duration*2 position:ccp(firstXf,Yvalue)],moveFirstDone,nil]]; 
} 
@end 

あなたのメイン層/シーン

にノードを追加し、これは正確に何であるかどうかは知りません必要ですが、おそらくそれは助けます。このアプローチを使用して得られる効果のビデオをご覧ください。https://rapidshare.com/files/3478655240/2012-02-14_1458.swf

関連する問題