2014-06-15 1 views
4

J'ai un nœud SKShape qui représente une ellipse. Un joueur est placé sur le point courant d'un chemin de Bézier qui est basé sur CGPath de l'ellipse:Suivre un CGPath avec SKAction sans commencer par le début de CGPath

enter image description here

J'ai deux actions que le nœud joueur peut effectuer. Le joueur peut soit suivre le chemin dans le sens des aiguilles d'une montre, soit dans le sens inverse des aiguilles d'une montre.

rotateCounterClockwiseAction = SKAction.followPath(counterClockwisePath.CGPath, asOffset: false, orientToPath: true, duration: 1) 
rotateClockwiseAction = SKAction.followPath(clockwisePath.CGPath, asOffset: false, orientToPath: true, duration: 1) 

Quand je commence une des actions comme:

player.runAction(SKAction.repeatActionForever(rotateClockwiseAction), withKey: "ClockwiseRotation") 

Le joueur se déplace le long du chemin et la direction appropriée. Lorsque j'arrête l'une des actions:

player.removeActionForKey("ClockwiseRotation") 

Le lecteur s'arrête sur le dernier emplacement où il a été déplacé. Je veux être en mesure de démarrer l'une des actions à partir du point actuel du joueur, et suivre le même chemin, mais maintenant, si je recommence l'une des actions (après qu'une action a déjà été démarrée et arrêtée), le joueur saute au même point de départ que sur la photo et suit le chemin à partir de là. Comment puis-je amener le joueur à suivre le chemin à partir du point où il est déjà?

+1

vous devez créer une nouvelle cgpath, même forme, mais en commençant par le point le joueur est à – LearnCocos2D

+0

j'ai créé mon chemin avec 'laisser ellipse = SKShapeNode (ellipseOfSize: CGSizeMake (size.0, size.1)) ', ie. pas beaucoup d'expérience dans ce domaine. Avez-vous des ressources qui pourraient m'aider à atteindre cet objectif? – JuJoDi

Répondre

0

Vous pouvez y parvenir facilement en utilisant la propriété speed de SKNode. Au lieu de supprimer et de recréer l'action, vous pouvez faire une pause et la reprendre en ajustant la valeur de la vitesse. Cela entraînera la reprise de votre animation de Bézier à partir de sa position actuelle.

// Set the player node's speed to 0.0 causing all actions to be paused. 
[playerNode setSpeed:0.0]; 

... 

// Then when you're ready to resume set the player node's speed back to 1.0. 
// This will cause the action to continue from its current position. 
[playerNode setSpeed:1.0]; 
+0

Cela ne fonctionne pas car le nœud du joueur a deux actions qui lui sont attachées. Il peut soit tourner à gauche ou tourner à droite. S'il tourne à gauche et je fais une pause, je peux reprendre la rotation à gauche, mais si je commence à tourner à droite, il commencera au début du chemin ou là où le dernier chemin à droite a été mis en pause. – JuJoDi

+0

Je comprends. Dommage que vous ne puissiez pas inverser les actions de suivi de chemin simplement avec une vitesse -1. De cette façon, vous n'auriez besoin que d'une action. Je pense que je serais enclin à coder l'orbite sans actions en utilisant sin/cos et en gardant une trace de la position actuelle de l'orbite. –

+1

Je l'ai fait travailler de cette façon avec redessiner le chemin en fonction de la position actuelle du joueur sur un cercle, ce que je suis aux prises avec redessine lorsque le chemin est une ellipse – JuJoDi