- 注册时间
- 2006-10-28
- 最后登录
- 2010-8-17
③业余
- 积分
- 161
|
发表于 2006-11-4 14:07:38
|
显示全部楼层
我也来说一下流程吧.
一般框架型的引擎.会提供一个BaseAppFrameWork 用来封装游戏主体框架.自己写的时候只用继承这个类,并重载所要的函数即可.
不过我这里说的是我的红魔夜的流程.还是用的传统的写法,因为我的Y2GE本身不是一个框架
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
EnableMemoryLeakCheck();
Game::InitGame(hInstance);
Game::RunGame();
Game::ShutGame();
return 0;
}
而Game本身是一个static类.就是里面的函数和成员都是static 的.当然这个可以用Singleton来实现.但是我直接写了.
Game里面保存着几个对游戏有整体作用的变量.除了控制游戏主体运行的ObjManager
以外.还有一个非常重要的变量state,作为游戏的主体状态机的状态.
typedef enum
{
GAME_STATE_INIT,
GAME_STATE_END,
GAME_STATE_STARTMENU,
GAME_STATE_CHOOSEDIFFICULTY,
GAME_STATE_CHOOSEPLAYER,
GAME_STATE_STARTLEVEL,
GAME_STATE_RUN,
GAME_STATE_PAUSE,
GAME_STATE_NEWlEVEL,
GAME_STATE_CONTINUE
}GAME_STATE;
class Game
{
// Interface
public:
static void InitGame(HINSTANCE hinstance);
static void RunGame();
static void ShutGame();
static bool _func(DWORD a);
static ObjectMap & GetObjectMap();
protected:
static int _GameStateInit();
static int _GameStateEnd();
static int _GameStatestartMenu();
static int _GameStateChooseDifficulty();
static int _GameStateChoosePlayer();
static int _GameStateStartLevel();
static int _GameStateRun();
static int _GameStatePause();
static int _GameStateNewLevel();
static int _GameStateContinue();
// Variables
private:
static ObjectMap om;
static HINSTANCE hinstance;
static int state;
static int level;
};
Init和Shut 分别负责引擎初始化资源加载 和 资源释放引擎关闭
重点在Run上面.
void Game::RunGame()
{
engine.Sys_Start(Game::_func,0);
}
这里用我的Y2GE进行游戏循环.
bool Game::_func(DWORD a)
{
static bool restore = false;
// game state run
if (!engine.Video_BeginScene(Color::black()))
{
if (restore == false)
{
om.ReleaseFont();
restore = true;
}
return true;
}
if (restore == true)
{
om.RestoreFont();
restore = false;
}
switch (state)
{
case GAME_STATE_INIT:
state = _GameStateInit();
break;
case GAME_STATE_END:
state = _GameStateEnd();
return false;
break;
case GAME_STATE_STARTMENU:
state = _GameStatestartMenu();
break;
case GAME_STATE_CHOOSEDIFFICULTY:
state = _GameStateChooseDifficulty();
break;
case GAME_STATE_CHOOSEPLAYER:
state = _GameStateChoosePlayer();
break;
case GAME_STATE_STARTLEVEL:
state = _GameStateStartLevel();
break;
case GAME_STATE_RUN:
state = _GameStateRun();
break;
case GAME_STATE_PAUSE:
state = _GameStatePause();
break;
case GAME_STATE_NEWlEVEL:
state = _GameStateNewLevel();
break;
case GAME_STATE_CONTINUE:
state = _GameStateContinue();
break;
}
engine.Video_EndScene();
return true;
}
也就是说每一个状态都有一个对应的函数进行处理.该函数返回下一个应该出现的状态.
然后就可以在主要的state 里面使用ObjManager(就是ObjectMap)来进行游戏主体运行了
int Game::_GameStateRun()
{
engine.Event_GetKeyboardState();
if (!Level::ExecuteScript())
return GAME_STATE_NEWlEVEL;
om.ProcessInput();
om.MoveObjects();
om.ProcessHitEvents();
if (engine.keyboard.IsKeyDown(DIK_RETURN) || engine.keyboard.IsKeyDown(DIK_ESCAPE))
{
Global: laySe(SE_CANCEL);
return GAME_STATE_PAUSE;
}
if(!om.IsPlayerAlive())
{
return GAME_STATE_CONTINUE;
}
om.RenderObjects();
return GAME_STATE_RUN;
}
简单的游戏框架就是这样了.
代码写的很烂,请大家多包涵.. |
|