【问题标题】:Problems in Isometric Tiled game using cocos2d使用 cocos2d 的等距平铺游戏中的问题
【发布时间】:2013-08-11 19:03:58
【问题描述】:

我一直在尝试理解使用 Tiled Map Editor 制作的 Knight Fight 等距游戏

当我打开一个新项目并加载相同的地图时,这个特殊的功能给了我不同的结果。

-(CGPoint) locationFromTilePos:(CGPoint)tilePos;
{
    CCTMXLayer *grass = [self.tileMap layerNamed:@"Grass"];
    CCSprite *tile = [grass tileAt:tilePos];
    float x = -tile.position.x - self.tileMap.tileSize.width + 32;
    float y = -tile.position.y - self.tileMap.tileSize.height;
    return CGPointMake(x, y);
}

在 Knight Fight 中以 (0,0) 的形式输入 tilePos 时

  1. 草砖位置:(1248, 1248)
  2. 函数返回的最终位置:(-1280,-1280)

在我的新项目中以 (0,0) 形式输入 tilePos 时

  1. 草砖位置:(624, 624)
  2. 函数返回的最终位置:(-656,-656)

我无法在 Cocos2d 上使用 Tiled 找到任何在线等距地图资源。我需要在平铺坐标和真实屏幕坐标之间进行转换。谁能帮忙。

【问题讨论】:

  • 该项目大约有一年的历史,并且正在使用 cocos2d-iPhone v .99.5 ,我相信这是在它支持视网膜设备之前。您可以尝试升级 cocos2d 版本,并修复出现的问题(在这种情况下,我会升级到 1.1,而不是 2.x,因为升级路径更容易)
  • 好的,所以值的差异是因为旧的 cocos2d 版本?另外,能否请您指出我可以使用 Tiled 研究等距地图并访问 cocos2d 中的坐标的任何资源。

标签: iphone ios cocos2d-iphone isometric


【解决方案1】:

试试这个: // 根据图块坐标计算屏幕坐标

- (CGPoint)positionForTileCoord:(CGPoint)pos {

float halfMapWidth = _tileMap.mapSize.width*0.5;
float halfMapHeight = _tileMap.mapSize.height*0.5;
float tileWidth = _tileMap.tileSize.width;
float tileHeight = _tileMap.tileSize.height;

int convertedY = _tileMap.mapSize.height-(pos.y-1);

int x = halfMapWidth*tileWidth + tileWidth*pos.x*0.5-tileWidth*pos.y*0.5;
int y = halfMapHeight*tileHeight +tileHeight*convertedY*0.5 - tileHeight*pos.x*0.5-tileHeight*0.5;


return ccp(x, y);

}

反之,试试这个:

// calculating the tile coordinates from screen location

-(CGPoint) tilePosFromLocation:(CGPoint)location
{
CGPoint pos = location;
float halfMapWidth = _tileMap.mapSize.width*0.5;
float mapHeight = _tileMap.mapSize.height;
float tileWidth = _tileMap.tileSize.width;
float tileHeight = _tileMap.tileSize.height;

CGPoint tilePosDiv = CGPointMake(pos.x/tileWidth, pos.y/tileHeight);
float invereseTileY = mapHeight - tilePosDiv.y;

// Cast int to make sure that result is in whole numbers

float posX = (int)(invereseTileY + tilePosDiv.x - halfMapWidth);
float posY = (int)(invereseTileY - tilePosDiv.x + halfMapWidth);

return CGPointMake(posX, posY);
}

【讨论】:

  • float posX = (int)(invereseTileY + tilePosDiv.x - halfMapWidth);浮动 posY = (int)(invereseTileY - tilePosDiv.x + halfMapWidth);没有得到这部分
  • 这些将是您的 X 和 Y 平铺地图坐标,根据屏幕坐标计算得出。
  • 我的意思是我无法正确理解逻辑。我完全理解了正交地图平铺坐标背后的逻辑。我得到了我们将触摸坐标除以平铺宽度 n 高度的部分。但下一步是我没有得到的。
  • halfMapWidth 部分是由于地图是 skued 的,如果你在纸上绘制它,你会看到它是如何出现的,因为例如在 x 轴上移动时,你是也向下移动 Y 屏幕坐标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多