【发布时间】:2013-05-13 21:24:54
【问题描述】:
我带着另一个问题回来了。我还是 SFML 的新手,所以这个看起来有点难。我曾尝试使用 while 循环等,但无济于事。
我目前正在做的游戏是一辆汽车在 X 轴上来回移动,然后我想将能够拾取点和东西,或者只是避免物体靠近汽车,直到它最终死亡。
如何使运动更流畅?目前,汽车将首先移动 8 个单位,然后向所需方向移动 8 个单位,直到我松开按钮。当我用另一种方式做的时候也是一样的。我希望它在我按下任一键时立即移动并继续移动。
static void OnKeyPressed(object sender, EventArgs e)
{
Vector2f newPos = new Vector2f(0, car.Position.Y);
KeyEventArgs ke = (KeyEventArgs)e;
if (ke.Code.Equals(Keyboard.Key.A))
{
if (car.Position.X != 0)
{
newPos.X = car.Position.X - 8;
car.Position = newPos;
}
else if (car.Position.X < 0)
{
newPos.X = 0;
car.Position = newPos;
}
else if(car.Position.X == 0)
{
// Do nothing
}
}
else if (ke.Code.Equals(Keyboard.Key.D))
{
if (car.Position.X != window.Size.X - 32)
{
newPos.X = car.Position.X + 8;
car.Position = newPos;
}
else if (car.Position.X > window.Size.X)
{
newPos.X = window.Size.X;
car.Position = newPos;
}
else if (car.Position.X == window.Size.X)
{
// Do nothing
}
}
}
以及整件事供参考:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SFML.Audio;
using SFML.Graphics;
using SFML.Window;
namespace SFMLCarGame
{
class Program
{
private static RenderWindow window;
private static Sprite car;
static void Main(string[] args)
{
window = new RenderWindow(new VideoMode(256,512), "Car Game");
window.Closed += new EventHandler(OnClose);
window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);
Sprite bg = new Sprite(new Texture("road.png"));
car = new Sprite(new Texture("car.png"));
car.Position = new Vector2f(window.Size.X / 2, window.Size.Y - 96);
while (window.IsOpen())
{
window.DispatchEvents();
window.Clear();
window.Draw(bg);
window.Draw(car);
window.Display();
}
}
static void OnClose(object sender, EventArgs e)
{
RenderWindow window = (RenderWindow)sender;
window.Close();
}
static void OnKeyPressed(object sender, EventArgs e)
{
Vector2f newPos = new Vector2f(0, car.Position.Y);
KeyEventArgs ke = (KeyEventArgs)e;
if (ke.Code.Equals(Keyboard.Key.A))
{
if (car.Position.X != 0)
{
newPos.X = car.Position.X - 8;
car.Position = newPos;
}
else if (car.Position.X < 0)
{
newPos.X = 0;
car.Position = newPos;
}
else if(car.Position.X == 0)
{
// Do nothing
}
}
else if (ke.Code.Equals(Keyboard.Key.D))
{
if (car.Position.X != window.Size.X - 32)
{
newPos.X = car.Position.X + 8;
car.Position = newPos;
}
else if (car.Position.X > window.Size.X)
{
newPos.X = window.Size.X;
car.Position = newPos;
}
else if (car.Position.X == window.Size.X)
{
// Do nothing
}
}
}
}
}
【问题讨论】:
-
那么你到底想要什么?您想要更平滑的过渡,但又说想要即时移动?
-
当您当前使用两个移动键中的任何一个时,您首先会看到汽车在开始以一个动作移动之前确实像一个 8 个单位的跳跃,而不是从一开始就以一个动作移动.如果我必须编辑问题,你会怎么称呼它?
-
看来您正在从事件侦听器更新汽车位置。这意味着跳过与键盘重复之间的延迟有关。输入文本时按住任意键,您会看到。如果您想要正确的动画,则需要正确的循环设置。如果您愿意,我可以进一步解释,或者您可以四处寻找游戏设计教程。
-
我很想请您解释一下!如果您愿意,可以将其作为答案包含在内,我可以接受:)
-
我会在稍后写一个答案,除非有人先写。