现在的位置: 首页 > 综合 > 正文

引擎雏形

2014年02月24日 ⁄ 综合 ⁄ 共 2608字 ⁄ 字号 评论关闭

就像修房子一样,别管你用多贵的砖头,它只是一块砖头而已,并不是你想要的房子。砖头可以在开发的时候随时换,但是结构一旦定下来,就不好修改了。
那么一个基本,却又efficient的结构究竟是什么样的呢?很简单。所有你所需要的就是引擎,有限状态机和内存池。这三个东西一点都不复杂,你可以从头开始写:


首先是你的引擎类,需要些什么呢?

class CEngine 
{
public:
    CEngine();
    ~CEngine();
    int Initialize();
    int Start();
    int Restart();
    int Pause();
    int Shutdown();
    int AddModule(CModuleBase *newModule, int moduleID, int updateFrequency);
    int RemoveModule(int moduleID);
};
这就是一个引擎需要具备的基本功能,不要管图形,也不要管网络,什么都不要管。只是负责加入一个模块,加入的模块在指定的时间内刷新。这样网络也好,图形也好,人工智能也好,都是以模块的形式在初试化的时候加入到引擎的刷新列表里面
那么有限状态机又是什么呢,有限状态机就是一个给你储存状态的库,不过可以储存所有你想要的状态。比如你在刷新网络的时候,接收到新的玩家的坐标,那么就需要把坐标的值修改,那么坐标的值放在哪呢?有限状态机里面,在网络模块更新的时候,只需要写Set("坐标", &myCurPos);然后在图形模块更新的时候,只需要写myCurPos = Get("坐标")。那么myCurPos的值存放在什么地方呢?就是存放在内存池里面。内存池在游戏初始化的时候被创建,在游戏结束的时候销毁,提供游戏中所有数据的存放,而限状态机则是提供字符串到数据指针的映射
下面就来看看有限状态机的实现
首先你需要一个内存池:
 


//
MemoryMag.h

#ifndef __MEMORY_MAG_H__
#define __MEMORY_MAG_H__

#include <stdio.h>
#include <assert.h>

template <class T>
class CMemoryMag 
{
public:

    CMemoryMag(int size);

    ~CMemoryMag();


    T *GetNew();

    int Free(*var);

private:


    T *m_data;

    int *m_freed;

    int m_freedSize;

    int m_maxSize;

    int m_curSize;
};

template<class T> 

CMemoryMag<T>::CMemoryMag(int size) : 

m_maxSize(size),

m_curSize(0),

m_freedSize(0)
{

    m_data = new T[size];

    assert(m_data != NULL);


    m_freed = new int[size];

    assert(m_freed != NULL);
}

template<class T>

CMemoryMag<T>::~CMemoryMag()
{

    delete [] m_data;

    delete [] m_freed;
}

template<class T>

*CMemoryMag<T>::GetNew()
{

    if(!m_freedSize)

    {

        if(m_curSize < m_maxSize) 

            return &m_data[m_curSize++];


        return NULL;

    }


    return &m_data[m_freed[--m_freedSize]];
}

template<class T>
int CMemoryMag<T>::Free(*var)
{

    int i,j;

    int found = 0;


    for(j=0; j<m_freedSize; j++)

        if(&m_data[m_freed[j]] == var) found = 1;


    if(found) return 0;


    for(i=0; i<m_curSize; i++)

    {

        if(&m_data[i] == var) 

        {

            found = i;

            break;

        }

    }


    if(!found) return 0;


    if(found != (m_curSize - 1))

    {

        m_freed[m_freedSize++] = found;

        return 1;

    }


    m_curSize --;

    return 1;
}

#endif
==================================================
//然后你需要一个hash表

//hasher.h

#ifndef __HASHER_H__
#define __HASHER_H__

#include "MemoryMag.h"

class CHasher 
{
public:

    CHasher(int size);

    ~CHasher();


    int Enter(const char *pStr, void *node);

    int Remove(const char *pStr);

    void *Find(const char *pStr);

private:


    int GetHash(const char *pStr);


    typedef struct hashNode 

    {

        char *name;

        void *ptr;

        struct hashNode *next;

    } HASHNODE;


    CMemoryMag<HASHNODE> *m_hashArr;

    HASHNODE *

抱歉!评论已关闭.