📄 objectmanager.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 + -