2013-03-13 13 views
25

私はCoCos2dをAndroidで使用しています.CCParallaxNodeを使用して、画面に無限のスクロールバックグラウンドを追加します。 私は背景を追加して移動することができますが、その移動アクションの完了後に画面が黒くなります。 誰かが私を助けることができますか?cocos2dアンドロイドに無限の視差の背景を追加する

私のコードは

CCParallaxNode parallaxNode; 
CCSprite spacedust1; 
CCSprite spacedust2; 
CCSprite planetsunrise; 
CCSprite galaxy; 
CCSprite spacialanomaly; 
CCSprite spacialanomaly2; 

parallaxNode = CCParallaxNode.node(); 

    spacedust1 = CCSprite.sprite("bg_front_spacedust.png"); 
    spacedust2 = CCSprite.sprite("bg_front_spacedust.png"); 
    planetsunrise = CCSprite.sprite("bg_planetsunrise.png"); 
    galaxy = CCSprite.sprite("bg_galaxy.png"); 
    spacialanomaly = CCSprite.sprite("bg_spacialanomaly.png"); 
    spacialanomaly2 = CCSprite.sprite("bg_spacialanomaly2.png"); 
    // 3) Determine relative movement speeds for space dust and background 
    // CGPoint cgPoint = CGPoint.ccp(0.1, 0.1); 

    CGPoint dustSpeed = CGPoint.ccp(10, 10); 
    CGPoint bgSpeed = CGPoint.ccp(5, 5); 
    // CGPoint bgSpeed = ccp(0.05, 0.05); 

    parallaxNode.addChild(spacedust1, 0, dustSpeed.x, dustSpeed.y, 0, 
      winSize.height/2); 
    parallaxNode.addChild(spacedust2, 0, dustSpeed.x, dustSpeed.y, 
      spacedust1.getContentSize().width, winSize.height/2); 
    parallaxNode.addChild(galaxy, -1, bgSpeed.x, bgSpeed.y, 0, 10); 
    parallaxNode.addChild(planetsunrise, -1, bgSpeed.x, bgSpeed.y, 600, 5); 
    parallaxNode 
      .addChild(spacialanomaly, -1, bgSpeed.x, bgSpeed.y, 900, 20); 
    parallaxNode.addChild(spacialanomaly2, -1, bgSpeed.x, bgSpeed.y, 1500, 
      30); 
    CCIntervalAction go = CCMoveBy.action(4, CGPoint.ccp(winSize.width, 0)); 
    CCIntervalAction goBack = go.reverse(); 
    CCIntervalAction seq = CCSequence.actions(go, goBack); 
    CCRepeatForever action = CCRepeatForever.action(goBack); 
    parallaxNode.runAction(action); 
+0

第1、第2開始と第二完了私はうまく動作しますが、私はparallaxNodeモードを使用していません –

+0

あなたのコメントをありがとう。視差ノードを使用していないかどうか、バックグラウンドで背景をどのように動かしているかを知りたいだけですか?単純にスプライトでmoveByアクションを使用していますか? –

+0

あなたはこの仕事をしましたか?はいの場合は、どのプロセスを選択しますか? –

答えて

6

coocs2d-androidのライブラリで提供されたサンプルテストコードをチェックし、大きなPNGを使用し、それまたはに取り組んできます。私は、あなたのパララックススクロールの背景に役立つ簡単なコードを提供します。

はあなたのゲーム層コンストラクタ

background1 = CCSprite.sprite("bg2.png"); 
background2 = CCSprite.sprite("bg2.png"); 

background1.setPosition(CGPoint.ccp(winSize.width*0.5f,winSize.height*0.5f)); 
addChild(background1); 

background2.setPosition(CGPoint.ccp(winSize.width+winSize.width*0.5f,winSize.height*0.5f)); 
addChild(background2); 

とミリ秒ごとに予定されているスクロール方式では、このコードを追加します。 これをコンストラクタに追加します

this.schedule("scroll"); 

そして今はスクロールメソッドです。

public void scroll(float dt) { 

    CGPoint pos1 = background1.getPosition(); 
    CGPoint pos2 = background2.getPosition(); 

    pos1.x -= 5.0f; 
    pos2.x -= 5.0f; 

    if(pos1.x <=-(winSize.width*0.5f)) 
    { 
     pos1.x = pos2.x + winSize.width; 
    } 

    if(pos2.x <=-(winSize.width*0.5f)) 
    { 
     pos2.x = pos1.x + winSize.width; 
    } 

    background1.setPosition(pos1); 
    background2.setPosition(pos2); 


} 

マーク私の答えが働いた場合。

+0

本当にありがとうございました。再度、感謝します 。 –

0

これを使用してみてくださいです:

CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("pic.png"); 
ccTexParams params = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT}; 
texture->setTexParameters(&params); 

CCSprite *sprite = CCSprite::spriteWithTexture(texture, CCRectMake(0, 0, 90, 90)); 

