Allegro4とC++を使用して非常に基本的なバージョンのPongを実装しようとしています。しかし、rest()呼び出しと組み合わせてタイミングメカニズムを使用すると、問題が発生します。私のゲームは2人用に設定されており、プレーヤーが7ポイントを獲得すると、プレーヤーは1セットを獲得し、その後、両方とも0からやり直します。2セットを獲得した最初のプレーヤーが勝ちます。セットが当たった後、当選者の名前を表示し、rest(2000)を呼び出して、プレイヤーがメッセージを確認できるようにします。しかし、この後、ボールはどこからともなく出てきたように見え、セットの最初にプレーヤーの1人に自動的にポイントが与えられます。その後、本来の中心から再開します。これは、タイミングメカニズムまたは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;
}
}