1

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

4

3 回答 3

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 来进行补偿。

于 2014-07-16T20:40:50.243 回答
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...
于 2013-01-20T04:03:51.597 回答
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;
}
于 2016-11-14T22:29:07.537 回答