У меня есть сцена, которая следует за спрайтом (игроком) с помощью:
auto followTheSprite = Follow::create(m_box, Rect::ZERO);
this->runAction(followTheSprite);
это нормально, я также хочу повернуть точку спрайта на курсор мыши, затем я добавил
EventListenerMouse by:
auto mouseListener = EventListenerMouse::create();
mouseListener->onMouseMove = CC_CALLBACK_1(HelloWorld::onMouseMove, this);
в моем HelloWorld :: onMouseMove я написал это:
void HelloWorld::onMouseMove(cocos2d::Event* event){
if (m_box) {
EventMouse* mouseEvent = (EventMouse*)event;
cocos2d::Vec2 tankPosition = m_box->getPosition();
cocos2d::Vec2 cursorPosition = mouseEvent->getLocation();
Vec2 diff = cursorPosition - tankPosition;
float angle = atan2f(diff.y, diff.x)*(180/3.1416)
m_box->setRotation(angle);
}
}
это не работает нормально, при первом запуске игры, когда начальная точка моего спрайта (640, 480), в этот момент cursorPosition показывает мне правильные значения, на мой взгляд, Я имею в виду, что диапазон значений соответствует размеру экрана и ориентации моего спрайта, наведите курсор на курсор мыши и следуйте по нему, если он перемещается по экрану, например, я показываю, но когда спрайт начинает перемещаться по миру и он ушел от начальной точки, спрайт не указывает на курсор, и значения, которые я получил от курсора, не имеют смысла для меня, я должен показать значения, аналогичные tankPosition , но полученные значения, такие как начальные значения, я могу думать, что значения курсора относятся к экрану, а не к миру, но я не уверен, что это правильно, и я пытаюсь использовать:
Director::getInstance()->ConverteToGL(cursorPosition)
но полученные значения похожи на cursorPosition без использования ConverteToGL .
РЕШЕНИЕ:
Это решение также можно найти по адресу:
https://discuss.cocos2d -x.org / т /, как к-получить правильный вектор--для-cursorposition-в-сценах, что последующие-спрайт / 46789
Я решил эту проблему, используя tankPosition и cursorPosition в координатах экрана:
void HelloWorld::onMouseMove(cocos2d::Event* event){
if (m_box) {
EventMouse* mouseEvent = (EventMouse*)event;
Vec2 tank = convertToWindowSpace(m_box->getPosition());
Vec2 cursorPosition = mouseEvent->getLocationInView();
Vec2 diff2 = cursorPosition - tank;
float angle = atan2f(diff2.y, diff2.x) * (180 / 3.1416);
m_box->setRotation(angle*-1 + 90);
}
}
Теперь мой код работает так же, как я.