Простая игра х и о. Если нажаты клавиши 1-9, нарисуйте X или O в нужном месте на доске:
Код ниже, функция changePlayer () просто меняет плеер (не входит в комплект)
и я использую доску [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();
Некоторые общие указания, учитывая, что Allegro 4 действительно старый и не всегда хорошо работает на современных ОС:
Если вы только начинаете, используйте Allegro 5
Всегда используйте set_color_depth(desktop_color_depth())
для максимальной совместимости.
использование GFX_GDI
для максимальной совместимости. (Очевидно, не самый быстрый драйвер, но для простых игр это не имеет значения.)
Не использовать acquire_screen()
а также release_screen()
По вашей конкретной проблеме особо нечего сказать, потому что код, который вы разместили, очевидно, работает для вас. Если вы используете буфер, конечно, вы должны быть уверены, что перетаскиваете его на экран в каждом кадре.
Других решений пока нет …