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

📄 objectmanager.cpp

📁 RPG游戏源代码,里面有RPG游戏的制作流程,供大家学习如何制作RPG游戏
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////
// ObjectManager.cpp: implementation of the CObjectManager class.
// RPGDemo框架程序	道具管理类
// written by 萧萧落木(Roc.j.Wood)
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ObjectManager.h"
#include "GScene.h"

#include <fstream.h>
#include "assert.h"
#include <string>
using namespace std;

#define MAXITEM_SHOWINLIST	10
#define STILL_INPRROCESS	1


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGObjectManager::CGObjectManager()
{
	m_pScene	= NULL;
	m_ObjCount	= 0;
	m_iListTop	= 0;
	m_iListSelect = -1;
	memset(m_iObjPackage,0,sizeof(WORD)*MAX_OBJITEMS);
}

CGObjectManager::~CGObjectManager()
{
	m_ObjCount	= 0;
}

HRESULT CGObjectManager::InitObjectList(CGScene *pScene)
{
	assert(pScene);
	m_pScene = pScene;
	
	::fstream fs;
	fs.open(OBJECT_FILENAME,ios::in|ios::binary);
	if(fs.is_open()==FALSE)	return E_FAIL;
	
	try
	{
		fs.seekp(0,ios::end);
		LONG FileSize=fs.tellp();
		LONG ItemCount=FileSize/sizeof(OBJItem);
		if(ItemCount>MAX_OBJITEMS) ItemCount=MAX_OBJITEMS;

		fs.seekp(0,ios::beg);
		for(int i=0;i<ItemCount;i++)
			fs.read((BYTE *)(m_pObjItems+i),sizeof(OBJItem));

		m_ObjCount=ItemCount;
	}
	catch(...)
	{
		m_ObjCount=-1;
		fs.close();
		return E_FAIL;
	}

	fs.close();

	memset(m_iObjPackage,0,sizeof(LONG)*MAX_OBJITEMS);
	m_iListTop	= 0;
	m_iListSelect = -1;
	
	return OBJDialog.CreateSurface(&GAFDDraw,240,18*14,GAFMEM_SYSTEMONLY);

	//return	S_OK;
}

HRESULT CGObjectManager::UseItem(LONG ItemIndex)
{
	assert(ItemIndex>=0 && ItemIndex<m_ObjCount);
	assert(m_pScene);
	
	HRESULT hr = m_pScene->RunScript(m_pObjItems[ItemIndex].szScript);
	if(SUCCEEDED(hr))
	{
		m_iListSelect = -1;
		switch(m_pObjItems[ItemIndex].Type)
		{
			case ITEMTYPE_WEAPON:
				
				break;
			case ITEMTYPE_ARMOR:
				
				break;
			case ITEMTYPE_MEDIC:
				AddItem(ItemIndex,-1);
				break;
			case ITEMTYPE_UNKNOWN:
			default:
				break;
		}
	}

	return hr;
}

HRESULT CGObjectManager::AddItem(LONG ItemIndex,LONG Count)
{
	assert(m_pObjItems);
	assert(ItemIndex>=0 && ItemIndex<m_ObjCount);
	m_iObjPackage[ItemIndex]+=Count;
	if(m_iObjPackage[ItemIndex]<0)	m_iObjPackage[ItemIndex]=0;
	if(m_iObjPackage[ItemIndex]>99)	m_iObjPackage[ItemIndex]=99;
	return S_OK;
}

LONG CGObjectManager::GetItemIndex(LPCTSTR ObjName)
{
	assert(m_pObjItems);
	string str(ObjName);
	for(LONG i=m_ObjCount-1;i>=0;i--)
		if(str==m_pObjItems[i].szName) break;
	return i;
}

HRESULT CGObjectManager::UseItem(LPCTSTR ObjName)
{
	LONG idx=GetItemIndex(ObjName);
	if(idx>=0&&idx<m_ObjCount)	return UseItem(idx);
	return E_FAIL;
}

HRESULT CGObjectManager::AddItem(LPCTSTR ObjName,LONG Count)
{
	LONG idx=GetItemIndex(ObjName);
	if(idx>=0&&idx<m_ObjCount)	return AddItem(idx,Count);
	return E_FAIL;
}

HRESULT CGObjectManager::AddItemOnce(LPCTSTR ObjName)
{
	LONG idx=GetItemIndex(ObjName);
	if(idx<0||idx>=m_ObjCount)	return E_FAIL;
	m_iObjPackage[idx]=1;
	return S_OK;
}

HRESULT CGObjectManager::RenderOBJList()
{
	static RECT rt={320-120,100,320+120,18*14+100};
	
	GAFDDraw.GetBack()->BltFastTo(&OBJDialog,0,0,FALSE,&rt,TRUE);
	GAFDDraw.GetBack()->AlphaConstBlt(&OBJDialog,rt.left,rt.top,192,FALSE,NULL,TRUE);
	GAFDDraw.GetBack()->TextXY(210,100,0xFFFF,"RPG道具箱");
	GAFDDraw.GetBack()->TextXY(300,100,0xFFFFFF,"(请双击使用道具)");

	GAFDDraw.GetBack()->TextXY(200,100+18*2,0xFF00," —————<上一页>—————");
	GAFDDraw.GetBack()->TextXY(200,100+18*13,0xFF00," —————<下一页>—————");

	for(int i=m_iListTop,Line=100+18*3;
		i<m_ObjCount&&i<m_iListTop+MAXITEM_SHOWINLIST;
		i++,Line+=18)
	{
		LONG Color=(i==m_iListSelect)?0xFFFF:0xFFFFFF;
		if(m_iObjPackage[i]<=0) Color=0x808080;
		GAFDDraw.GetBack()->TextXY(240,Line,Color,GetItemName(i));
		CHAR NumStr[100]="×  ";
		itoa(m_iObjPackage[i],NumStr+4,10);
		GAFDDraw.GetBack()->TextXY(360,Line,Color,NumStr);
	}

	return S_OK;
}

HRESULT CGObjectManager::ProcessOBJList()
{
	GAFDInput.Update(TRUE,TRUE);

	if(GAFDInput.GetKeyState(DIK_ESCAPE)==GAFDIKEY_RELEASE
		||GAFDInput.GetMouseKeyState(DIK_MOUSERIGHT)==GAFDIKEY_RELEASE)
	{
		m_iListSelect=-1;
		return S_OK;
	}

	if(GAFDInput.GetMouseKeyState(DIK_MOUSELEFT)==GAFDIKEY_RELEASE)
	{
		LONG lX,lY;
		GAFDInput.GetSysMousePos(&lX,&lY);
		AdjustMousePosition(&lX,&lY);
		
		//向下翻页
		if(lX>=320-80&&lX<320+80&&lY>=100+18*13&&lY<100+18*14) m_iListTop++;
		if(m_iListTop+MAXITEM_SHOWINLIST>=m_ObjCount)
			m_iListTop=m_ObjCount-MAXITEM_SHOWINLIST;
			
		//向上翻页
		if(lX>=320-80&&lX<320+80&&lY>=100+18*2&&lY<100+18*3) m_iListTop--;
		if(m_iListTop<0) m_iListTop=0;

		BOOL SelectFlag=FALSE;
		for(int i=0,Line=100+18*3;
			i<MAXITEM_SHOWINLIST&&(i+m_iListTop<m_ObjCount);
			i++,Line+=18)
		{
			if(lX>=320-80&&lX<320+80
				&&lY>=Line&&lY<Line+18
				&&m_iObjPackage[i+m_iListTop]>0)	//点选中某个道具
			{
				SelectFlag =TRUE;
				LONG IDX=i+m_iListTop;
				if(IDX!=m_iListSelect)	m_iListSelect=IDX;
				else
				{
					HRESULT hr=UseItem(IDX);
					TESTHR_RET(hr);
				}
			}
		}
		if(!SelectFlag) m_iListSelect=-1;
	}
		
	return STILL_INPRROCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -