“make x face y”algorithm的奇怪行为(带video)

我知道,我知道,在互联网上有很多关于如何获得两个对象的中心之间的角度或“make x face y”的教程。

我有这个代码:

// (180 / PI = 57.3065) float AngleBetweenVectors(sf::Vector2f, sf::Vector2f); float AngleBetweenVectors(sf::Vector2f a, sf::Vector2f b){ return 57.3065f * atan2(by - ay, bx - ax); } 

那得到的角度,然后这个代码,我用来设置旋转:

 float angle = AngleBetweenVectors(player_p, cursor.getPosition()); player.setRotation(angle); 

player_p是玩家的中心位置(一个50×50的方形精灵), cursor是我使用的光标sf :: Sprite, player是玩家sf :: Sprite。

但是当我运行它时会遇到这样的问题: video在这里

正如你在地形边界看到的那样,有点棘手。 这是为什么? 我使用了两个视图,这是关于视图和绘图的主循环的代码:

 window.clear(sf::Color(0, 0, 0, 255)); window.setView(camera); // camera view // start drawing terrain.draw(); // terrain blocks window.draw(player); // player sprite window.setView(cursor_camera); // cursor view window.draw(cursor); // cursor sprite (the circular one) // end drawing logic window.display(); window.setMouseCursorVisible(false); // no mouse pointer please 

video中的玩家精灵是橙色的,黑色的圆圈是光标精灵。 玩家精灵通过鼠标移动通过WASD和光标精灵移动。 谢谢。

看起来你在混合坐标系统。 你的光标在屏幕上 你的球员在世界空间。 所以,当你向下移动几个屏幕时,玩家的Y值是2000,但是光标位置在0到1000之间,所以角度总是会回到屏幕上。

在计算它们之间的角度之前,将光标的位置转换为世界空间或玩家的位置到屏幕空间中。 您实际上不会更改基础值,只需计算转换后的值即可执行比较。

通常在2D自上而下的游戏中,屏幕空间和世界空间的区别就在于屏幕空间偏离了世界空间,代表摄像机移动到哪里。 所以坐标空间转换看起来像这样:

 sf::Vector2f screenToWorldSpace(sf::Vector2f screenPoint) { // Take a copy sf::Vector2f worldPoint(screenPoint); // Translate it based on the camera/screen's current offset worldPoint.x += camera.GetRect().Left; worldPoint.y += camera.GetRect().Top; // All done! return worldPoint; }