-(CGPoint) tilePosFromLocation:(CGPoint)location tileMap:(CCTMXTiledMap*)tileMap { // Tilemap position must be subtracted, in case the tilemap position is not at 0,0 due to scrolling //如果是retina屏幕,需要将像素乘2 CGPoint pos = ccpSub(location, tileMap.position); float halfMapWidth = tileMap.mapSize.width * 0.5f; 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 inverseTileY = mapHeight - tilePosDiv.y; // Cast to int makes sure that result is in whole numbers, tile coordinates will be used as array indices float posX = (int)(inverseTileY + tilePosDiv.x - halfMapWidth); float posY = (int)(inverseTileY - tilePosDiv.x + halfMapWidth); // make sure coordinates are within isomap bounds posX = MAX(0, posX); posX = MIN(tileMap.mapSize.width - 1, posX); posY = MAX(0, posY); posY = MIN(tileMap.mapSize.height - 1, posY); pos = CGPointMake(posX, posY); CCLOG(@"touch at (%.0f, %.0f) is at tileCoord (%i, %i)", location.x, location.y, (int)pos.x, (int)pos.y); //CCLOG(@"\tinverseY: %.2f -- tilePosDiv: (%.2f, %.2f) -- halfMapWidth: %.0f\n", inverseTileY, tilePosDiv.x, tilePosDiv.y, halfMapWidth); return pos; }
算法的解释:http://www.gandraxa.com/isometric_projection.xml