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