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