2012-10-04 21 views
5

en cocos2d, el sistema de coordenadas es bastante sencillo .. abajo a la izquierda está (0,0). cada vez que establezco la posición de cualquier cosa está bien.Sistema de coordenadas Cocos2d

Digamos que una capa es TouchEnabled.

la hora de establecer la posición de mis sprites im, está bien ..

[crab setPosition:ccp(20, 50)]; 

pero si me da la coordenada X e Y de un toque (y supongo que hice clic en el sprite ..):

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"Touches began!"); 
    NSArray *touchArray = [touches allObjects]; 
    UITouch *one = [touchArray objectAtIndex:0]; 
    pointOne = [one locationInView:[one view]]; 
    CCLOG(@"points are: %f and %f", pointOne.x, pointOne.y); 
} 

la coordenada y es lo contrario de lo que sugiere el sistema de coordenadas de cocos2d a medida que la y aumenta de arriba hacia abajo.

im asumiendo que el sistema de coordenadas de la vista es diferente al sistema coord de mac ... lo cual es bastante contrario a la intuición ... ¿es eso correcto?

gracias!

Respuesta

4

OpenGL utiliza a (0, 0) de la parte inferior izquierda, mientras que iOS y por lo tanto UIKit que se ocupa de los toques utilizar la parte superior dejan como (0, 0) Es fácil convertir su punto, solo tiene que recordar hacerlo.

El método correcto en cocos2d 2.0 es

CGPoint uiKitPoint = [touch locationInView:touch.view]; 
CGPoint cocos2dPoint = [[CCDirector sharedDirector] convertToGL:uiKitPoint]; 
0

Cocos2D ya se puede manejar esto para usted. El CCDirector tiene algunos métodos para esto. Por favor, eche un vistazo a este antiguo post.

0

Normalmente, para la mayoría de las aplicaciones relacionadas con gráficos, hay una tendencia a colocar (0, 0) en la parte inferior izquierda (y este es el caso de la Mac), donde como en iOS, se coloca en la parte superior a la izquierda como habrás notado.

Cuando se está manejando de entrada con Cocos, puede convertir rápidamente de la llamada mediante el método deconvertTouchToNodeSpace (al menos con 1.x - Yo no he jugado lo suficiente con 2,0 - pero yo creo que es convertToNodeSpace allí de una verificación rápida de documentación). Esto hará las transformaciones necesarias para darle la coordenada correcta.

(NB: Tengo que desenterrar parte de mi otro código para verificarlo dos veces, pero no puedo recordar de antemano si esto también cuenta con compensaciones de cámara) Editaré cuando pueda a mi código de demostración & confirmar.)

0

Los toques vienen de UIKit, que arriba a la izquierda es (0,0) por lo que debe convertirlo al sistema de coordenadas de cocos2d antes de manejar con estos datos.

Hay

[[CCDirector sharedDirector] convertToGL]; 

Para UIKit -> cocos2d

+0

convertToNodeSpace convierte un punto que no está en el sistema de coordenadas de nodos actual en sí mismo. Por ejemplo, una coordenada mundial (pero aún en formato OpenGL) para el sistema de coordenadas de nodos. –

+0

Actualiza mi respuesta agregando el método converttogl – lukaswelte

+0

Todavía es incorrecto. Convertir al espacio del nodo no es para los puntos uikit –