⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbuyandsell.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 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 + -