Programación de juegos de goal-c para iPhone: detecta el toque en la capa de objetos del mapa de mosaicos

hola hice una capa de objeto en mi mapa de mosaicos con el editor de mapas de mosaicos como este:

http://i.stack.imgur.com/f5fZK.png

El cuadrado grande representa mi capa de objeto llamada: ObjectIt.

Mi problema es que cuando toco el cuadrado en el simulador, no corresponde al lugar correcto. Algunas personas me dijeron un problema con el valor flotante o el gl abierto, pero soy un novato y necesito respuestas claras.

Este es mi codigo:

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    NSLog(@"touch detect");
    CCNode* node = [self getChildByTag:TileMapNode];
    NSAssert([node isKindOfClass:[CCTMXTiledMap class]], @"not a CCTMXTiledMap");
    CCTMXTiledMap* tileMap = (CCTMXTiledMap*)node;
    // Get the position in tile coordinates from the touch location
    CGPoint touchLocation = [self locationFromTouches:touches];
    CGPoint tilePos = [self tilePosFromLocation:touchLocation tileMap:self.tileMap];
    // Check if the touch was on water (e.g., tiles with isWater property)
    bool isTouchOnWater = NO;


    CCTMXObjectGroup* objectLayer = [tileMap objectGroupNamed:@"ObjectIt"];
    bool isTouchInRectangle = NO;
    int numObjects = [objectLayer.objects count];
    for (int i = 0; i < numObjects; i++)
    {

        NSDictionary* properties = [objectLayer.objects objectAtIndex:i];
        CGRect rect = [self getRectFromObjectProperties:properties tileMap:tileMap];
        if (CGRectContainsPoint(rect, touchLocation))
        {
            isTouchInRectangle = YES;
            break; }
    }


    if (isTouchInRectangle)
    {

        NSLog(@"TOUCH IN RECTANGLE");
       // get the ALGORITH FOR TOWERS 
    }

}
-

(CGPoint) locationFromTouch:(UITouch*)touch
{
    CGPoint touchLocation = [touch locationInView: [touch view]];
    return [[CCDirector sharedDirector] convertToGL:touchLocation];
}

-(CGPoint) locationFromTouches:(NSSet*)touches
{
    return [self locationFromTouch:[touches anyObject]];
}

-(CGRect) getRectFromObjectProperties:(NSDictionary*)dict
                              tileMap:(CCTMXTiledMap*)tileMap
{
    float x, y, width, height;
    x = [[dict valueForKey:@"x"] floatValue] + tileMap.position.x;
    y = [[dict valueForKey:@"y"] floatValue] + tileMap.position.y;
    width = [[dict valueForKey:@"width"] floatValue];
    height = [[dict valueForKey:@"height"] floatValue];
    return CGRectMake(x, y, width, height);
}

Ese es el código, te daré más si lo necesitas.

Además: cuando corro en el iPhone tengo líneas negras verticales ...

preguntado el 27 de agosto de 11 a las 15:08

2 Respuestas

Para obtener la ubicación táctil correcta en los puntos Cocos2D, use este método de conveniencia CCNode:

- (CGPoint)convertTouchToNodeSpace:(UITouch *)touch
{
    CGPoint point = [touch locationInView: [touch view]];
    point = [[CCDirector sharedDirector] convertToGL: point];
    return [self convertToNodeSpace:point];
}

Respondido 27 ago 11, 19:08

SU TRABAJANDO THX MAN, pero todavía obtengo líneas negras verticales cuando muevo la pantalla de mi iPhone - hugo

No estoy seguro de si se ha agregado a la API desde que phix23 publicó su respuesta, pero el convertTouchToNodeSpace: El método básicamente hace lo mismo:

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    CCTMXTiledMap* tileMap = (CCTMXTiledMap*)[self getChildByTag:TileMapNode];

    CGPoint p = [tileMap convertTouchToNodeSpace:touch];

    // If you wanted to figure out which tile in a layer they touched (assuming
    // it's Ortho) you could do something like this:
    CCTMXLayer *layer = [tileMap layerNamed:@"Tile Layer 1"];
    CGPoint q = {
        (int) (p.x / tileMap.tileSize.width),
        // World origin is bottom left but map coordinates are top left so flip
        // the y.
        layer.layerSize.height - (int) (p.y / tileMap.tileSize.height) - 1
    };
    CCSprite *s = [layer tileAt:q];
    NSLog(@"Touched %@", s);

    return YES;
}

Respondido el 25 de diciembre de 11 a las 03:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.