我正在尝试在C#,sdl.net中开发一个简单的赛车2D游戏(自上而下查看)。
现在,我正试图管理我的汽车的速度,加速度和刹车。
我的问题是算法。
我有循环(Events_Tick)
每秒执行50次,我的汽车位置处理如下:
private void Events_Tick(object sender, TickEventArgs e)
{
car.ProcessPosition();
}
和ProcessPosition
类似于:
if (throttle)
{
speed += 1;
x += 1;
}
最后,我在新X上画了我的精灵。
问题是它太快了!
所以我问你如何保持50 FPS(每秒帧数)并且我的精灵(汽车)每秒仅移动N像素(基于它的速度)。
提前谢谢!此致!
答案 0 :(得分:4)
首先,因为你有2d而不是1d游戏,你需要你的速度
class Vector
{
double x;
double y;
}
有了这门课,你应该保持位置和速度。
由于您是自上而下的2d,因此您必须在速度向量上实现一些.RotateLeft()
和.RotateRight()
。
旋转将实现如下:
x' = cos(a) * x - sin(a) * y
y' = sin(a) * x + cos(a) * y
您必须按如下方式实施.Move()
方法:
void Move(Vector v)
{
x+=v.x;
y+=v.y;
}
编辑:如果需要澄清,或者进行更深入的讨论,请询问。
此外,您可以在此处使用计时器,但尝试计算上次计时器事件所花费的时间,然后在添加到当前位置时将速度乘以该值,您将获得更准确的位置。
in sin()
和cos()
将是弧度的角度,你可能会想要度数。
这里有something让你了解度数和弧度。
答案 1 :(得分:2)
对速度和x使用double值,然后可以使用Math.Round(x)进行绘制。
if (throttle == true) {
speed+=0.05;
}
x+=speed; //move car even without acceleration
遵循Henk的建议,使您的程序更灵活,并能够向用户显示50mph而不是0.05px / 0.02s:
double speedInMph = 50;
double screenSizeInMiles = .1;
double screenSizeInPx = 500;
if(throttle)
{
speedInMph += 1;
}
double speedInMpms = 50/(60*60*1000);//Miles per millisecond
double xInMiles = speedInMpms * 50;
double pxPerMile = screenSizeInPx/screenSizeInMiles;
x+= xInMiles * pxPerMile;
答案 2 :(得分:1)
加速度将保持不变,具体取决于用户输入(在简单的水平上,汽车正在加速,减速或保持速度)。
速度会根据加速度改变每一帧。每个框架,根据加速度和框架覆盖的第二个比例(即您的情况下1/50秒)更新汽车的速度。
因此,如果您的汽车以每秒10个单位的距离加速,在您的示例中,速度将增加每帧单位距离的1/5。
认为值得详细阐述其他答案,而不仅仅是发布更多代码: - )
答案 3 :(得分:1)
您应该根据当前加速度添加速度,并使用控件处理加速度,使用上限限制速度并根据两次游戏循环迭代之间经过的时间增加速度。
float accel = 10.0f; // units per squared second
float maxSpeed = 50.0f // units per second
float curSpeed = 0.0f;
//game init
while (1) {
long timeBefore = time();
// game loop
long timeElapsed = time() - timeBefore;
if (throttle) {
curSpeed += accel*(timeElapsed / 1000.0);
if (curSpeed > maxSpeed)
curSpeed = maxSpeed;
}
}
通过这种方式,您可以考虑这样一个事实:较长的车架会比较快的矿石提高车速,使其与时间保持一致。
这个模型意味着一个恒定的加速度,而你可以在低音时想要一个动态加速度,在这种情况下,你只需将更新移动到加速度(考虑帧速度的速度),并将其限制为不超过固定阈值
答案 4 :(得分:0)
Henk是对的。您将需要创建
Thread
并调用它
Sleep(Int32)
方法每次在循环中减慢动画的速度,其中int参数是以毫秒为单位的暂停时间。
在你的情况下,你需要每次循环移动汽车N / 50像素,并且每次睡眠线程20毫秒。