如何知道一个点是否在等轴测图上的可玩区域内?

时间:2014-02-28 18:46:28

标签: iphone objective-c ipad cocos2d-iphone

使用cocos2d平铺地图,我需要知道是否在等轴测图中完成了触摸。等距地图有钻石形状。

当我设置一个新位置时,我会使用最小值,最大值,但因为它是钻石形状...不能确定是否在地图内..

如果空间是正方形,这将是验证器,但由于这是钻石,它将无法工作。

-(CGPoint)validateInsideMap:(CGPoint)position{
    int x,y;
    x = MAX(_tileMap.mapSize.width * _tileMap.tileSize.width , position.x);
    x = MIN(0, x);
    y = MAX(_tileMap.mapSize.height * _tileMap.tileSize.height , position.y);
    y = MIN(0, y);
    return ccp(x, y);
}

任何建议?

1 个答案:

答案 0 :(得分:0)

如果触摸在地图内部,以像素为单位计算有点复杂,所以我只需要将像素位置转换为平铺系统,然后只需验证平铺在地图范围内,否则返回最近的一个

这是用这个算法做的:

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

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


    float posX = (int)(invereseTileY + tilePosDiv.x - (_tileMap.mapSize.width*0.5));
    float posY = (int)(invereseTileY - tilePosDiv.x + (_tileMap.mapSize.width*0.5));

    posX=MAX(0, posX);
    posX=MIN(_tileMap.mapSize.width - 1, posX);
    posY=MAX(0, posY);
    posY=MIN(_tileMap.mapSize.height - 1, posY);

    return CGPointMake(posX, posY);
}

这样一来,地图边界内总会有一块瓷砖,所以如果触摸在外面就没问题了