如何同时使用多个while循环?

时间:2017-04-11 21:13:50

标签: c while-loop

在视频游戏中说,我需要同时听两个while循环,一个到:

while (up == true)
    movePlayerX(2)

和另一个:

while (right == true)
    movePlayerY(2)

如果符合以下条件,如何让玩家同时向上移动?

int main()
{

while(1)
    printf("hello");

while(1)
    printf("world");

    return(0);
}

只会回来"你好"?是否可以让2个while循环同时工作或者它们是否必须轮流?我知道在汇编级别他们必须轮流进行高级编程:

while(1)
{
    while( up == true)
            movePlayerX(2)
            break;
    while( right == true)
            movePlayerY(2)
            break;
}

这种情况怎么样:

while(1)
    answer = promptUserForData();                     //user enters data at their own pace
    chart = addAnswerToChart(answer);                 //char is updated when user updates it

while(1)
    chart = someOtherDataThatEffectsChart(randData);  //something else effects the chart

while(1)
    printOutChart(chart);                             //chart is constantly being printed out

1 个答案:

答案 0 :(得分:2)

对于关于同时运行的多个while的问题,我看到它的唯一方法是使用多个并行线程,在您的情况下没有理由,因为您应该重新构建代码以更智能地工作。

我不知道你如何设置你的游戏,但最好的方法是在步骤中以无限循环执行游戏逻辑。 而不是询问while(up),你的循环看起来应该是这样的:

void mainGameLoop () {
   while (!gameQuit) {
      handleInput();
      handleLogic(); 
      handleDrawing();
}

这样,游戏的每个循环首先处理输入事件(如键盘按下或鼠标点击/移动),而不是游戏的逻辑,而不是将其绘制到屏幕上。

对于玩家运动有很多方法,但我建议的是和X / Y加速模型。它的工作方式是,玩家对象有一个xSpeed和ySpeed变量,它告诉他在那个方向上移动的速度。对于运动,那么你要做的是如果按下运动键你增加(或者如果运动是负方向则递减)轴速度或直到它达到你想要的最大速度。

然后在逻辑中你只需添加一个减慢播放器速度的摩擦力,所以如果没有按下移动键,播放器会在几次循环后停止。

最后移动播放器,你只需将xSpeed和ySpeed添加到他的位置。

非常简单的实现看起来像这样。我将使用一些表示输入处理的伪函数。

void handleInput() {
   if (keyPressed)
      switch(key) {
         case upArrow: 
            ySpeed -= 0.1;
            break;
         case downArrow: 
            ySpeed += 0.1;
            break;
         case leftArrow: 
            ySpeed -= 0.1;
            break;
         case rightArrow: 
            ySpeed += 0.1;
            break;
      }
}

void handleLogic() {
   // Clamp speed values to maximum of |1| speed
   if (ySpeed > 1)
       ySpeed = 1;
   if (ySpeed < -1)
       ySpeed = -1;
   if (xSpeed > 1)
       xSpeed = 1;
   if (xSpeed < -1)
       xSpeed = -1;

   // Friction slowing down the movement if no movement keys are pressed
   if (ySpeed > 0)
      ySpeed -= 0.05;
   else if (ySpeed < 0)
      ySpeed += 0.05;

   if (xSpeed > 0)
      xSpeed -= 0.05;
   else if (xSpeed > 0)
      xSpeed -= 0.05;

   xPosition += xSpeed;
   yPosition += ySpeed;
}

值纯粹是为了这里的例子。您可以尝试一下它们来处理您想要的角色。