1

アイソメトリック CCTMXTiledMap を CCLayerPanZoom コントロールに配置し、タッチ位置を ISO タイルマップ座標に変換するコードに取り組んでいます。CClayerPanZoom のスケールが 1 である限り (つまり、ズームインまたはズームアウトしない場合)、これはすべて完全にうまく機能します。マップをパンしても、正しい iso タイルの座標を計算できます。ただし、タイル マップをズームインまたはズームアウトするとすぐに、コードによって返される等座標が完全に間違っています。タッチ位置から等座標を計算するコードについては、以下を参照してください。

-(CGPoint) tilePosFromLocation:(CGPoint)location tileMap:(CCTMXTiledMap*)thisTileMap panZoom:(CCLayerPanZoom*)thisPanZoom
{   
float midScale = (thisPanZoom.minScale + thisPanZoom.maxScale) / 2.0;

float newScale = (thisPanZoom.scale <= midScale) ? thisPanZoom.maxScale : thisPanZoom.minScale;
if (thisPanZoom.scale < 1)
{        
    newScale = newScale + thisPanZoom.scale;
}
else
{
    newScale = newScale - thisPanZoom.scale;
}

CGFloat deltaX = (location.x  - thisPanZoom.anchorPoint.x * (thisPanZoom.contentSize.width / CC_CONTENT_SCALE_FACTOR()) ) * (newScale);
CGFloat deltaY = (location.y  - thisPanZoom.anchorPoint.y * (thisPanZoom.contentSize.height / CC_CONTENT_SCALE_FACTOR()) ) * (newScale);

CGPoint position = ccp((thisPanZoom.position.x - deltaX) , (thisPanZoom.position.y - deltaY) );

float halfMapWidth = thisTileMap.mapSize.width * 0.5f;
float mapHeight = thisTileMap.mapSize.height;
float tileWidth = thisTileMap.tileSize.width / CC_CONTENT_SCALE_FACTOR() * newScale;
float tileHeight = thisTileMap.tileSize.height / CC_CONTENT_SCALE_FACTOR() * newScale;

CGPoint tilePosDiv = CGPointMake(position.x / tileWidth, position.y / tileHeight );
float inverseTileY = tilePosDiv.y - (mapHeight * CC_CONTENT_SCALE_FACTOR()) * newScale; //mapHeight + tilePosDiv.y;

float posX = (int)(tilePosDiv.y - tilePosDiv.x + halfMapWidth);
float posY = (int)(inverseTileY + tilePosDiv.x - halfMapWidth + mapHeight);


// make sure coordinates are within isomap bounds
posX = MAX(0, posX);
posX = MIN(thisTileMap.mapSize.width - 1, posX);
posY = MAX(0, posY);
posY = MIN(thisTileMap.mapSize.height - 1, posY);

return CGPointMake(posX, posY);
}

これでどこが間違っているのか、誰かが洞察を提供できますか?

ありがとう、アラン

4

0 に答える 0