とそれはCCRepeatForeverアクションのように見える画像の高さと幅が2

+0

あなたの答えをありがとう、このコードはアンドロイドで動作していません申し訳ありません。あなたの最初のコード行はアンドロイドで同じCCTextureCacheクラスを持っていません。あなたがアンドロイドで働く方法を知っていれば助けてください。 –

+0

そしてGL_LINEAR、GL_LINEAR、GL_REPAETは何ですか? –

0

の力でなければならないことを確認してくださいgoBackしか実行されていないため、逆転していません。以下を試してください:

CCIntervalAction go = CCMoveBy.action(4, CGPoint.ccp(winSize.width, 0)); 
CCIntervalAction goBack = go.reverse(); 
CCIntervalAction seq = CCSequence.actions(go, goBack); 
CCRepeatForever action = CCRepeatForever.action(seq); // change to seq instead of goBack 
parallaxNode.runAction(action); 
+0

私はあなたが私の質問をしないと思う。私はバックグラウンド側に常に私の背景を移動したい。私はイメージの動きを繰り返したい。上記のコードをあなたは答えの背景でまず前方に移動し、永遠に繰り返される。私は、i-phone cocos 2dと同じ無限の視差のようなものを望む。あなたの答えをありがとう –

1

このメソッドをクラスConstructorから呼び出します。 githubの上で利用できる "shotingblockマスター" ...

private void endlessBackground() { 
    // Create the two background sprites which will alternate 
    _oddBackground = CCSprite.sprite("blue_background.png"); 
    _evenBackground = CCSprite.sprite("blue_background.png"); 
    // One starts dead centre and one starts exactly one screen height above 
    oddBackground.setPosition(_winSize.width/2, _winSize.height/2); 
    evenBackground.setPosition(_winSize.width/2, _winSize.height 
      + (_winSize.height/2)); 
    // Schedule the scrolling action 
    schedule("scroll"); 
    // Add sprites to the layer 
    addChild(_oddBackground).addChild(_evenBackground); 
} 

public void scroll(float dt) { 
    // move them 100*dt pixels down 
    _oddBackground.setPosition(_oddBackground.getPosition().x, 
      _oddBackground.getPosition().y - 150 * dt); 
    _evenBackground.setPosition(_evenBackground.getPosition().x, 
      _evenBackground.getPosition().y - 150 * dt); 
    // reset position when they are off from view. 
    if (_oddBackground.getPosition().y < -_winSize.height/2) { 
     _oddBackground.setPosition(_winSize.width/2, _winSize.height/2); 
     _evenBackground.setPosition(_winSize.width/2, _winSize.height 
       + (_winSize.height/2)); 
    } 
} 

}

ITは、私の場合には優れた作品を:私はこの例からトリックを発見しました。それはあなたのために完全に役立つでしょう。

+0

あなたの答えをありがとうそれは動作していますが、私の場合、私は自分のコードを使用して私はあなたに言います。 –

+0

あなたはこれか何か他の方法で解決策を得ていますか? –

0

これは、それが起こるためのトリックです。あなたは

は私がいないので、一つの答えはあなたのために働いていることがわかり
CCSprite background = CCSprite.sprite("background.png"); 

// create a void node, a parent node 
CCParallaxNode voidNode = CCParallaxNode.node(); 

// background image is moved at a ratio of 0.4x, 0.5y 
voidNode.addChild(background, -1, 0.4f, 0.5f, 0, 0); 

// write your own code for the parallax node 
CCIntervalAction goUp = CCMoveBy.action(4, CGPoint.make(0,-200)); 
CCIntervalAction goDown = goUp.reverse(); 
CCIntervalAction go = CCMoveBy.action(8, CGPoint.make(-1000, 0)); 
CCIntervalAction goBack = go.reverse(); 
CCIntervalAction seq = CCSequence.actions(goUp, go, goDown, goBack); 
voidNode.runAction(CCRepeatForever.action(seq)); 

addChild(voidNode); 
+0

これは、視差を使用する簡単な方法ですが、あなた自身のポイントを使用することができます –

+0

downVotersあなたのレビューを追加してください私は間違っていますか? –

0

視差垂直無限の背景でのリンクの下にチェックアウトしてください:あなたがそうでなければ、あなたが1終了後のロジックで、このことを行うことができ、その良い答えを得るかどう http://kalpeshsantoki.blogspot.in/2014/07/create-vertical-endless-parallax.html

CGSize winSize = CCDirector.sharedDirector().displaySize(); 

    //I made graphics for screen 720*1200....so I made this dynamic scale to support multiple screens 
    float sX = winSize.width/720.0f; 
    float sY = winSize.height/1200.0f; 
    background = CCVerticalParallaxNode.node(sX, sY, true); 

    background.addEntity(1f, "background.png", 0); 
    background.addEntity(3, "road_simple.png", winSize.width/2); 
    background.addEntity(1.7f, "road_side.png", 0); 
    addChild(background); 
関連する問題