我有一个场景,使用以下内容可以跟随子画面(玩家)
auto followTheSprite = Follow::create(m_box, Rect::ZERO);
this->runAction(followTheSprite);
这很好,我还想将精灵点旋转到鼠标光标,然后我添加了 一个EventListenerMouse方式:
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/t/how-to-get-correct-vector-for-cursorposition-in-scenes-that-follow-sprite/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);
}
}
现在我的代码可以正常运行了。