SFML形状无限旋转

3

我正在制作一个机器人臂,它可以在图形中移动,但当我尝试使用键盘旋转形状时,它会无限旋转:我希望在按下右箭头时只旋转一次。我该如何解决这个问题?

Transform transform;    
while (window.isOpen())
{
    Event event;
    while (window.pollEvent(event))
    {
        if (event.type == Event::Closed)
            window.close();

    }
    if (event.type == Event::KeyPressed)
    {
        switch (event.key.code)
        {
        case Keyboard::Right:
            ang += 1;
        }
    }

    window.clear(Color::White);
    window.draw(braccio, transform);
    transform.rotate(ang, WIDTH / 2, HEIGHT / 2);
    window.draw(assi);
    window.display();
}

1
大部分代码应该移动到 while (window.pollEvent(event)) 循环中,这样只有在窗口接收到事件时才会执行。 - Ripi2
也不起作用 - Gian Marco Cialdi
1
ang初始化为0。将transform.rotate(ang, WIDTH / 2, HEIGHT / 2);移动到ang += 1;之后。 - Jeffrey
1个回答

4

现在,这一行

transform.rotate(ang, WIDTH / 2, HEIGHT / 2);

这个函数被称为程序的每一帧都要运行,因为它在主循环中运行不间断。如果你只希望在游戏检测到某些输入时才运行它,那么把它放在事件轮询内部,像这样:

while (window.pollEvent(event))
{
    // Do your event handling in here, input, etc.

    if (event.type == Event::Closed)
        window.close();

    // This event case should also be inside here.
    if (event.type == Event::KeyPressed)
    {
        switch (event.key.code)
        {
            case Keyboard::Right:
                transform.rotate(ang, WIDTH / 2, HEIGHT / 2); 
                break;
        }
    }
}

否则你的手臂将无限制地继续旋转。
编辑:感谢 @alseether 指出 Transform::rotate 函数会将角度加到形状的当前旋转角度上。所以每次增加 ang 将使形状逐渐旋转得越来越快…… 如果您不想这样发生,只需将ang设置为一个常量值,它将以恒定速度旋转立方体。

2
只是为了澄清一下,sf::Transformable::rotate()会将角度添加到对象的当前旋转角度中。如果想要在每次按键时将形状旋转一定角度,就不应该增加ang。如果这样做,角度会随着按键的次数增加而越来越大,导致形状旋转得越来越快。 - alseether
2
我的意思是sf::Transform::rotate,但是这个想法是一样的。 - alseether

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接