Allegro是一个优秀的开源游戏框架,比较了Wn32 GDI中的一些画点、线、矩形、园等的效率后,我最终仍然还是决定使用Allegro,但是这里有一个问题,就是allegro如何和已经大量存在着的Win32的DC(或CDC)接口,这里来讨论。
首先看看Allegro文档,在Allegro manual -> Platform specifics -> Windows specifics 中可以看到有下列函数:blit_from_hdc、blit_to_hdc,基本关注的问题就靠这两个函数来解决。剩下是如何“透明”拷贝:
首先创建DC:
dcBackground.CreateCompatibleDC(pDcSrceen); // pDcSrceen是一个屏幕的DC指针
CBitmap bmpBackground;
bmpBackground.CreateCompatibleBitmap(pDcSrceen,200, 200);
dcBackground.SelectObject(&bmpBackground);
dcBackground.SelectObject(CGdiObject::FromHandle(GetStockObject(WHITE_PEN)));
上面的DC是留给“已经在Win平台上大量的GDI代码”。
再来创建allegro 的 BITMAP:
bmpTest = create_bitmap(200, 200);
clear_to_color(bmpTest, makecol(0, 0, 0));
bmpTest->vtable->color_depth = 32; //
bmpTest->vtable->mask_color = makecol(0, 0,0); //关键,准备透明拷贝
dcBackground之上假设已经做好各种各样的“画”,bmpTest也已经创建成功,可以:
blit_from_hdc(dcBackground.GetSafeHdc(), bmpTest, 0, 0, 0, 0, bmpTest->w, bmpTest->h);
剩下来,bmpTest可以做任何在Allegro应该做的事情。
(注:blit_from_hdc是一个非常耗时的操作,它不应该放在显示的循环中)