运算符'*'含糊不清(C ++)

时间:2017-12-28 22:13:02

标签: c++ sfml

最近我一直在用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

2 个答案:

答案 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_spdint。调用operator*需要将其转换为floatInt64。两者都不比另一个好(根据错误信息)。所以这很模糊。

您可以投射或仅定义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));
祝你好运!