Allegro DrawSprite() не будет работать правильно C++

Простая игра в крестики и нолики. Если нажаты клавиши 1-9, нарисуйте X или O в нужном месте на доске:

7|8|9

4|5|6

1|2|3

Код приведен ниже, функция changePlayer() просто изменяет игрока (не входит в комплект), и я использую board[0], чтобы указать, какой это игрок.

Когда я запускаю программу, доска отображается правильно, но X и O не рисуются, когда я нажимаю клавишу.

Я пытался нарисовать все в буфер, а затем вывести буфер на экран, но не сработает. Если я не использую буфер и просто рисую все сразу на экране - все работает отлично!

Я уверен, что упускаю что-то простое: S Вот код:

int main()
{
int winner = 0;
BITMAP *xSprite;
BITMAP *oSprite;
BITMAP *newSprite;

int board[10];
int i = 0;

for(i=0; i<10; i++)
{
    board[i] = 0;
}

allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode( GFX_AUTODETECT, 1920, 1080, 0, 0);

xSprite = load_bitmap( "x.bmp", NULL);

oSprite = load_bitmap( "o.bmp", NULL);

BITMAP *buffer = create_bitmap(1920, 1080);

//draw black background
rectfill(buffer,0,0,1920,1080,makecol(0,0,0));
//draw white grid
line( buffer, 200, 0, 200, 480, makecol( 255, 255, 255));
line( buffer, 400, 0, 400, 480, makecol( 255, 255, 255));
line( buffer, 0, 150, 680, 150, makecol( 255, 255, 255));
line( buffer, 0, 300, 680, 300, makecol( 255, 255, 255));

acquire_screen();
blit(buffer, screen, 0, 0, 0, 0, 1920, 1080);
clear_bitmap(buffer);
release_screen();

while(!key[KEY_ESC])
{
  clear_keybuf();

  if (board[0] == 0)
    newSprite = xSprite;
  else
    newSprite = oSprite;

  acquire_screen();

  if(key[KEY_7] && board[7] == 0) {draw_sprite( screen, newSprite, 0, 0); board[7] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_8] && board[8] == 0) {draw_sprite( screen, newSprite, 200, 0); board[8] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_9] && board[9] == 0) {draw_sprite( screen, newSprite, 400, 0); board[9] = 1+board[0]; board[0] = changePlayer(board[0]);}

  if(key[KEY_4] && board[4] == 0) {draw_sprite( screen, newSprite, 0, 150); board[4] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_5] && board[5] == 0) {draw_sprite( screen, newSprite, 200, 150); board[5] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_6] && board[6] == 0) {draw_sprite( screen, newSprite, 400, 150); board[6] = 1+board[0]; board[0] = changePlayer(board[0]);}

  if(key[KEY_1] && board[1] == 0) {draw_sprite( screen, newSprite, 0, 300); board[1] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_2] && board[2] == 0) {draw_sprite( screen, newSprite, 200, 300); board[2] = 1+board[0]; board[0] = changePlayer(board[0]);}
  if(key[KEY_3] && board[3] == 0) {draw_sprite( screen, newSprite, 400, 300); board[3] = 1+board[0]; board[0] = changePlayer(board[0]);}

  release_screen();
}
return 0;

}   
END_OF_MAIN(); 

person JamesB123    schedule 22.12.2012    source источник
comment
Я бы предложил несколько вещей, которые, вероятно, немного облегчат понимание вашего кода: ** Используйте функции, чтобы делать почти одно и то же несколько раз. ** Не пишите несколько операторов в одной строке, если только они не ДЕЙСТВИТЕЛЬНО просты. Вы уверены, что ваше if(key[...] && board [...] == 0) когда-нибудь верно?   -  person Mats Petersson    schedule 22.12.2012
comment
Да, извините, я просто быстро разобрался с этим кодом, чтобы разобраться с аллегро, затем он начал не работать, и я был похож на o.O, но да, все доски [0-9] инициализируются нулем. Если key[KEY_.] всегда возвращает false, это должно работать. Очень странно, пока программа загружается, если я быстро нажимаю цифры - она ​​рисует крестики и нолики. Он просто перестает что-либо делать после того, как сетка видна на экране :S   -  person JamesB123    schedule 22.12.2012


Ответы (1)


Некоторые общие советы, учитывая, что Allegro 4 действительно устарел и не всегда хорошо работает на современных ОС:

  • Если вы только начинаете, используйте Allegro 5

  • Всегда используйте set_color_depth(desktop_color_depth()) для максимальной совместимости.

  • Используйте GFX_GDI для максимальной совместимости. (Явно не самый быстрый драйвер, но для простых игр это не имеет значения.)

  • Не используйте acquire_screen() и release_screen()

По вашей конкретной проблеме особо нечего сказать, потому что код, который вы разместили, по-видимому, работает для вас. Если вы используете буфер, конечно, вы должны обязательно передавать его на экран в каждом кадре.

person Matthew    schedule 23.12.2012
comment
Спасибо, это был экран загрузки и экран выпуска, который был причиной этого. - person JamesB123; 10.01.2013