objective-c math cocos2d-iphone movement ccsprite

objective c - Cocos2D establece la posición del sprite en relación con otro sprite



objective-c math (1)

Estoy seguro de que esta es una pregunta fácil para cualquiera que sepa algo sobre matemáticas y programación (Cocos2D), pero cuando se trata de matemáticas, soy el idiota de la aldea.

Mi juego tiene un barco que vuela en el espacio. El barco permanece en el centro de la pantalla y la cámara se mueve con el barco. Intento agregar proyectiles que disparan desde la nave y se mueven a la misma velocidad sin importar la velocidad a la que la nave se "mueva".

Para resolver esto, he estado intentando agregar (10.0, 10.0) a la ubicación de mi sprite de proyectil en cada paso. Esto funciona (aunque siempre va a la parte superior izquierda), sin embargo, si trato de obtener también agregar el movimiento de la nave o la cámara a la posición del sprite, así como el (10.0, 10.0) lo entiendo completamente mal.

Esto es lo que estoy haciendo actualmente:

CGPoint tempStep = ccpAdd(self.position, ccp(10.0, 10.0)); CGPoint tempSubStep = ccpSub(self.position, player.currentLocation); NSLog(@"Difference: (%fx, %fy)", tempSubStep.x, tempSubStep.y); CGPoint finalStep = ccpAdd(tempStep, tempSubStep); // CGPoint tempSubStep = ccpSub(tempStep, player.currentLocation); // CGFloat diff = ccpDistance(tempStep, player.currentLocation); // CGPoint tempSubStep = ccpAdd(tempStep, ccp(diff, diff)); self.position = finalStep;

Las cosas que están comentadas son algunas de las cosas que he estado intentando (aunque hay muchas otras cosas).

  • self: CCSprite Subclassed
  • player.currentLocation es una propiedad de ubicación retenida del jugador sprite. La propiedad es atómica y asignada. Si eso es incorrecto, házmelo saber.

Intenté agregar los proyectiles a una nueva capa y mover la capa con el sprite del jugador, pero en el momento en que se mueve el sprite del jugador (y por lo tanto la capa) mis proyectiles desaparecen. He probado CCLayerColor y CCParallaxNode.

En resumen :

Me gustaría disparar un tiro que se origina desde la posición de la nave. Me gustaría que se aleje de la nave a una velocidad constante, independientemente del movimiento del barco jugador después de que se disparó el tiro.

Ejemplo: el jugador se mueve hacia la parte superior derecha de la pantalla (por así decirlo) y dispara un tiro en la misma dirección. El jugador no adelanta al proyectil sin importar qué tan rápido el jugador vuela. Alternativamente, si el jugador de repente va en la dirección opuesta, el proyectil no parece acelerar de repente, sino que se mueve a la misma velocidad.

Gracias por cualquier ayuda que pueda brindar.

EDITAR:

Ok, creo que puedo haberlo conseguido. Muy simple realmente.

CGPoint tempStep = ccpAdd(self.position, _direction); CGPoint playerDiff = ccpSub(player.currentLocation, _lastKnownPlayerLocation); CGPoint finalStep = ccpAdd(tempStep, playerDiff); self.position = finalStep; _lastKnownPlayerLocation = player.currentLocation;

Ahora solo tengo que descubrir cómo obtener un radio dentro de un rango.


Confirmó que esta es la solución completa para cualquier persona que pueda tener esta pregunta en el futuro:

// Add the direction you want the sprite to move in to it''s current position CGPoint tempStep = ccpAdd(self.position, _direction); // Subtract the player''s current location from it''s last known position CGPoint playerDiff = ccpSub(player.currentLocation, _lastKnownPlayerLocation); // Add the projectile sprite''s desired new position to the change in the player''s location CGPoint finalStep = ccpAdd(tempStep, playerDiff); // Set the position of the projectile sprite self.position = finalStep; // Store the new location of the player in the buffer variable _lastKnownPlayerLocation = player.currentLocation; // Move the Box2D body to match the sprite position. // Not that this will break physics for this body, but I have // my body set as a sensor so it will still report to the contact // listener. b2Vec2 moveToPosition = b2Vec2(self.position.x/PTM_RATIO, self.position.y/PTM_RATIO); _body->SetTransform(moveToPosition, 0.0);

  • self es una subclase de CCSprite, por lo que self.position es la posición del sprite en la pantalla.
  • _lastKnownPlayerLocation debería ser obvio, pero esta es la posición del jugador sprite la última vez que se verificó.
  • _dirección es un valor pasado de un "stick analógico". Obtengo el ángulo y lo paso a la clase. La clase usa ccpForAngle (ángulo de flotación) para obtener un CGPoint y luego usa ccpMult (CGPoint, float) para multiplicarlo en cualquier dirección que desee (es decir, a qué velocidad quiere que se mueva su disparo).

Mi situación está usando Box2D para muchas cosas, así que las últimas 2 líneas pertenecen a eso.

Espero que esto ayude a alguien :)