2013-03-13 78 views
25

我正在與android.co一起使用CoCos2d,我想通過使用CCParallaxNode爲我的屏幕添加一個無限的滾動背景。 我可以添加背景並移動它,但在完成移動動作後,屏幕變黑。 有人可以幫我嗎?在cocos2d中添加無盡的視差背景android

我的代碼是使用

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

如果你得到的答案則其良好的,否則你可以做這件事情與邏輯後一個完成第二次啓動和第二完成第一開始......它適用於我,但我沒有使用parallaxNode模式 – 2013-04-14 18:45:19

+0

感謝您的評論。我只想知道,如果你不使用視差節點,那麼你是如何將背景移動到背面的?你是否簡單地在sprite上使用moveBy動作? – 2013-04-15 05:01:29

+0

你做了這項工作嗎?如果是,那麼你選擇哪個流程? – 2013-06-22 09:39:36

回答

6

我看,既然沒有一個單一的答案爲你工作。我將提供一個簡單的代碼,它可以幫助你實現你的幻燈片背景。

在你的遊戲層構造

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

感謝您爲我的一天所做的解決方案。再次感謝 。 – 2014-02-14 05:45:33

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)); 

,並確保圖像的高度和寬度必須是2

+0

感謝您的回答,並對不起,這段代碼不適用於Android。你的第一行代碼在android中沒有相同的CCTextureCache類。請幫助我,如果你有任何想法如何工作的Andr oid – 2013-05-08 05:18:29

+0

andd什麼是GL_LINEAR,GL_LINEAR,GL_REPAET? – 2013-05-08 11:13:22

0

功率它看起來像CCRepeatForever行動只運行它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一樣的無盡視差。感謝您的回答 – 2013-05-14 07:31:56

1

從類Constructor中調用此方法。我發現從實例這一招: 「shotingblock主」 在github上可用...

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

感謝您的回答它正在工作,但在我的情況下,我會自己通過使用您的代碼,我會告訴你。 – 2013-05-22 10:13:07

+0

你有沒有通過這個或別的什麼解決方案? – 2013-06-22 08:57:01

0

這是使它發生的訣竅。您可以使用大型PNG和它的工作檢查樣品測試代碼是在coocs2d-的Android庫中的可用

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

這只是一個簡單的方法來使用視差,但你可以使用自己的點 – 2013-08-01 07:42:13

+0

downVoters添加您的評論你究竟是什麼,我錯了? – 2013-08-01 08:51:32

0

請查看以下鏈接視差垂直無休止的背景: 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);