【问题标题】:SFML shape rotates infinitelySFML 形状无限旋转
【发布时间】:2020-02-13 12:32:01
【问题描述】:

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

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();
}

【问题讨论】:

  • 大部分代码应该移动到while (window.pollEvent(event))循环,所以它只在窗口接收到事件时执行。
  • 也不行
  • ang初始化为0。将transform.rotate(ang, WIDTH / 2, HEIGHT / 2);移动到ang += 1;之后

标签: c++ events keyboard sfml shapes


【解决方案1】:

现在,这条线

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 设置为一个恒定值,它就会以恒定速率旋转立方体。

【讨论】:

  • 为了澄清一点,sf::Transformable::rotate() 将角度添加到对象的当前旋转。如果想法是每次按下键盘键时将形状旋转一定角度,则不应增加ang。如果这样做,则每次按下键时角度会越来越大,从而导致形状旋转得越来越快。
  • 我的意思是,sf::Transform::rotate,但这是同一个想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多