实现Pong时Allegro中的时间问题

时间:2012-11-14 20:51:32

标签: c++ timing allegro pong

我正在尝试使用Allegro 4和C ++实现一个非常基本的Pong版本。然而,当我将计时机制与rest()调用一起使用时,我遇到了一个问题。我的游戏设置为2个玩家,一个玩家获得7分后玩家赢得一套,然后从0开始,第一个玩家赢得2个胜利。获胜后,我会显示获胜者的名字并呼叫休息(2000),以便玩家可以看到该消息。然而,在此之后,球似乎无处不在,并且在该组的开始时导致其中一个球员的自动点。在那之后,它恢复来自中心,因为它应该。当我删除计时机制或rest()调用时,这不会发生。

我已经尝试在时序循环之外移动得分和集合的更新,但它不起作用。也不会在rest()调用之后调用ball的init()函数。非常感谢有关如何解决问题的一些意见。

这是代码。我遗漏了基本位和不影响问题的包含。 //includes...

Paddle p1, p2;  //paddles for player 1, player 2
Ball b;   //game ball

int main()
{
    setupGame();   //setup allegro and bitmaps
    init();    //initialize paddles and ball

    bool done = false;
    int win, game = 0;

    //game loop
    while(!done)    
    {
     if(key[KEY_X])   //quick exit for debugging
        done = true;

     //timing loop
     while(counter > 0) {
         movePaddles();   
         moveAndCollideBall();
         game = checkCondition(b, p1, p2);  //check if either player 1 or player 2 has won a point
         updateScore(game);   //update score
         updateSets();        //update set if score of either equals 7

         counter --; 
     }

     draw();    //draw paddles and ball
     displayScore();   

     blit(buffer, screen, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);  //draw buffer to screen
     clear_bitmap(buffer);   //clear buffer for next iteration

     checkWinner(done);   //check if either player has won 2 sets, exit loop if so
    }
    exitGame();   //clear bitmaps and exit allegro
    return 0;
}
END_OF_MAIN()

//Returns 1 if player 1 has won a point, 2 for player 2
int checkCondition(Ball b, Paddle p1, Paddle p2)
{
  if(b.x < p1.x)
     return 2;
  else if(b.x > p2.x+PADDLE_WIDTH)
     return 1;
  return 0;
}

//setup allegro and timing variables, load bitmaps
void setupGame()
{
    //allegro, screen setup, etc.

    //timing mechanism
    LOCK_VARIABLE(counter);
    LOCK_FUNCTION(increment_counter);
    install_int_ex(increment_counter, BPS_TO_TIMER(240));

    srand(time(0));

    //other setup stuff
}

//initialize paddles and ball
void init()
{
    p1.init(10, 210);
    p2.init(620, 210);
    b.init();
}

//output score to buffer
void displayScore()
{
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/4, 10, WHITE, -1, "%i", p1.score);
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/2 - SCREEN_WIDTH/3, 450, WHITE, -1, "Sets: %i", p1.sets);
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/2 + SCREEN_WIDTH/4, 10, WHITE, -1, "%i", p2.score);
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/2 + SCREEN_WIDTH/6, 450, WHITE, -1, "Sets: %i", p2.sets);
}

 //taking the winner of the point as parameter, update the corresponding player's score by 1, reset ball
void updateScore(int game)
{
  if(game > 0)
    {game == 1 ? ++p1.score : ++p2.score;
     b.init();
     game = 0;
    }              
}


//update no of sets won if either player has score of 7, reset scores
void updateSets()
{
if(p1.score == 7 || p2.score == 7)
 {
   if(p1.score == 7)
      {p1.sets++;
       textprintf_ex(screen, gamefont, SCREEN_WIDTH/5, SCREEN_HEIGHT/2,WHITE, -1, "Player 1 wins the set!");
       }         
   else
      {p2.sets++;
       textprintf_ex(screen, gamefont, SCREEN_WIDTH/5, SCREEN_HEIGHT/2,WHITE, -1, "Player 2 wins the set!");

      }
   p2.score = 0;
   p1.score = 0;

   rest(2000);  //THIS SEEMS TO CAUSE THE PROBLEM, AFTER THE REST, THE BALL INSTEAD OF COMING FROM THE CENTER, QUICKLY COMES FROM SOMEWHERE CLOSE TO THE CORNER
  }   
}     

//check if either player has won 2 sets, if so set done to true
void checkWinner(bool& done)
{
if(p1.sets == 2)
  {textprintf_ex(screen, gamefont, SCREEN_WIDTH/4, SCREEN_HEIGHT/2 + 30,WHITE, -1, "Player 1 wins!!");
   rest(2000);
   done = true;
   }
else if(p2.sets == 2)
  {textprintf_ex(screen, gamefont, SCREEN_WIDTH/4, SCREEN_HEIGHT/2 + 30,WHITE, -1, "Player 2 wins!!");
   rest(2000);
   done = true;
  }
}

1 个答案:

答案 0 :(得分:0)

rest(2000)之后,将计数器重置为0。在休息期间,它会停止两秒钟,所以在它完成后,你会在尝试赶上时获得两秒钟的游戏爆发。

正确的解决方法是拥有更好的组织代码。第二次休息应该作为常规定时循环的一部分。