2011-06-07 21 views
10

El problema que tengo es que cada vez que cambio el punto de ancla, el sprite gira automáticamente con respecto al punto de anclaje actual. Y no quiero que eso suceda.Rotación de Cocos2D y punto de anclaje

Los pasos que he seguido

  1. crear un sprite con el punto de anclaje (0,5, 0,5)
  2. cambió el punto de anclaje a (0,1)
  3. girado el sprite a 90 grados. (Usando CCRotateBy. Sprite rotó correctamente)
  4. Cambié el punto de anclaje a (0.5, 0.5) (Todo está bien hasta ahora. Y esta es la posición que debo mantener). Ahora es sprite.rotation 90.
  5. he cambiado el punto de anclaje (1,0) (Sprite gira automáticamente a 90 grados con respecto al punto de anclaje dado - Necesito parar este comportamiento)

Es hay alguna manera de restablecer la rotación del sprite a 0, sin realmente rotar la textura (es decir, para mantener la textura en su forma actual - textura real girada a 90 grados) y cambiar el punto de anclaje o posición junto con el paso 4, para que Puedo continuar desde el punto 5.

+0

Podría publicar algo de código ... – Anish

Respuesta

9

Como dice Lukman, el punto de anclaje siempre afectará la rotación, ya que tu objetivo es poder especificar la posición del sprite con un punto de anclaje diferente de la rotación. Sugeriría hacer un CCNode vacío como padre de tu sprite.

De esta manera, puede establecer la posición en sprite relativa a este nodo padre para compensar el cambio de punto de anclaje y mantener el punto de anclaje para rotación en el sprite, pero use el nodo padre para la posición.

5

anchorPoint afecta tanto a position como a rotation. No puedes evitar que afecte a alguno de ellos.

Pero a partir de la lectura de su pregunta, ya que desea evitar anchorPoint afecte a la rotación, estoy asumiendo aquí que la razón por la que cambia el anchorPoint es para la posición, por ejemplo, se está configurando a ser ccp(1, 0) porque quiere a la esquina inferior derecha del sprite, en lugar del centro de sprites, para estar donde se establece la posición.

Mi sugerencia es: no cambie el anchorPoint en absoluto, pero cambie la forma en que establece la posición del sprite. Se puede utilizar esta pequeña función para ajustar la posición:

CGPoint adjustedPosition(const CGPoint position, const CGPoint anchor, const CGSize size) { 
    return CGPointMake(position.x - (anchor.x - 0.5) * size.width, position.y - (anchor.y - 0.5) * size.height); 
} 

Ahora, suponiendo que quisiera utilizar Anchorpoint de (1,0) cuando se hace el posicionamiento, en lugar de sprite.position = ccp(200, 300), sólo tiene que hacer:

sprite.position = adjustedPosition(ccp(200, 300), ccp(1.0, 0.0), sprite.contentSize); 

Si lo desea, publicaré la lógica detrás de las matemáticas más adelante. De lo contrario, espero que esto ayude.

1

Quizás te ayude a instalar un ancla para los sprites en la coordenada correcta.

 
void SetAnchorPosition(CCSprite * sprite, const CCPoint & point) 
{ 
    static CCSize winSize = CCDirector::sharedDirector()->getWinSize(); 

    double x = ((double)1/(double)winSize.width)*(double)point.x; 
    double y = ((double)1/(double)winSize.height)*(double)point.y; 

    sprite->setAnchorPoint(ccp(x,y)); 
    sprite->setPosition(point); 
} 
0

Puede añadir una línea en el método touchEnded como una alternativa contundente:

-(void)touchEnded:(UITouch *)touch withEvent:(UIEvent *)event{ 

    _yourSprite.rotation = 90; 

} 
Cuestiones relacionadas