Design RPG yourself 2 -- 主表面格式及大循环

    《仙剑传奇》主表面使用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