|
《仙剑传奇》主表面使用640×480 16位色显示模式,不带后台翻转表面。说到16位色就不能不说说555和565,由于这两种格式的差异,在使用透明色时必须判断是那种格式,否则透明色不会正常显示(主角带背景色)!创建好主表面后可以检查它的格式,用一个全局变量保存颜色掩码,代码如下:
if(g_b555)
g_ckMask=0x00007fff;
else
g_ckMask=0x0000ffff;
注意:《仙剑传奇》使用的透明色有两种:黑色和白色。
游戏软件也是一个应用程序,需要处理大量的消息,如:屏幕更新、鼠标单击、移动,键盘按下……所有这些都在一个循环中进行,这个循环就是游戏大循环。《仙剑传奇》的大循环如下:
while(g_Game.GetGameRun())
{
if(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!::GetMessage(&msg,NULL,0,0))
return msg.wParam;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else if(g_Game.GetActive())//游戏窗口位于前台,根据当前状态更新屏幕
{
switch(g_Game.GetGameState())
{
case EGAMESTATE_LOGO://动画显示工作室Logo
g_Logo.UpdateLogo(g_Game.lpDDSBack);
break;
case EGAMESTATE_TITLE://显示游戏封面(开始、读取、退出游戏)
g_Title.UpdateTitle(g_Game.lpDDSBack);
break;
case EGAMESTATE_TALK:
case EGAMESTATE_STEPPED://显示地图行走、对话场景
g_Game.DisposeKey(g_Map.bTalk==FALSE);//处理按键
g_Map.SortNPCRole();//地图中的NPC按Y座标排序
g_Map.UpdateMap(FALSE,&g_Game.Event,g_Game.lpDDSBack);
g_Game.Key.GetKeyState();
if(g_Game.Key.GetState(DIK_ESCAPE))//显示游戏状态面板
g_Game.SetGameState(EGAMESTATE_STATUS);
break;
case EGAMESTATE_STATUS://显示游戏状态面板
g_Map.UpdateMap(FALSE,&g_Game.Event,g_Game.lpDDSBack);
break;
case EGAMESTATE_FIGHT://显示对战场景
g_Fight.UpdateFight(&g_Cursor,g_Game.lpDDSBack);
break;
}
g_Game.UpdatePrimarySurface();//更新主表面
}
else
{
::WaitMessage();
}
}
狼头软件工作室LoneLy写于2008-5-4
|