C# “如何管理”;“速度”;在一个简单的赛车游戏中?
我正试图在C#,sdl.net中开发一个简单的2d赛车游戏(自上而下查看)。 现在,我正试图控制我的汽车的速度、加速度和刹车。 我的问题是算法。 我让循环(C# “如何管理”;“速度”;在一个简单的赛车游戏中?,c#,algorithm,C#,Algorithm,我正试图在C#,sdl.net中开发一个简单的2d赛车游戏(自上而下查看)。 现在,我正试图控制我的汽车的速度、加速度和刹车。 我的问题是算法。 我让循环(Events\u Tick)每秒执行50次,其中我的汽车位置处理如下: private void Events_Tick(object sender, TickEventArgs e) { car.ProcessPosition(); } 而ProcessPosition类似于: if (throttle) { speed
Events\u Tick)
每秒执行50次,其中我的汽车位置处理如下:
private void Events_Tick(object sender, TickEventArgs e)
{
car.ProcessPosition();
}
而ProcessPosition
类似于:
if (throttle)
{
speed += 1;
x += 1;
}
最后,我在新的X上画我的精灵
问题是速度太快了
所以我想问你如何保持每秒50帧(帧数),并将我的精灵(汽车)移动到每秒N像素(基于其速度)
提前谢谢你!问候 使用速度和x的双倍值,然后可以使用Math.Round(x)进行绘图
if (throttle == true) {
speed+=0.05;
}
x+=speed; //move car even without acceleration
遵循Henk的建议,使您的程序更加灵活,并能够向用户显示50英里/小时的速度,而不是0.02秒0.05像素的速度:
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;
使用“速度”和“x”的双值,然后可以使用Math.Round(x)进行绘图
if (throttle == true) {
speed+=0.05;
}
x+=speed; //move car even without acceleration
遵循Henk的建议,使您的程序更加灵活,并能够向用户显示50英里/小时的速度,而不是0.02秒0.05像素的速度:
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;
亨克是对的。您将要创建一个
Thread
并称其为
Sleep(Int32)
方法每次在循环中减慢动画速度,其中int参数是以毫秒为单位的暂停时间
在您的情况下,您将希望每次循环移动汽车N/50像素,每次睡眠线程20毫秒。Henk是正确的。您将要创建一个
Thread
并称其为
Sleep(Int32)
方法每次在循环中减慢动画速度,其中int参数是以毫秒为单位的暂停时间
在您的情况下,您希望每次循环移动汽车N/50像素,每次休眠线程20毫秒。根据用户输入,加速度将是恒定的(在一个简单的级别上,汽车正在加速、减速或保持速度) 速度将根据加速度改变每一帧。在每一帧中,根据加速度和帧覆盖的秒数比例(即,在您的情况下为1/50秒)更新汽车的速度 因此,如果你的汽车以每秒10单位距离的速度加速,在你的例子中,每帧速度将增加1/5单位距离
我只是觉得有必要详细说明一下其他答案,而不是仅仅发布更多代码:-)加速度将是恒定的,取决于用户输入(在一个简单的水平上,汽车要么加速,要么减速,要么保持速度) 速度将根据加速度改变每一帧。在每一帧中,根据加速度和帧覆盖的秒数比例(即,在您的情况下为1/50秒)更新汽车的速度 因此,如果你的汽车以每秒10单位距离的速度加速,在你的例子中,每帧速度将增加1/5单位距离
我只是觉得有必要详细说明一下其他的答案,而不是仅仅发布更多的代码:-)你应该根据当前加速度添加速度,并用你的控件处理加速度,用上限限制速度,并根据两次游戏循环迭代之间的时间增加速度
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;
}
}
通过这种方式,你要考虑到这样一个事实:更长的车架会比更快的车架更能提高你的车速,从而使其与时间保持一致
这个模型意味着一个恒定的加速度,而你可能想要一个动态的加速度,在这种情况下,你只需将更新移动到加速度(考虑到帧持续时间和速度)并设置上限,使其不超过固定的阈值。您应该根据当前加速度添加速度,并使用控件仅处理加速度,使用上限限制速度,并根据两次游戏循环迭代之间经过的时间增加速度
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;
}
}
通过这种方式,你要考虑到这样一个事实:更长的车架会比更快的车架更能提高你的车速,从而使其与时间保持一致
这个模型意味着一个恒定的加速度,而你可能需要一个动态的加速度,在这种情况下,你只需将更新移动到加速度(考虑到帧持续时间和速度),并将其限制在不超过固定阈值的范围内。首先,因为你有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;
}
编辑:请询问是否需要澄清,或进行更深入的讨论
此外,您可以在此处使用计时器,但请尝试计算上次计时器事件所花费的时间,然后将速度与该值相乘,当添加到当前位置时,您将获得更准确的位置
a insin()
和cos()
将是一个以弧度为单位的角度,在这里您可能需要度
以下是关于度和弧度的说明。首先,因为你的游戏是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;
}
编辑:请询问是否需要澄清,或进行更深入的讨论
此外,您可以在此处使用计时器,但请尝试计算上次计时器事件所花费的时间,然后将速度与该值相乘,当添加到当前位置时,您将获得更准确的位置
a