![]() |
| ||
| 新浪首页 > 游戏世界 > 游民论谈 > 文章内容 |
M$新型快速图形API的实用观点
游民部落网友品雪
CSpaceFrame使用CGameFrame作为功能基础,重载了许多关键的虚函数,颇加入了一些专用于实现游戏的非虚函数。CSpaceFrame::InitGraphics首先调用CGameFrame::InitGraphics,它建立我们的DirectDraw对象,设定图形模式,建立基本的切换界面,调用InitPalette。CSpaceFrame::IntitGraphics然后建立两个DirectDrawSurface,一个用来显示帧率,另一个显示任何绘制在屏幕上的文字。我们也建立并装入了游戏中用到的所有CAnims。CSpaceFrame的Restore函数调用CGameFrame::Restore以恢复基本界面内存,然后恢复帧率及文字界面,当然也调用所有CAnims的Restore。 为接管游戏处理,CSpaceFrame也重载了UpdateGame。没必要调用基类版的UpdateGame,因为它只简单的返回TRUE。UpdateGame是我们的基本的主游戏循环,以固定时间间隔被CGameApp::Run调用,并且是游戏真正的核心。UpdateGame确切的实现是相当简单的,因为所有复杂的工作都分解到各辅助函数里了。处理过程的本质是: *移动精灵 *碰撞检测 *用黑色清屏 *绘制精灵 *切换页 我们用一个经典的双向链表结构表示精灵。这里是取自SpaceFrame。h的定义:
typedefstruct_SPRITE
{
struct_SPRITE*pNext;
struct_SPRITE*pPrev;
SpriteTypeeType;
doubledPosX,dPosY;
doubledVelX,dVelY;
intnDirection;
intnFrame;
intnDelay;
CAnim*pAnim;
}SPRITE;
头两个变量指向链表中前后精灵,链表是循环的,最后个精灵的pNext指向表头。eType成员决定精灵的类型是用哪种节点表示的,可能的值为typeShip,typeEnemy,和typeBullet。nDelay变量用来减慢敌人和子弹的动画速度及船发射子弹的速度。 CSpaceFrame的许多函数用于处理精灵清单。移动精灵(MoveSprites)循环经过整个链,改变量精灵的位置、速度、需要的帧号信息。每种类型的精灵的处理略有不同;如果,当前更新船时,MoveSprites取出键盘决定精灵运动。CollideSprites包含所有的碰撞检测代码,并象MoveSprites相似的循环经过列表并用略有不同的方式处理每种类型的精灵。 当一个碰撞出现时,CollideSprites会根据相关精灵的类型适当动作。DrawSprites用于绘制所有的精灵到后缓冲。它循环经过整个列表,调用每个精灵CAnim的Render成员函数。函数AddSprite和RemoveSprite用于从列表中动态增加及删除精灵。并且m_head是列表的头及玩家的船,被保存在堆栈(stack)。 你可以从PCMagazineOnline下载游戏的全部代码,1996.8的volumarchive里有。(see the side bar"Guide to Our Utilities"in this issue"s Utilities column for down loading in structions)。编译程序步骤如下:
|