📄 pgegameobj.h
字号:
#pragma once
#include "../pgesurface.h"
#include "../PGEBaseDataClass.h"
#include "PGEFunQue.h"
#include "mmsystem.h"
#include "../PGEcanvas.h"
#define WORLD_CLASS extern WorldList world;
enum GAMEOBJ_TYPE
{
OBJ_MAP = 0x6f,
OBJ_PLAYER,
OBJ_IMAGE,
};
class CPGEGameObj
{
public:
CPGEGameObj(BYTE btType, int iQueSize = 128):m_FunQue(iQueSize){
m_btType = btType;
m_bVisible = TRUE;
}
~CPGEGameObj(void){}
virtual void Tick(CPGETimer* timer){}
virtual void Draw(CPGECanvas* canvas) = 0;
WPOINT m_ptCur;
BYTE m_btType;
RECT m_rSrc;
RECT m_rDis;
BOOL m_bVisible;
CPGEFunQue m_FunQue;
};
struct ListObj
{
int up;
int down;
CPGEGameObj* p;
};
#define HASH_SIZE 512
#define NullP 0xffffffff
class WorldList // 世界链表
{
public:
WorldList(){
map = 0;
player = 0;
fightBkm = 0;
clear();
}
~WorldList(){}
void push_back(CPGEGameObj* pBody) // 在链表尾部添加节点
{
if (m_iStart != (int)NullP)
{
for (int i=0; i<HASH_SIZE; i++)
{
if ((DWORD)m_pLstData[i].p == NullP)
{
m_pLstData[i].up = m_iCur;
m_pLstData[m_iCur].down = i;
m_pLstData[i].p = pBody;
m_iCount++;
m_iCur = i;
break;
}
}
}
else
{
m_pLstData[0].p = pBody;
m_iStart = 0;
m_iCur = 0;
m_iCount++;
}
}
void reMove(CPGEGameObj* pobj)
{
for (int i=0; i<HASH_SIZE; i++)
{
if (m_pLstData[i].p == pobj)
{
m_pLstData[i].p = (CPGEGameObj*)NullP;
if (i == m_iStart)
{
if (m_pLstData[i].down != (int)NullP)
{
m_iStart = m_pLstData[i].down;
m_pLstData[m_iStart].up = (int)NullP;
}
}
else if (i == m_iCur)
{
if (m_pLstData[i].up != (int)NullP)
{
m_iCur = m_pLstData[i].up;
m_pLstData[m_iCur].down = (int)NullP;
}
}
else
{
m_pLstData[m_pLstData[i].up].down = m_pLstData[i].down;
m_pLstData[m_pLstData[i].down].up = m_pLstData[i].up;
}
m_pLstData[i].up = (int)NullP;
m_pLstData[i].down = (int)NullP;
m_iCount--;
break;
}
}
}
CPGEGameObj* GetPos(int iPos) // 取得指标指示节点的内容
{
return m_pLstData[iPos].p;
}
CPGEGameObj* GetPosNext(int &i)
{
CPGEGameObj* p = m_pLstData[m_iPoint].p;
m_iPoint = m_pLstData[m_iPoint].down;
i=m_iPoint;
if (m_iPoint == (int)NullP) m_iPoint = m_iStart;
return p;
}
int begin() // 取得头部节点的指标
{
m_iPoint = m_iStart;
return m_iStart;
}
int end() // 取得尾部节点的指标
{
return (int)NullP;
}
void clear() // 清除全部链表
{
memset(m_pLstData, 0xff, sizeof(m_pLstData));
m_iStart = (int)NullP;
m_iCount = 0;
}
void sort() // 根据物体在屏幕的位置进行排序
{
LONG iy;
int i=m_iStart;
int j,t,b;
CPGEGameObj* p;
for(;i!=(int)NullP;)
{
iy = m_pLstData[i].p->m_rDis.bottom;
j = m_pLstData[i].down;
b = 0;
for (;j!=(int)NullP;)
{
if(iy > m_pLstData[j].p->m_rDis.bottom)
{
iy = m_pLstData[j].p->m_rDis.bottom;
t = j;
b = 1;
}
j=m_pLstData[j].down;
}
if (b)
{
p = m_pLstData[i].p;
m_pLstData[i].p = m_pLstData[t].p;
m_pLstData[t].p = p;
}
i = m_pLstData[i].down;
}
}
ListObj m_pLstData[HASH_SIZE];
CPGEGameObj* map;
CPGEGameObj* player;
CPGEGameObj* fightBkm;
int m_iStart;
int m_iPoint;
int m_iCount;
int m_iCur;
};
void CreateSurfaceFormIndex(CPGESurface* pSuf, FILE* fp, FILE_OF_SIZE* pszFile, int index, DWORD dwBaseOffset);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -