按下2个箭头键时实现对角线移动(使用SFML)

时间:2013-01-20 03:50:55

标签: c++ sfml

我不认为任何代码演示是必要的,因为它不是很多SFML,因为它是C ++。问题是,如何通过我在屏幕上显示的东西实现平滑运动?例如,我在屏幕上显示一个正方形,并将其位置变量设置为我之前定义的整数,以便我可以使用箭头键移动它。当我按下为变量添加值的键时,如果我只使用一个键,它可以正常工作,但是当按下两个键时,它只会添加到第二个按下的值。我怎么能这样做它对角移动?

3 个答案:

答案 0 :(得分:3)

伪代码

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

答案 1 :(得分:3)

接受的答案并不是很好。

最好分别存储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 :(得分:0)

这对我有用,但就像你说玩家可以通过拥有更现代的电脑获得不公平的优势。我采用了变量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;
}