本篇是創(chuàng)建游戲內(nèi)核(1)
【接口與實(shí)現(xiàn)分離版】的續(xù)篇,關(guān)于該內(nèi)核的細(xì)節(jié)說(shuō)明請(qǐng)參考創(chuàng)建游戲內(nèi)核(2),這個(gè)版本主要是按照功能劃分模塊的思想,并嚴(yán)格按照接口與實(shí)現(xiàn)相分離的原則來(lái)寫的,沒(méi)有用面向?qū)ο蟮乃枷雭?lái)寫,沒(méi)有繼承沒(méi)有多態(tài)。大家可以對(duì)比兩個(gè)版本,比較優(yōu)劣。
給用戶的接口:
/*************************************************************************
PURPOSE:
Interface for state manager.
*************************************************************************/
#ifndef _CORE_MANAGER_H_
#define _CORE_MANAGER_H_
enum PURPOSE
{
NO_PURPOSE = 0,
INIT_PURPOSE,
SHUTDOWN_PURPOSE,
FRAME_PURPOSE
};
typedef void (*MANAGER_FUNC)(void* data, long purpose);
typedef void* MANAGER;
typedef MANAGER* MANAGER_PTR;
typedef int BOOL;
MANAGER manager_create();
void manager_push(MANAGER_PTR top_manager, MANAGER_FUNC func, void* data);
BOOL manager_pop(MANAGER_PTR top_manager, void* data);
void manager_destroy(MANAGER_PTR top_manager, void* data);
BOOL manager_process(MANAGER top_manager, void* data);
void manager_process_all(MANAGER top_manager, void* data);
#endif
實(shí)現(xiàn)細(xì)節(jié):
/*************************************************************************
PURPOSE:
Implements for state manager.
*************************************************************************/
#include <malloc.h>
#include <memory.h>
#include "core_manager.h"
#pragma warning(disable : 4996)
#define NULL 0
#define TRUE 1
#define FALSE 0
typedef struct _MANAGER
{
MANAGER_FUNC func;
_MANAGER* next;
} *_MANAGER_PTR;
//------------------------------------------------------------------------
// Create manager object.
//------------------------------------------------------------------------
MANAGER manager_create()
{
_MANAGER_PTR _manager = (_MANAGER_PTR) malloc(sizeof(_MANAGER));
memset(_manager, 0, sizeof(_MANAGER));
return (MANAGER) _manager;
}
//------------------------------------------------------------------------
// Push one manager function into manager stack.
//------------------------------------------------------------------------
void manager_push(MANAGER_PTR top_manager, MANAGER_FUNC func, void* data)
{
if(func == NULL)
return;
// allocate a new manager and push it into stack
_MANAGER_PTR new_manager = (_MANAGER_PTR) malloc(sizeof(_MANAGER));
new_manager->func = func;
new_manager->next = (_MANAGER_PTR) *top_manager;
*top_manager = (MANAGER) new_manager;
// call manager function with init purpose
new_manager->func(data, INIT_PURPOSE);
}
//------------------------------------------------------------------------
// Pop top manager object from manager stack.
//------------------------------------------------------------------------
BOOL manager_pop(MANAGER_PTR top_manager, void* data)
{
if(top_manager == NULL || *top_manager == NULL)
return FALSE;
_MANAGER_PTR _top_manager = (_MANAGER_PTR) *top_manager;
if(_top_manager->next == NULL)
return FALSE;
// first call with shutdown purpose
_top_manager->func(data, SHUTDOWN_PURPOSE);
// remove the head of stack (if any)
_MANAGER_PTR _manager_ptr = _top_manager;
_top_manager = (_top_manager)->next;
free(_manager_ptr);
*top_manager = (MANAGER_PTR) _top_manager;
return TRUE;
}
//------------------------------------------------------------------------
// Pop all manager function from stack.
//------------------------------------------------------------------------
void manager_destroy(MANAGER_PTR top_manager, void* data)
{
while(manager_pop(top_manager, data))
;
}
//-----------------------------------------------------------------------------
// process top-most manager function.
//-----------------------------------------------------------------------------
BOOL manager_process(MANAGER top_manager, void* data)
{
if(top_manager == NULL)
return FALSE;
// process the top-most manager function
((_MANAGER_PTR) top_manager)->func(data, FRAME_PURPOSE);
return TRUE;
}
//-----------------------------------------------------------------------------
// Process all manager functions in stack.
//-----------------------------------------------------------------------------
void manager_process_all(MANAGER top_manager, void* data)
{
_MANAGER_PTR _manager_ptr = (_MANAGER_PTR) top_manager;
while(_manager_ptr)
{
_manager_ptr->func(data, FRAME_PURPOSE);
_manager_ptr = _manager_ptr->next;
}
}
測(cè)試代碼:
/*************************************************************************
PURPOSE:
Test for manager stack.
*************************************************************************/
#include "core_common.h"
#include "core_framework.h"
#include "core_manager.h"
MANAGER g_manager;
void func2(void* data, long purpose)
{
if(purpose == FRAME_PURPOSE)
{
MessageBox(g_hwnd, "state2", "message", MB_OK);
manager_pop(&g_manager, NULL);
}
}
void func1(void* data, long purpose)
{
if(purpose == INIT_PURPOSE)
{
MessageBox(g_hwnd, "state1", "message", MB_OK);
manager_push(&g_manager, func2, NULL);
}
}
BOOL game_init()
{
g_manager = manager_create();
manager_push(&g_manager, func1, NULL);
return TRUE;
}
BOOL game_frame()
{
return TRUE;
}
BOOL game_shutdown()
{
manager_destroy(&g_manager, NULL);
return TRUE;
}
//--------------------------------------------------------------------------------
// Main function, routine entry.
//--------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE inst, HINSTANCE pre_inst, LPSTR cmd_line, int cmd_show)
{
if(! build_window(inst, "MainClass", "MainWindow", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600))
return FALSE;
run_game(game_init, game_frame, game_shutdown);
return 0;
}
點(diǎn)擊下載源碼和工程