我是问答网站上的新手,所以如果我做的不好,请保持警惕。
我已经使用c ++和SFML玩了几周了,以制作一个小游戏(未完成),并且我试图通过用sprite替换它来定制鼠标光标。 但是,我使用的sf :: View调整了大小,以适应全屏中不同大小的屏幕,并移动以跟随角色,因此我在wiki上找到的教程不适用于我的情况。
我决定做一些数学运算,并编写了此函数来移动光标精灵:
void MyClass::updateCursor()
{
/*
Moves cursor so that it goes where it should be
*/
sf::View windowView = window.getView(); // Get window view
sf::Vector2f viewSize = windowView.getSize(); // Get view size
sf::Vector2f viewCenter = windowView.getCenter(); // Get view center
sf::Vector2u windowSize = window.getSize(); // Get window size
sf::Vector2i mousePosition = sf::Mouse::getPosition(window); // Get mouse position
cursor_sprite.setPosition( // Set cursor sprite position to what it should be
((double)mousePosition.x * ((double)viewSize.x) / (double)windowSize.x) + (double)viewCenter.x - (double)viewSize.x/2.f,
((double)mousePosition.y * ((double)viewSize.y) / (double)windowSize.y) + (double)viewCenter.y - (double)viewSize.y/2.f
);
window.draw(cursor_sprite);
}
但是,这似乎有点骇人听闻,可能有些迟钝,而且,要修复移动光标精灵的错误,我必须更改此提示:
cursor_sprite.setPosition( // Set cursor sprite position to what it should be
((double)mousePosition.x * ((double)viewSize.x) / (double)windowSize.x) + (double)viewCenter.x - (double)viewSize.x/2.f,
((double)mousePosition.y * ((double)viewSize.y) / (double)windowSize.y) + (double)viewCenter.y - (double)viewSize.y/2.f
);
为此(请注意第二行和第三行末尾的“ -16”):
cursor_sprite.setPosition( // Set cursor sprite position to what it should be
((double)mousePosition.x * ((double)viewSize.x) / (double)windowSize.x) + (double)viewCenter.x - (double)viewSize.x/2.f - 16,
((double)mousePosition.y * ((double)viewSize.y) / (double)windowSize.y) + (double)viewCenter.y - (double)viewSize.y/2.f - 16
);
编辑:修复了“ -16”问题:我使用的是32x32纹理,仅右下角填充了一些像素,现在我使用16x16的纹理。
您知道使用带有某些移动和缩放视图的自定义光标精灵的方法吗?