📄 gscene.cpp
字号:
{
if(m_RoleArray[roleidx]->GetLevel()!=Level) break;
m_RoleArray[roleidx]->RenderRole();
}
//渲染第Level+1层景物
m_gSceneLayers[Level+1].RenderLayer(m_gGraph,XOff,YOff);
}
GAFDDraw.GetBack()->TextXY(10,30,0xffffff,m_szName);
//显示主角状态
RenderLeaderStatus();
return S_OK;
}
HRESULT CGScene::ProcessScene()
{
assert(m_pGameApp);
while(m_pGameApp->GAFGameStatus == GAF_GAMESTATUS_INSCENE)
{
if(GAFAppProcessMessage()==FALSE) return E_FAIL;
//更新角色状态
GAFDInput.Update(TRUE,TRUE);
for(int i=0;i<CG_NUM_MAXROLEINSCENE;++i)
{
if(m_RoleArray[i]) m_RoleArray[i]->AIThinking();
}
//渲染场景
RenderScene();
GAFDDraw.Present(FALSE,TRUE);
//按下ESC退出程式
if(GAFDInput.GetKeyState(DIK_ESCAPE)==GAFDIKEY_RELEASE) break;
//检测事件触发
SHORT leaderidx=GetLeaderRoleIndex();
if(GAFDInput.GetMouseKeyState(DIK_MOUSELEFT)==GAFDIKEY_RELEASE)
{
LONG lX,lY;
GAFDInput.GetSysMousePos(&lX,&lY);
AdjustMousePosition(&lX,&lY);
//检测是否点击了某个角色
int RolIdx;
for(RolIdx=RoleCount-1;RolIdx>=0;RolIdx--)
{
if(m_RoleArray[RolIdx])
if(m_RoleArray[RolIdx]->CheckMouseHit(lX,lY)) break;
}
if(RolIdx>=0 && RolIdx!=leaderidx) //如果是非主角就运行脚本
{
HRESULT hr = RunScript(m_RoleArray[RolIdx]->GetScriptFileName());
TESTHR_RET(hr);
}
if(RolIdx>=0 && RolIdx==leaderidx) //如果是主角就打开道具选择框
{
while(TRUE)
{
if(GAFAppProcessMessage()==FALSE) return E_FAIL;
RenderScene();
m_gObjManager.RenderOBJList();
GAFDDraw.Present(FALSE,TRUE);
HRESULT hr = m_gObjManager.ProcessOBJList();
TESTHR_RET(hr);
if(hr==S_OK) break; //道具使用完毕
}
}
}
//检测出口触发
SHORT exitidx=CheckEnterExit();
if(exitidx!=-1)
{
LONG STX=m_ExitArray[exitidx].TX;
LONG STY=m_ExitArray[exitidx].TY;
HRESULT hr=LoadScene(m_ExitArray[exitidx].TargetScene);
if(leaderidx!=-1)
m_RoleArray[leaderidx]->SetMapPos(STX,STY);
TESTHR_MSGRET(hr,"RPGDEMO装载场景出错,程式终止!");
}
}
m_pGameApp->GAFGameStatus = GAF_GAMESTATUS_MAINTITLE;
return S_OK;
}
SHORT CGScene::GetLevel(LONG mx,LONG my) const //检测(mx,my)坐标的层次信息
{
assert(m_pMapInfo);
assert(mx>=0&&mx<Width);
assert(my>=0&&my<Height);
MapToCell(mx,my);
WORD Level=m_pMapInfo[my*HCells+mx]>>8;
return Level&0xfffe;
}
BOOL CGScene::CanWalk(LONG mx, LONG my, LPCGRole sender) const //检测sender角色是否可以走到(mx,my)坐标
{
assert(sender);
assert(m_pMapInfo);
if(mx<0||mx>=Width||my<0||my>=Height) return FALSE;
LONG cx=mx,cy=my;
MapToCell(cx,cy);
if(m_pMapInfo[cy*HCells+cx]&0x0001) return FALSE;
int x2,y2,dx,dy;
for(int i=0;i<CG_NUM_MAXROLEINSCENE;i++)
{
if(m_RoleArray[i] && m_RoleArray[i]!=sender)
{
m_RoleArray[i]->GetMapPos(x2,y2);
dx=mx-x2;dy=my-y2;
if(dx*dx+dy*dy<16*16) return FALSE;
}
}
return TRUE;
}
void CGScene::SetScenePosition(int nx, int ny)
{
XPosition = nx;
YPosition = ny;
if(XPosition<0) XPosition=0;
if(YPosition<0) YPosition=0;
if(XPosition>(int)Width-(int)ScreenWidth) XPosition=(int)Width-(int)ScreenWidth;
if(YPosition>(int)Height-(int)ScreenHeight) YPosition=(int)Height-(int)ScreenHeight;
}
void CGScene::FocusSceneCenter(int cx, int cy)
{
LONG sx=(LONG)(ScreenWidth/2);
LONG sy=(LONG)(ScreenHeight/2);
SetScenePosition(cx-sx,cy-sy);
}
SHORT CGScene::AddNewRole(LPCTSTR szFileName,int rXM,int rYM, SHORT rDirection) //增加新的角色
{
if(RoleCount+1>=CG_NUM_MAXROLEINSCENE) return -1;
CGRole* NewRole = new CGRole(this);
if(NewRole==NULL) return -1;
if(FAILED(NewRole->LoadRole(szFileName)))
{
SAFEDELETE(NewRole);
return -1;
}
NewRole->SetDirection(rDirection);
NewRole->SetMapPos(rXM,rYM);
for(int i=0;i<CG_NUM_MAXROLEINSCENE;i++)
if(m_RoleArray[i]==NULL) break;
if(i<CG_NUM_MAXROLEINSCENE)
m_RoleArray[i] = NewRole;
else
{
SAFEDELETE(NewRole);
return -1;
}
RoleCount++;
return i;
}
SHORT CGScene::GetLeaderRoleIndex() const //获取场景主控主角
{
SHORT idx;
for(idx=CG_NUM_MAXROLEINSCENE-1;idx>=0;--idx)
{
if(m_RoleArray[idx])
if(m_RoleArray[idx]->GetFlag()==ROLEFLAG_LEADER) break;
}
return idx;
}
SHORT CGScene::GetRoleIndex(const LPCTSTR szName) const //获取名称对应的角色的索引
{
assert(szName);
string RoleName=szName;
SHORT idx;
for(idx=CG_NUM_MAXROLEINSCENE-1;idx>=0;--idx)
{
if(m_RoleArray[idx])
if(RoleName == m_RoleArray[idx]->GetRoleName())
break;
}
return idx;
}
void CGScene::ClearupROLEArray(BOOL bClearAllRole)
{
RoleCount = 0;
for(int i=0;i<CG_NUM_MAXROLEINSCENE;++i)
if(m_RoleArray[i])
{
if(m_RoleArray[i]->GetFlag()==ROLEFLAG_LEADER) //场景切换的时候不清除主角
{
++RoleCount;
if(bClearAllRole) SAFEDELETE(m_RoleArray[i]);
}
else SAFEDELETE(m_RoleArray[i]);
}
if(bClearAllRole) RoleCount = 0;
}
HRESULT CGScene::InitNewGame()
{
HRESULT hr;
hr = LoadScene("Valley.SCN");
TESTHR_MSGRET(hr,"装载Valley场景出错");
hr = AddNewRole("LeaderHero.ROL",40,400,7);
TESTHR_MSGRET(hr,"装载主角出错");
hr = m_gObjManager.InitObjectList(this);
TESTHR_MSGRET(hr,"初始化道具管理器出错");
hr = m_gObjManager.AddItem("医疗箱",5);
TESTHR_MSGRET(hr,"添加化道具出错");
hr = m_gObjManager.AddItem("魔力草药",2);
TESTHR_MSGRET(hr,"添加化道具出错");
hr = m_gFightMenuManager.InitFightMenu(this);
TESTHR_MSGRET(hr,"战斗菜单初始化错误");
return S_OK;
}
SHORT CGScene::CheckEnterExit()
{
SHORT leaderidx=GetLeaderRoleIndex();
if(leaderidx==-1) return -1;
int lx,ly;
m_RoleArray[leaderidx]->GetMapPos(lx,ly);
POINT pt; pt.x=lx; pt.y=ly;
for(SHORT exitidx=ExitCount-1;exitidx>=0;exitidx--)
{
if(m_ExitArray[exitidx].Enable
&& PtInRect(&(m_ExitArray[exitidx].rt),pt))
break;
}
return exitidx;
}
HRESULT CGScene::MsgBox(const LPCTSTR Captain, const LPCTSTR Msg)
{
assert(m_pGameApp);
assert(Captain);
assert(Msg);
while(TRUE)
{
if(GAFAppProcessMessage()==FALSE) return E_FAIL;
//渲染场景
RenderScene();
//画一个对话框
//未完成
//DEBUG
GAFDDraw.GetBack()->TextXY(100,100,0xFFFF,Captain);
GAFDDraw.GetBack()->TextXY(100,120,0xFFFF,Msg);
GAFDDraw.GetBack()->TextXY(100,160,0xFFFFFF,"点击鼠标左键或者按ESC返回场景...");
GAFDDraw.Present(FALSE,TRUE);
//DEBUG
//输入控制
GAFDInput.Update(TRUE,TRUE);
if(GAFDInput.GetKeyState(DIK_ESCAPE)==GAFDIKEY_RELEASE
||GAFDInput.GetKeyState(DIK_SPACE)==GAFDIKEY_RELEASE
||GAFDInput.GetMouseKeyState(DIK_MOUSELEFT)==GAFDIKEY_RELEASE)
{
break;
}
}
return S_OK;
}
void CGScene::RenderLeaderStatus()
{
LPCGRole pLeaderRole=GetRole(GetLeaderRoleIndex());
assert(pLeaderRole);
static CHAR StatStr[256];
strncpy(StatStr,"HP = ",99);
itoa(pLeaderRole->GetHP(),StatStr+5,10);
strncat(StatStr,"/",99);
itoa(pLeaderRole->GetHP_MAX(),StatStr+strlen(StatStr),10);
GAFDDraw.GetBack()->TextXY(10,420,0xffffff,StatStr);
strncpy(StatStr,"MP = ",99);
itoa(pLeaderRole->GetMP(),StatStr+5,10);
strncat(StatStr,"/",99);
itoa(pLeaderRole->GetMP_MAX(),StatStr+strlen(StatStr),10);
GAFDDraw.GetBack()->TextXY(10,438,0xffffff,StatStr);
strncpy(StatStr,"AP=",99);
itoa(pLeaderRole->GetEAP(),StatStr+3,10);
strncat(StatStr," / DP=",99);
itoa(pLeaderRole->GetEDP(),StatStr+strlen(StatStr),10);
GAFDDraw.GetBack()->TextXY(10,456,0xffffff,StatStr);
}
//***浪人添加*/
void CGScene::RenderBossStatus(LPCGRole pBossRole)
{
assert(pBossRole);
static CHAR StatStr[256];
strncpy(StatStr,"HP = ",99);
itoa(pBossRole->GetHP(),StatStr+5,10);
strncat(StatStr,"/",99);
itoa(pBossRole->GetHP_MAX(),StatStr+strlen(StatStr),10);
GAFDDraw.GetBack()->TextXY(10,30,0xffffff,StatStr);
strncpy(StatStr,"MP = ",99);
itoa(pBossRole->GetMP(),StatStr+5,10);
strncat(StatStr,"/",99);
itoa(pBossRole->GetMP_MAX(),StatStr+strlen(StatStr),10);
GAFDDraw.GetBack()->TextXY(10,48,0xffffff,StatStr);
strncpy(StatStr,"AP=",99);
itoa(pBossRole->GetEAP(),StatStr+3,10);
strncat(StatStr," / DP=",99);
itoa(pBossRole->GetEDP(),StatStr+strlen(StatStr),10);
GAFDDraw.GetBack()->TextXY(10,66,0xffffff,StatStr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -