Привет, создал объектный слой на моей тайловой карте с помощью такого редактора тайловых карт:

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

Большой квадрат представляет мой объектный слой с именем: ObjectIt.

Моя проблема в том, что когда я касаюсь квадрата в симуляторе, он не соответствует нужному месту. Некоторые люди говорили мне о проблеме с плавающим значением или открытием gl, но я нуб, мне нужны четкие ответы.

Это мой код:

-(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);
}

Это код, я дам вам больше, если вам нужно.

Также: когда я бегаю на iPhone, у меня появляются вертикальные черные линии ...

0
hugo 27 Авг 2011 в 19:22

2 ответа

Лучший ответ

Чтобы получить правильное местоположение касания в точках Cocos2D, используйте этот удобный метод CCNode:

- (CGPoint)convertTouchToNodeSpace:(UITouch *)touch
{
    CGPoint point = [touch locationInView: [touch view]];
    point = [[CCDirector sharedDirector] convertToGL: point];
    return [self convertToNodeSpace:point];
}
1
Felix 27 Авг 2011 в 15:32

Я не уверен, был ли он добавлен в API с тех пор, как phix23 опубликовал свой ответ, но метод convertTouchToNodeSpace: в основном делает то же самое:

-(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;
}
0
drewish 24 Дек 2011 в 23:40