分享
 
 
 

在WINDOWS里使用ALLEGRO

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在WINDOWS里使用ALLEGRO

在WINDOWS里使用ALLEGRO,如果不要MFC且使用ALLEGRO封装好的API就用ALLEGRO.H,如果要使用没有封装过的API就调用winalleg.h,但如果你要使用MFC,你可以在代用这些之前定义ALLEGRO_AND_MFC这个宏,而在这种情况下,ALLEGRO的ASSERT()和 TRACE()由于和WINDOWS 的宏冲突所以就改为AL_ASSERT() and AL_TRACE().

在WIN32程序中使用WINMAIN做入口点,而ALLEGRO可以让main做入口点,不过你得把在main函数之后加END_OF_MAIN() 以便让ALLEGRO知道主函数结束,如过你嫌麻烦,那么就直接写一个WINMAIN做入口点{请先包含winalleg.h},省你麻烦。但是用main做入口点的小把戏在你直接调用未封装的API时,就会发生冲突,因为那些API只认WINMAIN();那么就请你在使用未封装的API时,使用WINMAIN做入口,但同时要定义ALLEGRO_NO_MAGIC_MAIN这个宏。

如果你写的是个控制台程序,那么就在调用头文件之前定义宏ALLEGRO_USE_CONSOLE ,这样的话,前面提到的用main做入口的小把戏就没用了,这个宏可以让ALLEGRO知道该怎么做。

WIN的程序有图标,ALLEGRO默认IDI_APPLICATION作为自身图标,如果你要改变你所写的程序的图标,可以使用tools/win目录里的wfixicon这个程序创建一个名为allegro_icon的图标资源。

DIRECT X要求你的系统支持视频位图(包括屏幕)。也就是说在你操作时,必须能锁住这些位图。这项工作将被ALLEGRO自动完成,不过吗,有时换是需要你手动操作的,所以查看acquire_bitmap()相关的内容了解更详细的知识。

由于DirectX本身设计的特点,可能你在用WIN键或别的方法切出你的程序后,屏幕的内容以及一些视频位图(video bitmap)的内容将丢失,你可以使用set_display_switch_callback()这个API来找回你要的东西。

在WINDOWS里,desktop_color_depth()将只能返回 8, 16, 24 和 32.那么就是说无法区分15和16位色深,这两中色深被报告出相同的结果16,

(2003.10.31 14:14)WINDOWS的GFX_*驱动相关:

ALLEGRO的set_gfx_mode()函数在WINDOWS下支持以下参数:

GFX_TEXT这个参数将关闭在此之前用set_gfx_mode打开的其他图形模式。

GFX_AUTODETECT 让ALLEGRO自己挑选一个合适的图形驱动。

GFX_AUTODETECT_FULLSCREEN自动检测图形驱动,但只使用全屏模式的驱动,如果当前使用的操作系统不支持,就返回失败信息。

GFX_AUTODETECT_WINDOWED同上,但只使用窗口模式的驱动。

GFX_SAFE当你不关心当前使用的色深和分辨率是,这个特殊的图形驱动将很适合你,查看set_gfx_mode() 文档可以得到更多的介绍。

GFX_DIRECTX是GFX_DIRECTX_ACCEL的别名。

GFX_DIRECTX_ACCEL通用的全屏幕DirectX驱动,在硬件加速可用时使用这一参数。

GFX_DIRECTX_SOFT是DirectX的全屏驱动,只使用软件绘制而不是调用硬件加速的特性。

GFX_DIRECTX_SAFE是DirectX简化全屏的驱动,不支持任何硬件加速,视频和系统位图等等。

GFX_DIRECTX_WIN是通用的窗口模式DirectX驱动,当选用的色深不匹配WINDOWS桌面的色深时,运行在模拟色深(color conversion)模式, Color conversion不直接绘制而且不支持15-bit 和 16-bit 色深.

这个限制是desktop_color_depth()所导致的。但它允许选择直接绘制模式, 16-bit色深设置方法:

if (desktop_color_depth() == 16)

{

set_color_depth(16);

if (set_gfx_mode(GFX_DIRECTX_WIN, 640, 480, 0, 0)!= 0)

{

set_color_depth(15);

if (set_gfx_mode(GFX_DIRECTX_WIN, 640, 480, 0, 0)!= 0)

{

/* 640x480 direct drawing mode not supported */

goto Error;

}

}

/* ok, we are in direct drawing mode */

} 要注意的是,由于某些原因,驱动要求屏幕的宽度是4的倍数。 GFX_DIRECTX_OVL是DirectX overlay 驱动. 他使用特殊的硬件特性运行你的程序在窗口模式:他不能在所有硬件上通用,但在支持它的硬件上,他跑的很好,他要求你采用与屏幕相同的色深,这也是 desktop_color_depth() 造成的限制之一,以下的方法可以设置overlay 驱动,并且是16-bit色深:

