Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “如何管理”;“速度”;在一个简单的赛车游戏中?_C#_Algorithm - Fatal编程技术网

C# “如何管理”;“速度”;在一个简单的赛车游戏中?

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

我正试图在C#,sdl.net中开发一个简单的2d赛车游戏(自上而下查看)。 现在,我正试图控制我的汽车的速度、加速度和刹车。 我的问题是算法。 我让循环(
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 in
sin()
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