📄 cgame.cpp
字号:
if(x<0)
x=0;
if(x>=m_pMap->m_head.Width)
x=m_pMap->m_head.Width-1;
if(y<0)
y=0;
if(y>=m_pMap->m_head.Height)
y=m_pMap->m_head.Height-1;
pPlayer->pRole->x=x<<5;
pPlayer->pRole->y=y<<5;
m_pPlayer=pPlayer;
m_pPlayer->pRole->nKinds=0;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//清除临时角色障碍表
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ClearRoleBlock()
{
POINT pt;
while(m_pRoleBlock->Pop(pt))
{
m_pMap->m_ppTile[pt.x][pt.y].bCross=true;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//设置角色临时障碍表
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::SetRoleBlock()
{
m_pRoleBlock->Clear();
POINT pt;
STRenderRole*pNpc=NULL;
pt.x=m_pPlayer->pRole->x>>5;
pt.y=m_pPlayer->pRole->y>>5;
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
if(!m_pPlayer->pRole->bOffsiteOk) //如果此角色还没有移动到位,就设置当前格子和目的格子作为障碍
{
switch(m_pPlayer->pRole->nDirection)
{
case LOA_ROLE_DIR_DOWN:
{
pt.y++;
if(pt.y<m_pMap->m_head.Height)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
case LOA_ROLE_DIR_UP:
{
pt.y--;
if(pt.y>=0)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
case LOA_ROLE_DIR_LEFT:
{
pt.x--;;
if(pt.x>=0)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
case LOA_ROLE_DIR_RIGHT:
{
pt.x++;
if(pt.x<m_pMap->m_head.Width)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
}
}
DWORD dwTempAddr=m_pNpcList->GetCurAddress();
m_pNpcList->ResetToHead();
while(m_pNpcList->GetAndMovePointToNext(pNpc))
{
pt.x=pNpc->pRole->x>>5;
pt.y=pNpc->pRole->y>>5;
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
if(pNpc->pRole->bStandNPC || ( pNpc->pRole->bOffsiteOk)) //如果此NPC不移动或者移动完成了
{
continue;
}
switch(pNpc->pRole->nDirection)
{
case LOA_ROLE_DIR_DOWN:
{
pt.y++;
if(pt.y<m_pMap->m_head.Height)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
case LOA_ROLE_DIR_UP:
{
pt.y--;
if(pt.y>=0)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
case LOA_ROLE_DIR_LEFT:
{
pt.x--;;
if(pt.x>=0)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
case LOA_ROLE_DIR_RIGHT:
{
pt.x++;
if(pt.x<m_pMap->m_head.Width)
{
if(m_pMap->m_ppTile[pt.x][pt.y].bCross==true)
{
m_pRoleBlock->Push(pt);
m_pMap->m_ppTile[pt.x][pt.y].bCross=false;
}
}
}
break;
}
}
m_pNpcList->SetCurAddress(dwTempAddr);
}
////////////////////////////////////////////////////////////////////////////////////////////
//NPC随机移动
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::NpcRandomMove()
{
DWORD dwTempAddr=m_pNpcList->GetCurAddress();
m_pNpcList->ResetToHead();
STRenderRole*pNpc=NULL;
while(m_pNpcList->GetAndMovePointToNext(pNpc))
{
if(pNpc->pRole->bStandNPC) //如果此NPC不移动
{
pNpc->pRole->MoveAni();
continue;
}
DWORD dwTempAddr=m_pNpcList->GetCurAddress();//保存NPC链表状态
//如果NPC旬路时间间隔大于设定的时间
if(timeGetTime()-pNpc->pRole->dwOldPlanTime > pNpc->pRole->dwFindRoadDelay )
{
//如果上一次移动还没有完成
if(!pNpc->pRole->bMoving)
{
pNpc->pRole->dwOldPlanTime=timeGetTime();
int DestX=rand()%(m_pMap->m_head.Width);
int DestY=rand()%(m_pMap->m_head.Height);
pNpc->pRole->MoveTo(m_pLog,this,DestX,DestY);
}
else //否则,开始新的旬路
{
pNpc->pRole->MoveTo(m_pLog,this,pNpc->pRole->DestPosX,pNpc->pRole->DestPosY);
}
}
else
{
if(pNpc->pRole->bMoving)
pNpc->pRole->MoveTo(m_pLog,this,pNpc->pRole->DestPosX,pNpc->pRole->DestPosY);
else
pNpc->pRole->MoveAni();
}
//恢复NPC链表状态
m_pNpcList->SetCurAddress(dwTempAddr);
}
m_pNpcList->SetCurAddress(dwTempAddr);
}
////////////////////////////////////////////////////////////////////////////////////////////
//退出游戏
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::QuitGame(int ExitCode)
{
PostMessage(m_hWnd,WM_DESTROY,0,0);
}
////////////////////////////////////////////////////////////////////////////////////////////
//播放媒体
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::PlayMedia(char*szFile,BOOL bLoop,BOOL bWait,BOOL bBreakIfPressKey)
{
LOA_ASSERT(szFile!=NULL);
m_pDShow->StopAndRelease();
delete m_pDShow;
m_pDShow=KGDShow::KGDShowCreate();
if(!m_pDShow->LoadMedia(szFile))
return false;
char strTemp[128];
strcpy(strTemp,szFile);
strcpy(this->m_szCurrentMusicFile,strTemp); //为防止szFile等于自身
m_pDShow->Play(m_hWnd,bLoop);
if(bWait)
{
WaitMediaPlayOK(bBreakIfPressKey);
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//暂停
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::PauseMedia()
{
return m_pDShow->Pause();
}
////////////////////////////////////////////////////////////////////////////////////////////
//恢复
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::ResumeMedia()
{
return m_pDShow->Continue();
}
////////////////////////////////////////////////////////////////////////////////////////////
//等待媒体播放完成(同步)
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::WaitMediaPlayOK(BOOL bBreakIfPressKey)
{
MSG msg;
while(m_bPlayGame)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(m_bActive)
{
if(bBreakIfPressKey)
{
BYTE key=m_pKeyBoard->ReadLastBufferKey();
if(key==DIK_ESCAPE || key==DIK_RETURN)
{
m_pDShow->StopAndRelease();
break;
}
}
if(!m_pDShow->IsPlaying())
{
break;
}
}
else
WaitMessage();
}
::UpdateWindow(m_hWnd);
::SetForegroundWindow(m_hWnd);
::SetFocus(m_hWnd);
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//锁定游戏速度
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::LockFPS()
{
//-------------------------------------------------------------------//
static DWORD odt=timeGetTime();
while(timeGetTime()-odt<30) //锁定fps为30
;
odt=timeGetTime();
//------------------------------------------------------------------//
}
////////////////////////////////////////////////////////////////////////////////////////////
//延时
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::Delay(DWORD dwDelay)
{
DWORD dwOldTime=timeGetTime();
MSG msg;
while(m_bPlayGame)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(m_bActive)
{
if(timeGetTime()-dwOldTime > dwDelay)
break;
SortAndShowRole();
UpdateScreen();
}
else
WaitMessage();
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//显示一幅JPG图片,附带文字说明(比如游戏开头动画),如果szJPEG=NULL就不用图片
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::ShowStaticPictureWithMessage(char*szJPEG,char*str)
{
LOA_ASSERT(str);
LOA_ASSERT(szJPEG);
CSurface*pTemp=NULL;
FadeIn();
if(strcmp(szJPEG,"NULL")==0)
{
if(FAILED(m_pDisplay->CreateSurface(&pTemp,640,480)))
return false;
pTemp->Clear();
}
else
{
if(FAILED(m_pDisplay->CreateSurfaceFromJPEG(&pTemp,szJPEG)))
return false;
}
//添加一个渲染任务
CRenderPicture*pRenderPic=new CRenderPicture;
pRenderPic->InitRender(m_pDisplay,pTemp);
pRenderPic->CreateTask();
m_pRender->AddTask(pRenderPic);
m_pDisplay->Clear();
m_pDisplay->Blt(0,0,pTemp);
FadeInRestore();
//显示文字
CTalk talk;
talk.ShowMessage(this,str,180,100,220,NULL,RGB(255,0,0),0,16,50,false);
pRenderPic->EndTask();
delete pTemp;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//LOGO循环
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::LogoLoop()
{
PlayMedia( "music\\title.wma",false);
LoadMap("map\\null.lmp");
CSurface*pTemp=NULL;
FadeIn();
if(FAILED(m_pDisplay->CreateSurfaceFromJPEG(&pTemp,"pic\\title\\sea.jpg")))
return false;
CRenderPicture*pRenderPic=new CRenderPicture;
pRenderPic->InitRender(m_pDisplay,pTemp);
pRenderPic->CreateTask();
m_pRender->AddTask(pRenderPic);
m_pDisplay->Clear();
m_pDisplay->Blt(0,0,pTemp);
FadeInRestore();
CTalk talk;
BYTE key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this," 在一片广阔的蓝色海洋上,海鸟们自由的飞翔着…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"在大海中央,有一块大陆,绿阴葱葱。 ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
FadeIn();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
pTemp->DrawJPEG("pic\\title\\sea2.jpg");
m_pDisplay->Clear();
m_pDisplay->Blt(0,0,pTemp);
FadeInRestore();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"这块大陆,叫做亚特兰蒂斯大陆…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"繁荣的大陆上,人们与大自然和睦相处,和平地生活着…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
FadeIn();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
pTemp->DrawJPEG("pic\\title\\battle.jpg");
m_pDisplay->Clear();
m_pDisplay->Blt(0,0,pTemp);
FadeInRestore();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"然而…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"突然有一天,这个大陆上雷电交加,战云密布…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"黑暗王国的战士们,突然闯进了这块和平的大陆,和大陆上的人们展开了激烈的争斗…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"由于长期的爱好和平,这个大陆上的人们早就忘记了战争的存在…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
talk.ShowMessage(this,"对于突发的战争,人们完全没有来得及应付…… ",180,100,220,NULL,RGB(255,0,0),0,16,50,false);
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
FadeIn();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
pTemp->DrawJPEG("pic\\title\\title5.jpg");
m_pDisplay->Clear();
m_pDisplay->Blt(0,0,pTemp);
FadeInRestore();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -