2012-04-15 4 views
2

Я решил сделать изометрическую игру с использованием C++ и cocos2d-x. Каждая изометрическая плитка имеет координату X и Y, при этом 1 на плиту перемещается. Вот как я конвертирую плитку в координаты экрана.Преобразование изометрических координат

cocos2d::CCPoint WorldPos::convertToScreen(){ 
    cocos2d::CCPoint posScreen;; 
    posScreen.x=(this->x)*(TILE_WIDTH/2) + (this->y)*-TILE_HEIGHT; 
    posScreen.y=(this->x)*(TILE_HEIGHT/2) + (this->y)*(TILE_HEIGHT/2); 

    return posScreen; 
} 

Плитки все 40px wide и 20px tall.

Теперь мне нужна функция для преобразования этих координат мира (изометрических координат) обратно в координаты экрана. что-то вроде

WorldPos* WorldPos::convertToWorld(cocos2d::CCPoint &point) 

Я не могу показаться, чтобы выяснить это, я делаю это все неправильно, и я должен сделать позиционирование является способом или ти различным есть какое-то расчет, что я не могу понять?

+0

Просто сделайте расчет обратного. Вы попробовали это? – Mat

+0

Я пробовал, но я не мог заставить это работать правильно, как бы я инвертировал вычислить что-то вроде этого? – Kurt

ответ

0

Try:

WorldPos WorldPos::convertToWorld(cocos2d::CCPoint &point) { 
    int x = (point.x + 2*point.y)/40; 
    int y = (2*point.y - point.x)/40; 
    return WorldPos(x, y); 
} 

Логика:

Px = 20*Wx - 20*Wy 
Py = 10*Wx + 10*Wy, thus 

Px + 2*Py = 40*Wx -> Wx = (Px + 2*Py)/40 
Px - 2*Py = -40*Wy -> Wy = (2*Py - Px)/40 

где Px, Py, Wx, Wy являются CCpoint::x, CCPoint::y, WorldPos::x, WorldPos.y соответственно