if (desktop_color_depth() == 16)

{

set_color_depth(16);

if (set_gfx_mode(GFX_DIRECTX_OVL, 640, 480, 0, 0)!= 0)

{

set_color_depth(15);

if (set_gfx_mode(GFX_DIRECTX_OVL, 640, 480, 0, 0)!= 0)

{

/* 640x480 overlay driver not supported */

goto Error;

}

}

/* ok, the 640x480 overlay driver is running */

}

GFX_GDI是窗口 GDI 驱动. 它非常慢,但可以运行在所有的硬件上,所以当你不关心你做的程序的速度,效果等诸多表现,且你希望运行在窗口模式时,这个参数将帮助你达成愿望,需要注意的是这个驱动使用硬件鼠标指针,目的是加快默写基本的鼠标操作,比如GUI操作。参看: set_gfx_mode.

WINDOWS的DIGI_*驱动:

Windows 声音函数支持以下数字声卡:

DIGI_AUTODETECT可以让Allegro自选一个声卡驱动

DIGI_NONE代表不支持数字声音

DIGI_DIRECTX(n)使用DirectSound设备#n (zero-based)with direct mixing

DIGI_DIRECTAMX(n)使用DirectSound设备#n (zero-based)with Allegro mixing

DIGI_WAVOUTID(n) - high (n=0) 或 low (n=1) quality WaveOut device

查看: detect_digi_driver, install_sound,install_sound_input.

MIDI_*/Windows 驱动

Windows声卡驱动支持以下MIDI声卡:

MIDI_AUTODETECT让 Allegro选择合适的 MIDI 声卡驱动

MIDI_NONE - 无MIDI声音

MIDI_WIN32MAPPER - 使用win32 MIDI mapper

MIDI_WIN32(n) - 使用win32 设备 #n (zero-based)

MIDI_DIGMID - sample-based software wavetable player

以下的函数提供特殊接口让ALLEGRO可以为Win32程序工作.为了使用以下函数,你必须在其他的头文件之后包含winalleg.h.

查看: detect_midi_driver, install_sound,install_sound_input.

HWND win_get_window(void); 提取一个窗口句柄给 Allegro使用. 需要注意的是ALLEGRO使用underlying window 即使你不设置图形模式,除非你安装了 neutral 系统驱动(SYSTEM_NONE).

void win_set_window(HWND wnd); 注册一个用户创建的窗口给ALLEGRO使用,这个函数在你调用 allegro_init()初始化图形库之前,或是安装自动探测系统驱动之前(SYSTEM_AUTODETECT). 这可以让ALLEGRO工作在已经存在的窗口而不是她自己创建的窗口,这样可以让你完全的控制窗口;在特殊情况下你要负责时间的处理。(Allegro 将自动控制一部分,但不对他们进行过滤). 你可以使用库里的没一个组件(graphics, mouse, keyboard, sound, timers 等待), 某些应当引起你的注意(比如 readkey() 如果键盘缓冲是空的,他将一直等待接收按键,所谓的BLOCKING就会发生)因此,在窗口线程中谨慎使用这些函数。然而在库被初始化后的非图形模式里你是可以调用它的。这中情况下keyboard, mouse, joystick, sound 和 声音记录模块将被重新打开如果一贯用户创建的窗口被注册,传送NULL指令可以让ALLEGRO使用它自己的内建窗口。或是调用一个新的窗口句柄{如果内建窗口已经在使用}

void win_set_wnd_create_proc(HWND (*proc)(WNDPROC));

在ALLEGRO创建自己的窗口时注册一个用户定义的过程给ALLEGRO使用。这个函数必须在用allegro_init()初始化库之前被调用 或是安装自动探测系统驱动(SYSTEM_AUTODETECT).它可以让你调整Allegro的窗口,不过只在创建后有效:不象win_set_window(), 因为它让你在窗口创建之后没有窗口的控制权(好处是你不必操心事件的运行).这个注册的函数将传递一个窗口过程 (WNDPROC object) 你必须为新窗口写一个返回新窗口的句柄的函数,然后你就可以象以前一样使用ALLEGRO的所有特性。

HDC win_get_dc(BITMAP *bmp);

提取DirectX 的视频位图和系统位图句柄。

void win_release_dc(BITMAP *bmp, HDC dc);

