цель-c программирование игр для iPhone: обнаружение касания на слое объекта карты тайлов - PullRequest
0 голосов
/ 27 августа 2011

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

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

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

Моя проблема в том, что когда я касаюсь квадрата в симуляторе, он не соответствует нужному месту. Некоторые люди говорили мне о проблеме со значением float или open 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, у меня появляются вертикальные черные линии ...

Ответы [ 2 ]

1 голос
/ 27 августа 2011

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

- (CGPoint)convertTouchToNodeSpace:(UITouch *)touch
{
    CGPoint point = [touch locationInView: [touch view]];
    point = [[CCDirector sharedDirector] convertToGL: point];
    return [self convertToNodeSpace:point];
}
0 голосов
/ 24 декабря 2011

Я не уверен, был ли он добавлен в 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;
}
...