The infrastructure of the game.

xiaoxiao2021-03-06  60

Just like repairing a house, don't worry about you with more expensive bricks, it is just a brick, it is not what you want. The brick can be changed at any time when developing, but once the structure is set, it is not good.

One basic, what is the structure of Efficient? Very simple. All you need is the engine, unlimited state machine and memory pool. These three things are not complicated, you can start from scratch: First is your engine class, what do you need? Class CENGINE {public: CENGINE (); ~ CENGINE (); int initialize (); int start (); int tent (); int posuse (); int shutdown ();

Int Addmodule (CMODULEBASE * NewModule, int ModuleId, int updatefrequency);

Int RemoveModule (INT MODULEID);

}; This is the basic function of a engine that needs to have, do not take the pattern, and do not manage the network, nothing else. Just responsible for adding a module, the added module is refreshed during the specified time. This way, the graph is also good, artificial intelligence is also in the form of the module to add to the engine's refresh list.

So what is the infinite state machine? The infinite state machine is a library that gives you a state, but you can store all the status you want. For example, when you refresh the network, receive the new player's coordinates, then you need to modify the value of the coordinate, then where is the value of the coordinate? Inside the unlimited state machine, only when the network module is updated, just write set ("coordinate", & mycurpos; then when the graphic module is updated, only write mycurpos = get ("coordinate"). So where is the value of mycurpos? It is stored in the memory pool. The memory pool is created when the game is initialized, destroying at the end of the game, providing all the data in the game, and an unlimited state machine is a mapping of a string to the data pointer.

Let's take a look at the implementation of an unlimited state machine: First you need a memory pool: // MemoryMag.h # ifndef __memory_mag_h __ # define __memory_mag_h__

#include #include

