📄 cgame.cpp
字号:
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->Clear();
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;
FadeIn();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
pTemp->DrawJPEG("pic\\title\\destroy.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;
Delay(2000);
FadeIn();
key=m_pKeyBoard->ReadLastBufferKey(50);
if(key==DIK_ESCAPE)
goto _end;
pTemp->DrawJPEG("pic\\title\\dead.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;
Delay(2000);
_end:
FadeOut();
pRenderPic->EndTask();
delete pTemp;
//*/
//读取开始地图
LoadMap("map\\sea.lmp");
m_nCurrentGameState=LOA_GAME_STATE_NORMAL;
return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////
//从文件中读取角色
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::LoadRole(char *szFile,char*szSection,STRenderRole **ppRole)
{
LOA_ASSERT(ppRole!=NULL);
LOA_ASSERT(szFile!=NULL);
(*ppRole)=new STRenderRole;
(*ppRole)->pRole=new CRole();
if(!m_pGameData->LoadRoleFromIni(szFile,szSection,(*ppRole)->pRole))
return false;
return m_pRoleGraph->GetRoleGraph((*ppRole)->pRole,&(*ppRole)->pGraph);
}
////////////////////////////////////////////////////////////////////////////////////////////
//将屏幕滚到以玩家为中心的地方
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ScrollScreenToPlayer()
{
if(!m_pPlayer)
return;
ScrollScreenTo((m_pPlayer->pRole->x-320)>>5,(m_pPlayer->pRole->y-224)>>5);
}
////////////////////////////////////////////////////////////////////////////////////////////
//将屏幕滚到以id为ID的NPC为中心的地方
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ScrollScreenToNpc(int ID)
{
STRenderRole*pNpc=NULL;
if(m_pNpcList->FindData(ID,pNpc))
{
ScrollScreenTo((pNpc->pRole->x-320)>>5,(pNpc->pRole->y-224)>>5);
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//将屏幕滚到图块坐标为TileX,TileY的地方
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ScrollScreenTo(int TileX,int TileY)
{
MSG msg;
int NowX=m_pRenderMap->m_xStart;
int NowY=m_pRenderMap->m_yStart;
if(TileY>=m_pMap->m_head.Height-15)
TileY=m_pMap->m_head.Height-16;
if(TileY<0)
TileY=0;
if(TileX>=m_pMap->m_head.Width-20)
TileX=m_pMap->m_head.Width-21;
if(TileX<0)
TileX=0;
int EndX=TileX<<5;
int EndY=TileY<<5;
while(m_bPlayGame)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(m_bActive)
{
if(NowX==EndX && NowY==EndY)
break;
m_pMsg->ExecuteMessage(); //执行消息队列中的消息
//------------------------------------------------------------------//
//------------------------------------------------------------------//
NpcRandomMove(); //npc随机移动
//------------------------------------------------------------------//
//------------------------------------------------------------------//
SortAndShowRole();
if(NowX!=EndX)
{
if(NowX<EndX)
{
NowX+=6;
if(NowX>EndX)
NowX=EndX;
}
else
{
NowX-=6;
if(NowX<EndX)
NowX=EndX;
}
}
if(NowY!=EndY)
{
if(NowY<EndY)
{
NowY+=6;
if(NowY>EndY)
NowY=EndY;
}
else
{
NowY-=6;
if(NowY<EndY)
NowY=EndY;
}
}
m_pRenderMap->m_xStart=NowX;
m_pRenderMap->m_yStart=NowY;
UpdateScreen();
}
else
WaitMessage();
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//对NPC按Y坐标进行排序
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::SortAndShowRole()
{
if(!m_pPlayer)
return;
STRenderRole*pNpc=NULL;
DWORD dwTempAddr=m_pNpcList->GetCurAddress();
m_pNpcList->ResetToHead();
m_pRoleQueue->Clear();
while(m_pNpcList->GetAndMovePointToNext(pNpc))
{
m_pRoleQueue->EnQueue(pNpc,pNpc->pRole->y);
}
m_pNpcList->SetCurAddress(dwTempAddr);
m_pRoleQueue->EnQueue(m_pPlayer,m_pPlayer->pRole->y); //按照角色Y轴坐标大小从新排序,保证上面的角色被下面的角色遮挡
m_pRenderRole=new CRenderRole();
m_pRenderRole->CreateTask(true,true,8); //创建一个自动释放的任务
m_pRenderRole->InitRender(m_pDisplay,m_pMap,m_pMapSurface,m_pRenderMap,m_pRoleQueue);//更新渲染队列
m_pRender->AddTask(m_pRenderRole); //添加任务
}
////////////////////////////////////////////////////////////////////////////////////////////
//计算屏幕上该从何处显示地图
////////////////////////////////////////////////////////////////////////////////////////////
void CGame::ComputeMapStartPos()
{
if(!m_pMapRole)
return;
m_pRenderMap->m_yStart=m_pMapRole->pRole->y-224;
m_pRenderMap->m_xStart=m_pMapRole->pRole->x-320;
if((int)m_pRenderMap->m_yStart<0)
m_pRenderMap->m_yStart=0;
if(m_pRenderMap->m_yStart > (DWORD)(m_pMap->m_head.Height<<5)-480)
m_pRenderMap->m_yStart=(m_pMap->m_head.Height<<5)-480;
if((int)m_pRenderMap->m_xStart<0)
m_pRenderMap->m_xStart=0;
if(m_pRenderMap->m_xStart >(DWORD)(m_pMap->m_head.Width<<5)-640)
m_pRenderMap->m_xStart =(DWORD)(m_pMap->m_head.Width<<5)-640;
if(m_bDitherScreen)
{
m_pRenderMap->m_yStart+=rand()%10;
m_pRenderMap->m_xStart+=rand()%10;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//显示开始菜单
////////////////////////////////////////////////////////////////////////////////////////////
int CGame::ShowBeginMenu()
{
SetDay();
PlayMedia("music\\begin.wma");
//创建临时表面
CSurface*pSurfTemp=NULL;
if(FAILED(m_pDisplay->CreateSurfaceFromJPEG(&pSurfTemp,"pic\\system\\title.jpg")))
return false;
m_pDisplay->Clear();
m_pDisplay->Blt(0,0,pSurfTemp);
FadeInRestore();
CSurface*pSurfText=NULL;
if(FAILED(m_pDisplay->CreateSurface(&pSurfText,640,480)))
return false;
pSurfText->SetColorKey(0);
CIcon icon;
icon.InitIcon(m_pDisplay,LOA_ICON_ARROW);
CFont font;
int nCurrentSelect=0;
int nBlue=0;
int kBlue=1;
int kGreen=-1;
int nGreen=1;
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)
{
BYTE key=m_pKeyBoard->ReadLastBufferKey(50);
switch(key)
{
case DIK_UP:
{
if(m_pKeyBoard->WaitKey(DIK_UP,150))
{
nCurrentSelect--;
if(nCurrentSelect<0)
nCurrentSelect=2;
}
}
break;
case DIK_DOWN:
{
if(m_pKeyBoard->WaitKey(DIK_DOWN,150))
{
nCurrentSelect++;
if(nCurrentSelect>2)
nCurrentSelect=0;
}
}
break;
case DIK_RETURN:
{
if(m_pKeyBoard->WaitKey(DIK_RETURN,150))
{
switch(nCurrentSelect)
{
case 0:
{
delete pSurfText;
delete pSurfTemp;
m_nCurrentGameState=LOA_GAME_STATE_CREDITS;
return 1;
}
break;
case 1:
{
CGameMenu menu;
if(-1==menu.MenuLoop(this,LOA_MENU_STYLE_SHOW_LOAD))
{
delete pSurfText;
delete pSurfTemp;
m_nCurrentGameState=LOA_GAME_STATE_NORMAL;
return LoadGame(this->m_nCurrentSaveFileIndex);
}
}
break;
case 2:
{
PostMessage(m_hWnd,WM_CLOSE,0,0);
}
break;
}
}
}
break;
}
m_pDisplay->Clear();
m_pDisplay->Blt(0,0,pSurfTemp);
pSurfText->Clear();
nGreen+=kGreen;
if(nGreen>254)
{
kGreen=-kGreen;
}
else if(nGreen<1)
{
kGreen=-kGreen;
}
nBlue+=kBlue;
if(nBlue>254)
{
kBlue=-kBlue;
}
else if(nBlue<1)
{
kBlue=-kBlue;
}
font.CreateFont(80,600,true);
pSurfText->DrawText(font.GetFont(),"亚特兰蒂斯传奇",30,80,0,RGB(255,nGreen,nBlue));
font.CreateFont();
pSurfText->DrawText(font.GetFont(),"Game++ Studio,Kylinx 2003-6-16/2003-8-9",300,160,0,RGB(255,0,0));
font.CreateFont(30);
switch(nCurrentSelect)
{
case 0:
{
pSurfText->DrawText(font.GetFont(),"新的故事",280,200,0,RGB(0,0,255));
pSurfText->DrawText(font.GetFont(),"旧的历程",280,280,0,RGB(255,255,255));
pSurfText->DrawText(font.GetFont(),"回到现实",280,360,0,RGB(255,255,255));
icon.Show(260,200);
}
break;
case 1:
{
pSurfText->DrawText(font.GetFont(),"新的故事",280,200,0,RGB(255,255,255));
pSurfText->DrawText(font.GetFont(),"旧的历程",280,280,0,RGB(0,0,255));
pSurfText->DrawText(font.GetFont(),"回到现实",280,360,0,RGB(255,255,255));
icon.Show(260,280);
}
break;
case 2:
{
pSurfText->DrawText(font.GetFont(),"新的故事",280,200,0,RGB(255,255,255));
pSurfText->DrawText(font.GetFont(),"旧的历程",280,280,0,RGB(255,255,255));
pSurfText->DrawText(font.GetFont(),"回到现实",280,360,0,RGB(0,0,255));
icon.Show(260,360);
}
break;
}
m_pDisplay->ColorKeyBlt(0,0,pSurfText->GetDDrawSurface());
m_pDisplay->Present();
}
else
WaitMessage();
}
delete pSurfText;
delete pSurfTemp;
return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////
//产生一个随机敌人
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGame::RandomEnemy(CRole*pRole)
{
LOA_ASSERT(pRole);
if(m_pPlayer->pRole->Level==0)
m_pPlayer->pRole->Level=1;
pRole->Level=m_pPlayer->pRole->Level/2+rand()%m_pPlayer->pRole->Level;
if(pRole->Level==0)
pRole->Level=1;
pRole->Attack=m_pPlayer->pRole->Attack/3+pRole->Level*(rand()%m_pPlayer->pRole->Level);
pRole->Defend=m_pPlayer->pRole->Defend/3+rand()%pRole->Level;
pRole->Hp=m_pPlayer->pRole->MaxHp/2+pRole->Level*(rand()%pRole->Level);
pRole->Mp=m_pPlayer->pRole->MaxMp/2+pRole->Level*(rand()%pRole->Level);
pRole->Exp=(rand()%m_pPlayer->pRole->Level)*5+10;
pRole->Money=(rand()%m_pPlayer->pRole->Level)*30+30;
pRole->MaxHp=pRole->Hp;
pRole->MaxMp=pRole->Mp;
pRole->MaxExp=pRole->Exp;
pRole->GoodsNum=0;
pRole->MagicNum=0;
switch(rand()%6)
{
case 0:
case 1:
case 2:
pRole->Kidney=LOA_KIDNEY_ATTACK;
break;
case 3:
pRole->Kidney=LOA_KIDNEY_DEFEND;
pRole->AddMagic(101);
pRole->AddMagic(102);
pRole->AddMagic(105);
pRole->AddGoods(100);
pRole->AddGoods(101);
pRole->AddGoods(101);
break;
case 4:
pRole->Kidney=LOA_KIDNEY_MAGIC;
pRole->AddMagic(101);
pRole->AddMagic(102);
pRole->AddMagic(103);
pRole->AddMagic(105);
pRole->AddMagic(107);
break;
case 5:
pRole->Kidney=LOA_KIDNEY_ESCAPE;
break;
}
int rnd1=(rand()%7)+1;
switch(rnd1)
{
case 1:
strcpy(pRole->szName,"大卫");
break;
case 2:
strcpy(pRole->szName,"申吟");
break;
case 3:
strcpy(pRole->szName,"丁茶叶");
break;
case 4:
strcpy(pRole->szName,"黄一马");
break;
case 5:
strcpy(pRole->szName,"咪咪");
break;
case 6:
strcpy(pRole->szName,"肾虚");
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -