CCTMXTiledMap触摸检测有点偏

时间:2012-04-24 04:42:21

标签: objective-c cocos2d-iphone

我使用了www.raywenderlich.com的瓷砖教程。我在横向视图中设置了一个平铺地图,并使用教程中的代码来检测触摸,如下所示:

    CGPoint touchLocation = [touch locationInView: [touch view]];       
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];

并使用此位来确定它所在的图块:

    CGPoint touchTilePos = [self tileCoordForPosition:touchLocation];
    int tileIndex = [self tileIndexForTileCoord:(touchTilePos)];
    CCSprite *touchTile = [self.background tileAt:touchTilePos];
    self.player.position = [touchTile.parent convertToWorldSpace:touchTile.position];

问题是它有点偏。靠近左侧的触摸相当接近,但靠近右侧的触摸向左侧检测到。看起来像某种缩放问题,但我的代码中唯一的缩放是播放器精灵。

有什么想法吗?建议? 非常感谢任何halp!

编辑:这是代码中引用的两个方法:

- (CGPoint) tileCoordForPosition:(CGPoint)position 
{
    int x = position.x / _tileMap.tileSize.width;
    int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - position.y) / _tileMap.tileSize.height;
    return ccp(x, y);  
}

- (int) tileIndexForTileCoord:(CGPoint)aTileCoord
{
    return aTileCoord.y*(self.tileMap.mapSize.width) + aTileCoord.x;
}

更新: 我简化了代码:

CGPoint touchLocation = [touch locationInView: [touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
touchLocation = [self.background convertToNodeSpace:touchLocation];

int x = touchLocation.x / _tileMap.tileSize.width;
int y = ((_tileMap.mapSize.height * _tileMap.tileSize.height) - touchLocation.y) / _tileMap.tileSize.height;
CGPoint touchTilePos = ccp(x,y);

另外,我注意到一开始,touchLocation在左边,我不认为这个代码适用于我的情况(iPad /横向):

CGPoint touchLocation = [touch locationInView: [touch view]];

2 个答案:

答案 0 :(得分:2)

我犯了一个致命的错误!我使用HEX瓷砖,它们重叠一点(约1/4)。我必须考虑到这一点!这就是为什么随着我向右走,效果会变得更糟, 以下是修复它的代码:

    int x = (touchLocation.x - tileSize.width/8) / (_tileMap.tileSize.width * (3.0/4.0)) ;
    int y = 0;
    if(x % 2 == 0)
    {
        // even
        y = ((_tileMap.mapSize.height * tileSize.height) - touchLocation.y) / tileSize.height;
    }
    else
    {
        // odd
        y = ((_tileMap.mapSize.height * tileSize.height) - (touchLocation.y + tileSize.height/2)) / tileSize.height;
    }
    CGPoint touchTilePos = ccp(x,y);

干杯!

答案 1 :(得分:0)

教程代码看起来应该可以正常工作。我使用的数学代码与一致/正确的结果相同。

我唯一的建议是加倍确定此行中的self对象: touchLocation = [self convertToNodeSpace:touchLocation];是TMXMap的实际直接父节点。

在我的代码中,CCLayer不是直接的父代,所以我最终明确地标记了我的地图的父节点,所以我可以像这样抓住它:

CCNode *parentNode = [self getChildByTag:kTagParentNode];
CGPoint worldPt = [parentNode convertToNodeSpace:touchLocation];