2013-03-13 14 views
25

Sto lavorando su CoCos2d con android.Voglio aggiungere uno sfondo a scorrimento infinito al mio schermo utilizzando CCParallaxNode. Sono in grado di aggiungere lo sfondo e spostarlo, ma dopo il completamento di tale azione di movimento lo schermo diventa nero. Qualcuno può darmi una mano?Aggiunta di sfondo di parallasse senza fine in cocos2d android

mio codice è

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

se si otterrà la risposta, allora il suo bene altrimenti si può fare questa cosa con la logica dopo un completamento seconda partenza e la seconda il completamento prima inizio ... funziona bene per me ma non sto usando la modalità parallasse di tipo –

+0

Grazie per il tuo commento. Voglio solo sapere se non stai usando il nodo della parallasse, quindi come muovi lo sfondo sul retro? Stai semplicemente usando le azioni moveBy su sprite? –

+0

Hai fatto questo lavoro? Se sì, allora quale processo scegli? –

risposta

6

vedo che dal momento che non una sola risposta ha funzionato per voi. Fornirò un semplice codice che ti aiuterà per lo sfondo a scorrimento Parralax.

Aggiungi questo codice nel tuo strati gioco costruttore

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

e un metodo di scorrimento che è prevista ogni millisecondo. aggiungere questo nel costruttore

this.schedule("scroll"); 

e ora il metodo di scorrimento.

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


} 

contrassegnare la mia risposta se ha funzionato.

+0

Grazie per la soluzione che hai davvero fatto la mia giornata. Grazie ancora . –

0

provare a utilizzare questo:

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

e fare in modo che l'altezza e la larghezza dell'immagine deve essere potenza di 2

+0

Grazie per la tua risposta e mi spiace che questo codice non funzioni in Android.La tua prima riga di codice non ha la stessa classe CCTextureCache in Android.Si prega di darmi una mano se hai qualche idea su come lavorare per Android –

+0

andd cosa sono GL_LINEAR, GL_LINEAR, GL_REPAET? –

0

Sembra che l'azione CCRepeatForever lo sta eseguendo solo goBack, il che significa che non sta invertendo. Prova il seguente:

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

Penso che tu non abbia la mia domanda. Voglio spostare il mio sfondo sempre in una posizione arretrata. Voglio ripetere il movimento dell'immagine. Con il codice precedente che hai dato nello sfondo della tua risposta, spostati prima avanti e poi indietro e poi questa sequenza ripetuto per sempre. Voglio qualcosa come la parallasse infinita come in i-phone cocos 2d. Grazie per la tua risposta –

1

Chiama questo metodo dalla classe Costruttore. Ho trovato questo trucco da Esempio: "shotingblock-master", disponibile su 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 eccellenti opere nel mio caso. Potrebbe essere utile per te.

+0

Grazie per la tua risposta Sta funzionando, ma nel mio caso lo farò da solo utilizzando il tuo codice e te lo dirò. –

+0

hai la soluzione attraverso questo o qualcos'altro? –

0

Questo è un trucco per farlo accadere. È possibile utilizzare la grande png e lavorare su di esso o controllare il codice test di esempio che è disponibile in libreria 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

È solo un modo semplice per usare la parallasse, ma puoi usare il tuo punto personale –

+0

downVoters Aggiungi la tua opinione che cosa esattamente, dove mi sbaglio? –

0

Si prega di verificare di seguito collegamento per Parallax sfondo infinito verticale: 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);