【问题标题】:Achieving diagonal movement when 2 arrow keys are pressed (with SFML)按下 2 个箭头键时实现对角线移动(使用 SFML)
【发布时间】:2013-01-20 03:50:55
【问题描述】:

我认为不需要任何代码演示,因为它不像 C++ 那样多 SFML。问题是,我如何通过在屏幕上播放的东西来实现流畅的移动?例如,我在屏幕上显示一个正方形,并将它的位置变量设置为我之前定义的整数,以便我可以用箭头键移动它。当我按下向变量添加值的键时,如果我只使用一个键,它就可以正常工作,但是在按下两个键时,它只会添加到第二次按下的值。我将如何使它对角线移动?

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    接受的答案不是那么好。

    最好分开存储 x 和 y 移动,检查所有已按下的键,然后分配实际移动。

    x = 0.0;
    y = 0.0;
    speed = 1.0;
    
    if (key.up())
    {
      y -= speed;
    }
    
    if (key.down())
    {
      y+= speed;
    }
    
    if (key.left())
    {
      x -= speed;
    }
    
    if (key.right())
    {
      x+= speed;
    }
    
    Move(x, y);
    

    这应该让你开始。

    当您深入研究它时,您会注意到这段代码有点怪癖 - 如果您沿对角线移动,您会发现您移动得太快并且有点作弊!这是因为增加了两个速度单位,而不仅仅是一个。您可能认为解决方案是将每个值减半,但这样您就太迟钝了。当您沿对角线移动时,您需要考虑三角形和毕达哥拉斯定理 - 您需要通过将两个方向除以根 2 来进行补偿。

    【讨论】:

      【解决方案2】:

      伪代码

      if (key.up())
      {
          if (key.right())
              direction = up_right;
          else if (key.left())
              direction = up_left;
          else
              direction = up;
      }
      else if (key.down())
      {
          etc...
      

      【讨论】:

        【解决方案3】:

        这对我有用,但就像你说的那样,玩家可以通过拥有更现代的计算机获得不公平的优势。我取了变量 x 和 y 的平方根,但我不确定这是否能防止任何形式的不必要作弊。

        float x = 0.0;
        float y = 0.0;
        float speed = 0.35;
        
        x = std::sqrt(std::pow((double)x, 2) + std::pow((double)y, 2));
        y = std::sqrt(std::pow((double)x, 2) + std::pow((double)y, 2));
        
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
        {
                source.y = Up;
                y -= speed;
        }
        
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        {
                source.y = Down;
                y += speed;
        }
        
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
        {
                source.y = Left;
                x -= speed;
        }
        
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
        {
                source.y = Right;
                x += speed;
        }
        
        playerImage.move(x, y);
        

        我的事件循环之后还有一个实例,它将帧计数器与时钟和帧速度进行比较。我的问题是,这个块是否会对上述代码产生影响,可能会阻止作弊,如果是,我会删除 sqrt 语句吗?

        frameCounter = (updateFrame) ? frameCounter + frameSpeed * clock.restart().asSeconds() : 0;
        
        if(frameCounter >= switchFrame)
        {
                frameCounter = 0;
                source.x++;
                if(source.x * 32 >= pTexture.getSize().x)
                        source.x = 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-04
          • 2019-10-27
          • 1970-01-01
          相关资源
          最近更新 更多