0

我正在尝试使用 Allegro 4 和 C++ 实现一个非常基本的 Pong 版本。但是,当我将计时机制与 rest() 调用结合使用时,我遇到了问题。我的游戏设置为 2 名玩家,一名玩家获得 7 分后赢得一盘,然后都从 0 重新开始。第一个赢得 2 局的玩家获胜。赢得一盘后,我会显示获胜者的姓名并调用 rest(2000) 以便玩家可以看到消息。然而,在这之后,球似乎不知从何而来,并导致其中一名球员在比赛开始时自动得分。之后,它会按照预期从中心恢复。当我删除计时机制或 rest() 调用时,不会发生这种情况。

我已经尝试将分数的更新和设置移到计时循环之外,但它不起作用。在 rest() 调用之后也不会调用球的 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;
  }
}
4

1 回答 1

0

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

正确的解决方法是拥有更好的组织代码。两秒钟的休息确实应该作为常规计时循环的一部分进行。

于 2012-11-15T09:08:58.563 回答