释放你在此之前用win_get_dc()得到的位图句柄。

GDI routines

下面的这些GDI函数在WINDOWS的设备上下文里绘制ALLEGRO内存位图有平台针对性,当你使用他们时,你将被迫安装 neutral system driver (SYSTEM_NONE) 或是 attach Allegro to an external window with win_set_window().

有两种方法在Windows GDI上绘制ALLEGRO内存位图. 当你使用的是静态位图{static bitmaps} (比如从datafile调用的一些图片),你可以用convert_bitmap_to_hbitmap()把他们转换成 DDB (device-dependent bitmaps即设备依赖位图) 然后用Win32的BitBlt()绘制这些图.

当你使用的是{dynamic bitmaps}(for example some things which react to user input),最好使用set_palette_to_hdc()和blit_to_hdc()函数,他们使用 DIB (device-independent bitmaps即非设备依赖位图).

当然,也有把设备上下文里的位图BLIT到Allegro BITMAP的方法,这样的话,你就可以做打印屏幕位图等类似的事.

所有的绘图和转换函数是用当前调色版作为颜色转换表。你可以使用 set_palette_to_hdc() 或select_palette() 函数来变换这个表. 警告: 当 GDI系统调色版被改变以后, (比如被另一个程序修改) 当前的 Allegro 不会跟着更新。使用这些函数,你必须在ALLEGRO头文件之后包含winalleg.h

void set_gdi_color_format(void);

告诉Allegro让truecolor images使用GDI color层.这是可选项,但着可以让图形转换更快的完成。如果你打算用这个,你必须在初始化Allegro之后创建任何图形之前使用它.

void set_palette_to_hdc(HDC dc, PALETTE pal);

在特殊设备上下文里选择一个Allegro调色板.

HPALETTE convert_palette_to_hpalette(PALETTE pal);

将Allegro调色板转换成Windows调色板并返回一个句柄,在你不需要他的时候,你应该调用DeleteObject().

查看: convert_hpalette_to_palette.

void convert_hpalette_to_palette(HPALETTE hpal, PALETTE pal);

转换一个Windows调色板成为Allegro调色板. 查看: convert_palette_to_hpalette.

HBITMAP convert_bitmap_to_hbitmap(BITMAP *bitmap);

把Allegro内存位图转换成Windows DDB并返回一个句柄. 这个位图使用自己的内存,所以你可以把原位图销毁而不会影响到转换成的那个。当你不再用它时,请调用DeleteObject().

查看: convert_hbitmap_to_bitmap.

BITMAP *convert_hbitmap_to_bitmap(HBITMAP bitmap);

从Windows DDB创建一个Allegro 内存位图。

查看: convert_bitmap_to_hbitmap.

void draw_to_hdc(HDC dc, BITMAP *bitmap, int x, int y);

把整个 Allegro位图绘制到Windows设备上下文,使用与draw_sprite()函数一样的参数.

查看: blit_to_hdc, stretch_blit_to_hdc, draw_sprite.

void blit_to_hdc(BITMAP *bitmap, HDC dc, int sx, sy, dx, dy, w, h);

把一个Allegro内存位图BLIT到Windows设备上下文,使用与blit() 函数相同的参数.

: draw_to_hdc, stretch_blit_to_hdc, blit_from_hdc, blit.

void stretch_blit_to_hdc(BITMAP *bitmap, HDC dc, int sx, sy, sw, sh, int dx, dy, dw, dh);

把 Allegro内存位图BLIT到Windows设备上下文,使用与stretch_blit()函数相同的参数.

查看: draw_to_hdc, blit_to_hdc, stretch_blit_from_hdc, stretch_blit.

void blit_from_hdc(HDC hdc, BITMAP *bitmap, int sx, sy, dx, dy, w, h);

把Windows设备上下文BLIT到Allegro内存位图,使用与blit() 函数相同的参数. 详情参看 stretch_blit_from_hdc() .

查看: stretch_blit_from_hdc, blit_to_hdc, blit.

void stretch_blit_from_hdc(HDC hcd, BITMAP *bitmap, int sx, sy, sw, sh, int dx, dy, dw, dh);

把Windows设备上下文BLIT到Allegro内存位图,使用与stretch_blit()函数相同的参数. 它使用当前的 Allegro调色板转换到目的调色板,不考虑当前的 DC调色板 .所以如果你blitting from 8-bit模式,你应该先用set_palette_to_hdc()函数设置DC调色板.

查看: blit_from_hdc, stretch_blit_to_hdc, stretch_blit. 翻译作者:vrix.ipona

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有