2013-03-13 9 views
25

Ich arbeite an CoCos2d mit Android.Ich möchte einen endlosen scrollenden Hintergrund zu meinem Bildschirm hinzufügen, indem Sie CCParallaxNode verwenden. Ich kann Hintergrund hinzufügen und verschieben, aber nach Abschluss dieser Bewegung wird der Bildschirm schwarz. Kann mir jemand helfen?Hinzufügen von endlosen Parallax Hintergrund in cocos2d Android

Mein Code ist

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

wenn Sie erhalten seine Antwort dann gut sonst kann man mit der Logik, diese Sache zu tun, nachdem zweiten Abschluss ersten und zweiten Abschluss starten Start ... es funktioniert gut für mich, aber ich benutze nicht den ParallaxNode-Modus –

+0

Vielen Dank für Ihren Kommentar. Ich möchte nur wissen, wenn Sie nicht Parallax Knoten verwenden, dann wie Sie Ihren Hintergrund in der Rückseite bewegen? Verwenden Sie einfach moveBy Aktionen auf Sprite? –

+0

Hast du diese Arbeit gemacht? Wenn ja, welchen Prozess wählen Sie? –

Antwort

6

Ich sehe, dass da nicht eine einzige Antwort war für Sie verfügbar ist. Ich werde einen einfachen Code zur Verfügung stellen, der Ihnen für Ihren paralax scrollenden Hintergrund hilft.

diesen Code in Ihrem Spiel Schichten Konstruktor hinzufügen

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

und eine Scroll-Methode, die jede Millisekunde geplant ist. diese

this.schedule("scroll"); 

und jetzt Scroll-Methode in Konstruktor hinzuzufügen.

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


} 

markieren Sie meine Antwort, wenn es funktioniert hat.

+0

Vielen Dank für die Lösung, die Sie wirklich meinen Tag gemacht haben. Danke noch einmal . –

0

versuchen dies mit:

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

und vergewissern Sie sich, dass die Höhe des Bildes und Breite Potenz von 2

+0

Danke für Ihre Antwort und tut mir leid, dass dieser Code nicht in Android funktioniert.Ihre erste Codezeile hat nicht die gleiche CCTextureCache Klasse in Android. Bitte helfen Sie mir, wenn Sie irgendeine Idee haben, wie man für Android arbeitet –

+0

andd was sind GL_LINEAR, GL_LINEAR, GL_REPAET? –

0

sein muss, es sieht aus wie die CCRepeatForever Aktion Es läuft nur goBack, was bedeutet, dass es nicht reversiert. Versuchen Sie Folgendes:

+0

Ich denke, dass Sie meine Frage nicht bekommen. Ich möchte meinen Hintergrund immer in der rückwärtigen Seite bewegen. Ich möchte Bildbewegung wiederholen. Mit dem obigen Code, den Sie in Ihrem Antworthintergrund gaben, bewegen Sie zuerst vorwärts dann rückwärts und dann diese Reihenfolge für immer wiederholt. Ich möchte etwas wie endlose Parallaxe wie in I-Phone Cocos 2d. Danke für deine Antwort –

1

Rufen Sie diese Methode von der Klasse Konstruktor. Ich fand diesen Trick aus Beispiel: "shotingblock-Master" auf 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 funktioniert ausgezeichnet in meinem Fall. Vielleicht hilft es dir voll.

+0

Danke für deine Antwort Es funktioniert, aber in meinem Fall werde ich allein mit Ihrem Code und ich werde es Ihnen sagen. –

+0

haben Sie die Lösung durch diese oder etwas anderes? –

0

Dies ist ein Trick, um es zu ermöglichen. Sie können die große png verwenden und arbeiten daran oder die Probe Testcode überprüfen, die in coocs2d-android Bibliothek

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

Es ist nur eine einfache Möglichkeit, die Parallaxe zu verwenden, aber Sie können Ihren eigenen Punkt verwenden –

+0

downVoters Fügen Sie Ihre Bewertung hinzu, was genau Sie, wo ich falsch liege? –

0

Bitte überprüfen Sie folgenden Link für Parallax vertikal endlos Hintergrund aus: 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);