2012-09-08 17 views
9

Soy principiante en Cocos2d. Tengo un sprite, y quiero ignorar el toque en el área transparente de ese sprite.¿Detectar parte transparente en el sprite en cocos2d?

Conozco de esta respuesta Cocos2d 2.0 - Ignoring touches to transparent areas of layers/sprites, y también este gran artículo http://www.learn-cocos2d.com/2011/12/fast-pixelperfect-collision-detection-cocos2d-code-1of2/.

Pude hacerlo funcionar con KKPixelMaskSprite, pero solo cuando sprite se usa desde el archivo, pero no desde el nodo de proceso por lotes. Cada vez que uso el nodo batch (hoja Sprite), para obtener sprite, deja de funcionar.

Tengo sprites diferentes el uno del otro, y quiero detectar de esta manera -> si el tacto está en el cuadro de limitación de sprite actual, ¿esa parte es transparente en sprite o no?

P.S.I estoy usando cocos2d 1.0. No quiero usar ningún motor de Física por ahora, solo quiero ignorar los toques en áreas transparentes de sprite (que se creó usando el nodo de proceso por lotes). ¿Cómo puedo hacer eso? ¿O podría haber alguna herramienta que pueda ser útil?

Gracias mucho por adelantado.

+0

Did u tratan CGPathRef? – Guru

+0

Creo que el enlace que mencionas es la solución perfecta. http://stackoverflow.com/questions/10889170/cocos2d-2-0-cajas-de-alto-de-transparencia-de-layers-sprites – user739711

+0

@ user739711 Lo he intentado, funcionó para mí solo para Sprites individuales, no para el nodo Batch. – User1234

Respuesta

3

Puede utilizar CGMutablePathRef a hacer la detección de colisiones de sprites no rectangular.

// comprobar

CGPoint loc =[mySprite convertToNodeSpace:touchPoint]; 

    if([mySprite isPointInsideMap:loc]) 
    { 
     //touched inside.. 
    } 

//Add this method in your MySprite class derived from CCSprite. 
-(bool)isPointInsideMap:(CGPoint)inPoint 
{ 
    if (CGPathContainsPoint(mCollisionPath, NULL, inPoint, NO)) 
    { 
     return true; 
    } 

    return false; 
} 

//// crear ruta

CGMutablePathRef mCollisionPath = CGPathCreateMutable(); 
CGPathMoveToPoint(mCollisionPath, NULL, 0, 0); 
CGPathAddLineToPoint(mCollisionPath, NULL, 11, 82); 
CGPathAddLineToPoint(mCollisionPath, NULL, 42, 152); 
CGPathAddLineToPoint(mCollisionPath, NULL, 86, 202); 
CGPathAddLineToPoint(mCollisionPath, NULL, 169, 13); 
CGPathCloseSubpath(mCollisionPath); 
+1

Gracias, esta solución funcionó para mí. – User1234

+0

@ User1234 :(:(:( – Guru

+0

¿Qué tiene de malo? – User1234

1

me gustaría tratar de cambiar la BoundingBox en su tacto es para mí, y reducirlo para los diferentes sprites ...

+0

Gracias, eso que estoy usando ahora, he ajustadoBoundingBox para cada sprite. Lo malo de eso, puede ser solo un rectángulo. Lo que sea gracias por la respuesta, +1 votos a favor. – User1234

2

Esta respuesta es más difusa de lo que cabría esperar, ya que no les daré un código ejemplo, pero así es como implementaría esto:

Tiene la ubicación del cuadro delimitador del elemento sprite (esquina del elemento, incluido el área de transparencia, si corresponde) y la posición del toque en la pantalla. Con esta información, puede calcular la ubicación del toque dentro de del sprite. En otras palabras, puede encontrar el píxel tocado, independientemente de la pantalla del juego.

Ahora que tiene esa ubicación de píxel (xey), abra la imagen (presumiblemente un PNG) y obtenga el valor RGB [A] para ese píxel. Cada PNG tiene una clave de transparencia. Este es el canal alfa Si el color del interior de píxeles del PNG en (x, y) == clave de la transparencia a continuación, ese píxel es transparente

Si se puede obtener el valor alfa para el píxel en cuestión, si es igual a 0, entonces el pixel es transparente.

de edición: la semántica ("canal alfa")

+0

Ya probé esas soluciones, está vinculado en mi pregunta, pero no pude hacer que funcione para el Nodo de proceso en lote. Gracias. – User1234

Cuestiones relacionadas