Сроки проблемы в Allegro при реализации понг

Я пытаюсь реализовать очень простую версию Pong с использованием Allegro 4 и C ++. Однако я сталкиваюсь с проблемой, когда использую механизм синхронизации в сочетании с вызовом rest (). Моя игра настроена на 2 игроков, и игрок выигрывает сет, как только игрок получает 7 очков, а затем оба начинают заново с 0. Первый игрок, выигравший 2 сета, выигрывает. После выигрыша сета я показываю имя победителя и вызываю остальных (2000), чтобы игроки могли увидеть сообщение. Однако после этого мяч, кажется, появляется из ниоткуда и приводит к автоматической точке для одного из игроков в начале сета. После этого он возвращается из центра, как и положено. Этого не происходит, когда я удаляю механизм синхронизации или вызов rest ().

Я пытался переместить обновление партитуры и сетов за пределы цикла синхронизации, но это не работает. Также не вызывается функция init () шара сразу после вызова rest (). Был бы очень признателен, чтобы решить, как решить проблему.

Вот код Я пропустил основные моменты и включения, которые не влияют на проблему.

//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

Решение

После rest(2000)сбросьте счетчик на 0, Во время этого отдыха он тикает на две секунды, поэтому после его завершения вы получите две секунды игрового процесса, когда он попытается наверстать упущенное.

Правильное решение - лучше организовать код. Двухсекундный отдых действительно должен проходить как часть вашего обычного цикла синхронизации.

0

Другие решения

Других решений пока нет ...

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector