⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgegameobj.h

📁 pocket pc小游戏源码
💻 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 + -