2011-04-23 16 views
6

He estado buscando por un tiempo, y no he podido encontrar una respuesta a esto por alguna razón. Parece bastante simple, pero tal vez simplemente no puedo encontrar la función correcta en la biblioteca.Cocos2D CCNode posición en coordenadas de pantalla absoluta

Tengo una escena con una capa que contiene un grupo de CCNodes con cada CCSprite en ellos.

Durante la aplicación, me muevo alrededor de la posición de la capa principal, de modo que me "desplazo" alrededor de una cámara de una manera. (es decir, traduzco la capa completa para que la ventana gráfica cambie).

Ahora quiero determinar la posición absoluta de un CCNode en coordenadas de pantalla. La propiedad de posición devuelve la posición relativa al nodo padre, pero realmente me gustaría que se transformara en su posición real en la pantalla.

Además, como una ventaja adicional, sería increíble si pudiera expresar esta posición como sistema de coordenadas donde 0,0 se asigna a la esquina superior izquierda de la pantalla y 1,1 a la derecha de la pantalla. (Así que me mantengo compatible con todos los dispositivos)

Editar: Tenga en cuenta que la solución debería funcionar para cualquier jerarquía de CCNodes preferiblemente.

Respuesta

18

Cada CCNode, y los descendientes de los mismos, tiene un método llamado convertToWorldSpace: (CGPoint) p

Esto devuelve las coordenadas relativas a la escena.

Cuando tenga esta coordenada, voltee su eje Y, ya que quiere que 0,0 esté arriba a la izquierda.

CCNode * myNode = [[CCNode alloc] init]; 
myNode.position = CGPointMake(150.0f, 100.0f); 

CCSprite * mySprite = [[CCSprite alloc] init]; // CCSprite is a descendant of CCNode 
[myNode addChild: mySprite]; 
mySprite.position = CGPointMake(-50.0f, 50.0f); 

// we now have a node with a sprite in in. On this sprite (well, maybe 
// it you should attack the node to a scene) you can call convertToWorldSpace: 
CGPoint worldCoord = [mySprite convertToWorldSpace: mySprite.position]; 

// to convert it to Y0 = top we should take the Y of the screen, and subtract the worldCoord Y 
worldCoord = CGPointMake(worldCoord.x, ((CGSize)[[CCDirector sharedDirector] displaySizeInPixels]).height - worldCoord.y); 

// This is dry coded so may contain an error here or there. 
// Let me know if this doesn't work. 

[mySprite release]; 
[myNode release]; 

+0

Ah brilliant. Casi llegué por mi cuenta, error estúpido: no tomó la posición del sprite en sí, sino del nodo, que no funciona. Aparentemente. Pero esto es brillante, ya que también tiene en cuenta la escala y tal. Estupendo. Cinco estrellas para ti – Tovi7

+0

CCDirector no tiene displaySizeInPixels en versiones recientes de cocos2d. ¿Alguna solución para esto? (Encontrado 'winSizeInPixels', podría ser.) – Jonny

+1

Sé que esto es viejo, pero ¿es correcto que obtenga un worldCoord = (50, 200) (línea 6)? Esperaría worldCoord = (100, 150). Cuando paso, veo que tx = 100 y ty = 150 como la transformación ... ¿los ejes están cambiados? ¿Me estoy perdiendo algo obvio? – gdbj

Cuestiones relacionadas