最近我一直在用C ++做一个测试“游戏”(与SFML一起使用)。我制作了一个超级马里奥精灵,如下所示
sf::Texture SuperMarioAnim;
if (!SuperMarioAnim.loadFromFile("img/image.png"))
{
std::wcout << L"Συγγνώμη, η εικόνα SuperMarioAnim δεν υπάρχει ή διαγράφηκε";
}
sf::Sprite SuperMario;
SuperMario.setTexture(SuperMarioAnim);
SuperMario.setPosition(200, 2900);
我还制作了一个player_speed整数,显然是玩家的速度值,我还创建了一个等于我们从clock.getElapsedTime()
得到的值的时间对象:< / p>
int player_spd = 30;
while (window.isOpen())
{
//...
sf::Time time;
time = clock.getElapsedTime();
//...
}
然而,当我告诉精灵在X轴上移动时:
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
SuperMario.move(sf::Vector2f((player_spd * time), 0));
我收到此错误:1>c:\[directory]\visual studio 2017\projects\test_game\test_game\test_game.cpp(180): error C2593: 'operator *' is ambiguous
(第180行是上面的SuperMario.move命令)
有人可以说明我做错了什么吗?我正在使用Visual Studio 2017和SFML 2.4
答案 0 :(得分:4)
sf::Time
定义operator*
1 的这些重载:
Time operator* (Time left, float right)
//Overload of binary * operator to scale a time value.
Time operator* (Time left, Int64 right)
//Overload of binary * operator to scale a time value.
Time operator* (float left, Time right)
//Overload of binary * operator to scale a time value.
Time operator* (Int64 left, Time right)
//Overload of binary * operator to scale a time value.
错误表示重载决策失败,因为它无法在它们中进行选择。 player_spd
是int
。调用operator*
需要将其转换为float
或Int64
。两者都不比另一个好(根据错误信息)。所以这很模糊。
您可以投射或仅定义player_spd
作为sf::Time
可以乘以的类型之一。
答案 1 :(得分:3)
'clock.getElapsedTime()'返回'Time'对象。您可以选择将“Time”对象中的float返回为“asSeconds()”,“asMilliseconds()”或“asMicroseconds()”。我相信这会解决你的错误,但我无法测试我的结果。我还建议将'player_spd'更改为浮点数。
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
SuperMario.move(player_spd * time.asSeconds()), 0));
祝你好运!