我使用了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]];
答案 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];