Template class cmemorymag {public: cmemorymag (int size); ~ cmemorymag (); t * getNew (); int free (t * var);

Private:

T * m_data; int * m_freed; int m_freedsize; int m_maxsize; int m_cursize;

Template CMEMORYMAG :: 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 cmemorymag :: ~ cmemorymag () {delete [] m_data; delete [] m_freed;} template t * cmemorymag :: getNew () {i (! m_freedsize) { IF (m_cursize

Return NULL;

Return & M_Data [m_freed [- m_freedsize]];

Template int CMemoryMAG :: free (t * var) {INT I, J; int found = 0;

For (j = 0; j

IF (Found) Return 0;

For (i = 0; i

IF (Found! = (m_cursize - 1)) {m_freed [m_freedsize ] = Found; return 1;} m_cursize -; return 1;}

#ENDIF ======================================================================================================================================================================================================================================= == // Then you need a haveh table //HASHER.H#1ndef __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 * m_haashrr; hashnode ** m_hashtable; int m_h; int m_objtable; int m_size;};

#ENDIF ======================================================================================================================================================================================================================================= == // Hasher.cpp # include "Hasher.h" #include Static Int T [] = {1, 87, 49, 12, 176, 178, 102, 166, 121, 193, 6, 84, 249, 230, 44, 163, 14, 197, 213, 181, 161, 85, 218, 80, 64, 239, 24, 226, 236, 142, 38, 200, 110, 177, 104, 103, 141, 253, 255, 50, 77, 101, 81, 18, 45, 96, 31, 222, 25, 107, 190, 70, 86, 237, 240, 34, 72, 242, 20, 214, 244, 227, 149, 235, 97, 234, 57, 22, 60, 250, 82, 175, 208, 5, 127, 199, 111, 62, 135, 248, 174, 169, 211, 58, 66, 154, 106, 195, 245, 171, 17, 187, 182, 179, 0, 243, 132, 56, 148, 75, 128, 133, 158, 100, 130, 126, 91, 13, 153, 246, 216, 219, 119, 68, 223, 78, 83, 88, 201, 99, 122, 11, 92, 32, 136, 114, 52, 10, 138, 30, 48, 183, 156, 35, 61, 26, 143, 74, 251, 94, 129, 162, 63, 152, 170, 7, 115, 167, 241, 206, 3, 150, 55, 59, 151, 220, 90, 53, 23, 131, 125, 173, 15, 238, 79, 95, 89, 16, 105, 137, 225, 224, 217, 160, 37, 123, 118, 73, 2, 157, 46, 116, 9, 145, 134, 228, 2 07, 212, 202, 215, 69, 229, 27, 188, 67, 124, 168, 252, 42, 4, 29, 108, 21, 247, 19, 205, 39, 203, 233, 40, 186, 147, 198, 192, 155, 33, 164, 191, 98, 204, 165, 180, 117, 76, 140, 36, 210, 172, 41, 54, 159, 8, 185, 232, 113, 196, 231, 47, 146, 120, 51, 65, 28, 144, 254, 221, 93, 189, 194, 139, 112, 43, 71, 109, 184, 209,}

INT hashstr (const char * s, int maxn) {register unsigned char oh, h; register unsigned char * p; register int i;

IF (! * s) return 0; p = (unsigned char *) s; oh = t [* p]; h = (* (p ) 1) & 0xff; for (i = maxn - 1; * P && --i> = 0;) {oh = t [oh ^ * p]; h = T [h ^ * (p )];

Return (OH << 8) h;}

Inline Int Chasher :: GETHASH (Const Char * PSTR) {Return Hashstr (PSTR, 16) & m_objtable;

Chasher :: Chasher (int size): m_haashrr (null), m_size (size) {int realsize

For (RealSize = 1; RealSize (realsize); m_haashtable = new hashnode * [size];}

Chasher :: ~ chasher () {delete m_hasharr; while (m_size -) {hashnode * next = m_hashtable [m_size]; while (next) {if (Next-> Name! = Null) {delete [] next-> name Next-> name = null;} next = next-> next;}} delete [] m_hashtable;

Char * getnewstr (const char * pstr) {INT LEN (Strlen (pstr)); if (len> = 0) {char * p = new char [len]; assert (p! = null); memcpy (p, pstr , LEN); RETURN P;} Return null;

INT Chasher :: Enter (const char * pstr, void * node) {hashnode * newNode = m_haashrr-> getnew ();

INT N = GetHash (PSTR);

NewNode-> Next = m_hashtable [n]; newnode-> ptr = node; new inde-> name = getNewStr (PSTR); newNode-> next = m_hashtable [n]; m_hashtable [n] = newNode; return 1;}

Void * chasher :: Find (const char * pstr) {int n = gethash (pstr); havehnode * node = m_hashtable [n]; while (node) {if (! strcmp (node-> name, pstr) Return Node -> ptr; node = node-> next;} Return Null;} int chasher :: remove (const char * pstr) {hashnode * prev, * curr; m_h = gethash (pstr); curr = m_hashtable [m_h]; prev = 0;

While (curr) {if (! strcmp (curr-> name, pstr)) {if (prev) prev-> next = curr-> next; delete [] curr-> name; curr-> name = nail; m_hasharr- > Free (curr); return 1;} prev = curr; curr = curr-> next;} return 0;} // then look at FSM (Finite Status Machine) // fsm.h // Finite State Machine # i indef __myfsm_h__ #define __myfsm_h__

#define fsm_d (cfinitestateMachine :: getInstance ()) # define max_variable_num 512

#include "Hasher.h"

Class cfinitestatemachine {public: cfinitestateMachine (); ~ cfinitestatemachine ();

Static cfinitestateMachine * getInstance ();

INT set (const char * varname);

Void * get (const char * varname);

Private: chasher m_hasher; static cfinitestateMachine * m_myinstance;

#ENDIF ======================================================================================================================================================================================================================================= // and FSM implementation #include "fsm.h"

CfiniteStateMachine * cfinitestateMachine :: m_myinstance = null;

CFiniteStateMachine * CFiniteStateMachine :: GetInstance () {if (m_myInstance == NULL) {m_myInstance = new CFiniteStateMachine (); return m_myInstance;} return m_myInstance;} CFiniteStateMachine :: CFiniteStateMachine (): m_hasher (MAX_VARIABLE_NUM) {}

CfinitestateMachine :: ~ cfinitestateMachine () {}

int CFiniteStateMachine :: Set (const char * varName, void * varvalue) {if (! m_hasher.Find (varName) = NULL) {m_hasher.Remove (varName); return m_hasher.Enter (varName, varvalue);} return m_hasher. ENTER (varname, varvalue);

Void * cfinitestateMachine :: GET (const char * var; if ((var = m_hasher.find (var = m_hasher.find (varname))! = null) Return var; return null;} ========== ======================================== to this, a simple game engine part has already Basically, the rest is to see if you are the client or the server, you need a graphics module or network module, or the NPC, you can slowly take into account.

转载请注明原文地址:https://www.9cbs.com/read-113151.html

New Post(0)