我正在尝试使用 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;
}
}