我正在尝试使用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;
}
}
答案 0 :(得分:0)
在rest(2000)
之后,将计数器重置为0
。在休息期间,它会停止两秒钟,所以在它完成后,你会在尝试赶上时获得两秒钟的游戏爆发。
正确的解决方法是拥有更好的组织代码。第二次休息应该作为常规定时循环的一部分。