2013-08-11 8 views
0

Я пытался разобраться в Knight Fight изометрической игры, сделанные Жека Tiled Map EditorПроблемы в игре Изометрические Плиточные с использованием cocos2d

Эта конкретная функция дает мне разные результаты, когда я открыл свежий проект и загрузить ту же карту.

-(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); 
} 

При подаче в tilePos, как (0,0), в борьбе с Knight

  1. трава Плитка положение: (1248, 1248)
  2. Окончательное местоположение, возвращенное функцией: (-1280, -1280)

при подаче в tilePos, как (0,0) в моем свежем проекте

  1. Grass положение плитки: (624, 624)
  2. Окончательное место, возвращенное функцией: (-656, -656)

Я не могу найти какой-либо ресурс в Интернете для изометрических Карты на Cocos2d помощью кафельной. Мне нужно преобразовать между координатами плитки и реальными координатами экрана. Может кто-нибудь помочь.

+2

Этот проект около года назад, и с помощью cocos2d-iphone v .99.5, который, я считаю, до того, как он получил поддержку устройств сетчатки. Вы можете попробовать обновить версию cocos2d и исправить возникающие проблемы (в этом случае я бы обновил до 1.1, а не 2.x, так как путь обновления проще) – Mark

+0

ОК, поэтому разница в значениях связана с более старыми cocos2d версия? Кроме того, вы могли бы указать мне любой ресурс, где я могу изучить изометрические карты с помощью Tiled и получить доступ к координатам в cocos2d. –

ответ

2

попробуйте следующее: // вычислить координаты экрана от плитки координат

- (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); 
} 
+0

float posX = (int) (invereseTileY + tilePosDiv.x - halfMapWidth); float posY = (int) (invereseTileY - tilePosDiv.x + halfMapWidth); Не получили эту часть –

+0

Это будут ваши координаты карты X и Y, рассчитанные по координатам экрана. –

+0

Я имел в виду, что я не мог правильно понять логику. Я полностью понял логику координат плитки для ортогональной карты. Я получил ту часть, где мы разделили координату касания на ширину плит шириной n. Но следующий шаг - это то, чего я не получу. –