He estado ocupado durante unos días tratando de entender cómo manejar el tacto en mi proyecto Cocos2d. La situación es un poco diferente, como es normal. Tengo un par de capas de juego diferentes que tienen elementos en él que tengo que controlar con un toque:Cocos2d manejo táctil con varias capas
- ControlLayer: Mantiene el juego controla (movimiento, botón de acción). Esta capa está en la parte superior.
- GameplayLayer: Sostiene los objetos del juego (CCSprites). Esta capa está directamente debajo del ControlLayer.
Ahora mis toques funcionan bien en el ControlLayer, puedo mover mi personaje jugable y hacer que salte y haga otras tonterías. Sin embargo, no puedo entender cómo implementar los toques en algunos de mis CCSprites.
La información que he reunido hasta ahora me hace pensar que necesito obtener toda mi entrada táctil desde la capa de control. Luego, de alguna manera, necesito 'poner en cascada' la información táctil en GameplayLayer para poder manejar la entrada allí. Otra opción sería que obtuviera la información de CGRect de mis sprites de alguna manera creando una matriz con punteros a los objetos que deberían ser tocados. Debería poder usar esa información en el ControlLayer para verificar cada ítem en esa lista si se tocó el ítem.
¿Cuál es la mejor opción para hacer esto y cómo lo implemento? Soy un poco nuevo en la programación con Cocoa y Objective C, así que no estoy seguro de cuál es la mejor opción para este idioma y cómo acceder a la información de sprites CGRect ([mySpriteName boundingBox]) en otra clase y luego a la capa que está prestados en.
Por el momento, la única manera en que estoy seguro de hacerlo funcionar es crear CGRects duplicados para cada posición de CCSprite y poder consultarlos, pero sé que esta no es la manera correcta de hacerlo.
Lo que tengo hasta el momento (a prueba) es la siguiente: ControlLayer.m
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
CGRect rect = CGRectMake(0.0f, 0.0f, 100.0f, 100.0f);
//Tried some stuff here to get see if I could get a sprite by tagname so I could use it's bounding box but that didn't work
// Check for touch with specific location
if (CGRectContainsPoint([tree boundingBox], location)) {
CCLOG(@"CGRect contains the location, touched!");
}
CCLOG(@"Layer touched at %@", NSStringFromCGPoint(location));
}
Gracias de antemano por ayudarme!
Muchas gracias, me ayudaron a descubrir lo que hice mal y ahora estoy positivamente obteniendo respuesta táctil en mis objetos. –
Gracias por esta excelente explicación. Me ayudo mucho. La mejor respuesta a este tema que he encontrado hasta ahora. –
'[CCTouchDispatcher sharedDispatcher]' está en desuso. Puede usar '[[CCDirector sharedDirector] touchDispatcher]' en su lugar. – Hlung