📄 cbuyandsell.cpp
字号:
//--------------------------------------------------------------------------------------------------------
// 游戏买卖模块
//CBuyAndSell.cpp
//游戏引擎中的买卖部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/7/28 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include"CBuyAndSell.h"
#include"CMenu.h"
#include"CGame.h"
#include"CButton.h"
#include"CMessage.h"
#include"CGraph.h"
#include"CUserInterface.h"
#include"CFont.h"
#include"CGoods.h"
#include"CRole.h"
#include"CBattle.h"
#include"CText.h"
#include"CMessageBox.h"
#include"CMacro.h"
#include<stdio.h>
int CBuyAndSellMenu::ShowBuyMenu(CGame*pGame,char*szKey,char*szGoodsFile)
{
LOA_ASSERT(pGame);
LOA_ASSERT(szGoodsFile);
CRender*pRender=new CRender;
if(!pRender)
return false;
CRenderMenuShowBuyAndSell*pMenu=new CRenderMenuShowBuyAndSell;
if(!pMenu || !pMenu->InitMenu(pGame,"pic\\system\\item.bmp"))
return false;
pMenu->CreateTask(true,true,32);
CListBox*pListBox=new CListBox;
if(!pListBox || !pListBox->InitTable(pGame->GetDisplay(),120,152,33))
return false;
pListBox->CreateTask();
char strID[1024];
memset(strID,0,1024);
::GetPrivateProfileString(szKey,"GoodsData","",strID,1024,szGoodsFile);
char temp[128];
int i=0;
int j=0;
int goodID;
STGood*pGood=NULL;
int aShowGoodsID[LOA_MAX_CARRY_GOODS];
for(i=0;i<LOA_MAX_CARRY_GOODS;i++)
{
aShowGoodsID[i]=0;
}
int nCurrentShopGoodsNum=0;
i=0;
while(strID[i])
{
memset(temp,0,128);
j=0;
while(strID[i]!=',' && strID[i]!='\0')
{
temp[j++]=strID[i];
i++;
}
i++; //跳过逗号
sscanf(temp,"%d",&goodID); //得到ID
if(pGame->GetGoodsDataBase()->FindData(goodID,&pGood))
{
aShowGoodsID[nCurrentShopGoodsNum++]=goodID;
pListBox->InsertString(pGood->szName);
if(nCurrentShopGoodsNum>=LOA_MAX_CARRY_GOODS)
break;
}
}
if(pListBox->GetCurrentElemCount()!=0)
{
pListBox->SelectNextElem();
}
pRender->AddTask(pMenu);
pRender->AddTask(pListBox);
CDisplay*pDisplay=pGame->GetDisplay();
CFont font;
font.CreateFont(25,800);
CFont fontgoods;
fontgoods.CreateFont();
HDC hdc;
MSG msg;
while(pGame->IsPlayGame())
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(pGame->IsActive())
{
int id=pListBox->GetCurrentSelect()-1;
if(id<0)
{
CRenderRoleGoods*pRenderGoods=new CRenderRoleGoods;
pRenderGoods->CreateTask();
pRenderGoods->SetRender(pDisplay,&fontgoods,NULL);
pRender->AddTask(pRenderGoods);
}
else if(pGame->GetGoodsDataBase()->FindData(aShowGoodsID[id],&pGood))
{
CRenderRoleGoods*pRenderGoods=new CRenderRoleGoods;
pRenderGoods->CreateTask();
pRenderGoods->SetRender(pDisplay,&fontgoods,pGood);
pRender->AddTask(pRenderGoods);
}
BYTE key=pGame->GetKeyBoard()->ReadLastBufferKey(50);
switch(key)
{
case DIK_UP:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
{
pListBox->SelectPrevElem();
}
}
break;
case DIK_DOWN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
{
pListBox->SelectNextElem();
}
}
break;
case DIK_RETURN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_RETURN,100))
{
if(id>=0)
{
CMessageBox msgbox;
if(pGood)
{
if(pGame->GetPlayer()->pRole->Money<(int)pGood->dwPrice)
{
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"钱不够!");
}
else if(pGame->GetPlayer()->pRole->GoodsNum>=LOA_MAX_CARRY_GOODS)
{
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"不能再携带更多的物品了!");
}
else
{
if(LOA_MSG_BOX_IDYES==msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_YESNO,"确实要买进这个物品么?"))
{
pGame->GetPlayer()->pRole->Money-=pGood->dwPrice;
pGame->GetPlayer()->pRole->AddGoods(pGood->ID);
}
}
}
}
}
}
break;
case DIK_ESCAPE:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_ESCAPE,100))
{
goto _out;
}
}
break;
}
pDisplay->Clear();
pRender->Render();
pDisplay->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SelectObject(hdc,font.GetFont());
::SetTextColor(hdc,RGB(255,0,0));
::TextOut(hdc,100,65,"待售物品",strlen("待售物品"));
::TextOut(hdc,380,55,"物品预览",strlen("物品预览"));
pDisplay->GetBackBuffer()->ReleaseDC(hdc);
pGame->ShowFPS();
pDisplay->Present();
}
else
WaitMessage();
}
_out:
delete pRender;
return 1;
}
int CBuyAndSellMenu::ShowSellMenu(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return false;
CRenderMenuShowBuyAndSell*pMenu=new CRenderMenuShowBuyAndSell;
if(!pMenu || !pMenu->InitMenu(pGame,"pic\\system\\item.bmp"))
return false;
pMenu->CreateTask(true,true,32);
CListBox*pListBox=new CListBox;
if(!pListBox || !pListBox->InitTable(pGame->GetDisplay(),120,152,33))
return false;
pListBox->CreateTask();
STGood*pGood=NULL;
for(int i=0;i<LOA_MAX_CARRY_GOODS;i++)
{
if(pGame->GetGoodsDataBase()->FindData(pGame->GetPlayer()->pRole->GoodsData[i],&pGood))
{
pListBox->InsertString(pGood->szName);
}
}
if(pListBox->GetCurrentElemCount()!=0)
{
pListBox->SelectNextElem();
}
pRender->AddTask(pMenu);
pRender->AddTask(pListBox);
CDisplay*pDisplay=pGame->GetDisplay();
CFont font;
font.CreateFont(25,800);
CFont fontgoods;
fontgoods.CreateFont();
HDC hdc;
MSG msg;
while(pGame->IsPlayGame())
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(pGame->IsActive())
{
int id=pListBox->GetCurrentSelect()-1;
if(id<0)
{
CRenderRoleGoods*pRenderGoods=new CRenderRoleGoods;
pRenderGoods->CreateTask();
pRenderGoods->SetRender(pDisplay,&fontgoods,NULL);
pRender->AddTask(pRenderGoods);
}
else if(pGame->GetGoodsDataBase()->FindData(pGame->GetPlayer()->pRole->GoodsData[id],&pGood))
{
CRenderRoleGoods*pRenderGoods=new CRenderRoleGoods;
pRenderGoods->CreateTask();
pRenderGoods->SetRender(pDisplay,&fontgoods,pGood);
pRender->AddTask(pRenderGoods);
}
BYTE key=pGame->GetKeyBoard()->ReadLastBufferKey(50);
switch(key)
{
case DIK_UP:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
{
pListBox->SelectPrevElem();
}
}
break;
case DIK_DOWN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
{
pListBox->SelectNextElem();
}
}
break;
case DIK_RETURN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_RETURN,100))
{
if(id>=0)
{
CMessageBox msgbox;
if(pGood)
{
if(LOA_MSG_BOX_IDYES==msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_YESNO,"确实要卖出这个物品么?"))
{
pGame->GetPlayer()->pRole->Money+=pGood->dwPrice;
pGame->GetPlayer()->pRole->DelGoods(id);
pListBox->DeleteString(id);
if(pListBox->GetCurrentElemCount()!=0)
{
pListBox->SelectPrevElem();
}
}
}
}
}
}
break;
case DIK_ESCAPE:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_ESCAPE,100))
{
goto _out;
}
}
break;
}
pDisplay->Clear();
pRender->Render();
pDisplay->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SelectObject(hdc,font.GetFont());
::SetTextColor(hdc,RGB(255,0,0));
::TextOut(hdc,100,65,"现有物品",strlen("现有物品"));
::TextOut(hdc,380,55,"物品预览",strlen("物品预览"));
pDisplay->GetBackBuffer()->ReleaseDC(hdc);
pGame->ShowFPS();
pDisplay->Present();
}
else
WaitMessage();
}
_out:
delete pRender;
return 1;
}
int CBuyAndSellMenu::ShowSelectBuyAndSell(CGame*pGame,char*szKey,char*szGoodsFile)
{
LOA_ASSERT(pGame);
CDisplay*pDisplay=pGame->GetDisplay();
CSurface*pSurfTemp;
if(FAILED(pDisplay->CreateSurfaceFromJPEG(&pSurfTemp,"pic\\system\\shop.jpg")))
return false;
MSG msg;
while(pGame->IsPlayGame())
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(pGame->IsActive())
{
pDisplay->Clear();
pDisplay->Blt(0,0,pSurfTemp);
CMessageBox msgbox;
int id=msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_BUYSELL,"欢迎光临,有什么需要吗?");
if(id==LOA_MSG_BOX_IDBUY)
ShowBuyMenu(pGame,szKey,szGoodsFile);
else if(id==LOA_MSG_BOX_IDSELL)
ShowSellMenu(pGame);
else
{
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"欢迎再次光临!");
goto _out;
}
}
else
WaitMessage();
}
_out:
delete pSurfTemp;
return 1;
}
BOOL CRenderMenuShowBuyAndSell::InitMenuFromJPEG(CGame*pGame,char*szBackSurf)
{
LOA_ASSERT(pGame);
LOA_ASSERT(szBackSurf);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromJPEG(&m_pBackSurf,szBackSurf)))
return false;
m_pGame=pGame;
return true;
}
BOOL CRenderMenuShowBuyAndSell::InitMenu(CGame*pGame,char*szBackSurf)
{
LOA_ASSERT(pGame);
LOA_ASSERT(szBackSurf);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&m_pBackSurf,szBackSurf,640,480)))
return false;
m_pGame=pGame;
return true;
}
BOOL LOA_RENDER_API CRenderMenuShowBuyAndSell::IsRenderComplete()
{
return false;
}
void LOA_RENDER_API CRenderMenuShowBuyAndSell::Release()
{
if(m_pBackSurf)
{
m_pBackSurf->Destroy();
delete m_pBackSurf;
m_pBackSurf=NULL;
}
}
void LOA_RENDER_API CRenderMenuShowBuyAndSell::Render()
{
m_pGame->GetDisplay()->Blt(0,0,m_pBackSurf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -