Allegro DrawSprite()在c++中不能正常工作
Allegro DrawSprite() wont function correctly C++
简单的x和O的游戏。如果按下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();
考虑到Allegro 4真的很老,在现代操作系统上并不总是工作得很好,一些一般的提示:
-
如果你刚刚开始,使用快板5
-
始终使用
set_color_depth(desktop_color_depth())
以获得最大的兼容性 -
使用
GFX_GDI
以获得最大的兼容性。(显然不是最快的驱动程序,但对于简单的游戏,这并不重要。) -
不要使用
acquire_screen()
和release_screen()
对于您的特定问题,没有什么可说的,因为您发布的代码显然适用于您。如果你使用的是缓冲,当然你需要确保每一帧都把它blit到屏幕上。
相关文章:
- 为什么 HeapFree() 不能正常工作?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么"std::is_function_v"不能按预期工作?
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- C++自定义删除运算符不能正常工作?
- 为什么使用 exec() 重新启动程序不能正常工作?
- C++:返回本地对象,但不能正常工作
- 有没有办法关闭文件? fclose 不能很好地工作
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- 为什么sizeof函数在这里不能正常工作
- 为什么 decltype(declval()<T>.func()) 可以工作,而 decltype(&T::func) 不能工作?
- 静态 constexpr 函数在模板结构中工作,但不能在结构中工作.为什么?
- 为什么这个base64解码/编码功能不能正常工作?
- 为什么带有 const 关键字的构造函数可以工作,而没有它就不能工作?
- 如果 (QString.contains()) 不能正常工作,请使用 temp bool 变量进行更正