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

📄 mymessage.h

📁 gamecode 很不错的小游戏源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
//*******************************************************
//游戏消息类
//作者:曾铮
//时间:2004年6月 开始
/*/////////////////////////////////////////////////////////////////////////
设计说明:
目前看来,消息这块主要是用于Script类的命令执行和对下一玩家的影响效果。
例如上一玩家使用了让下一玩家停一回合的效果,则用消息类来记录并传递给主程序,在以后执行。
还有Script类得到的消息,将需要处理的命令加入消息堆栈,然后一个个弹出执行。
*//////////////////////////////////////////////////////////////////////////////
#ifndef MyMessage_h_
#define MyMessage_h_

//#include "MyClasses\MyScript.h"    //在这里有这一行的话,就形成了递归包含,不能编译。
#include "MyClasses\MyStack.h"

extern long getfactorycost(int kind);
extern void shownomoney();
extern void showlosemoney();

#define dim(x) (sizeof(x) / sizeof(x[0]))

#define ADDMONEY		0	//加钱
#define ADDEXP			1	//加经验
#define	SHOWPIC			2	//显示图片
#define	PLAYMUSIC		3	//放音乐
#define SHOWMSG			4	//显示信息
#define TIMEGOES		5	//时间经过
#define INBANK			6	//银行事件
#define TOBUILD			7	//建筑事件
#define MINMONEY		8	//减钱
#define USUPERCAR		9	//使用高级汽车
#define USTOPCARD		10	//使用停留卡
#define UREMODICE		11	//使用遥控色子
#define	UTORTCARD		12	//使用乌龟卡
#define INSHOP			13	//商店事件
#define GETLUCKY		14	//拾到卡片
#define	UCOMPMANAGER	15	//使用企业管理者

extern MyBank mybank;
extern MyGame mygame;
extern char showmoney[10];
extern void GL_GamePicShowSilence();
extern void buyinshop(int playerid);
extern steps;

void showbank()
{
	GL_GamePicShowSilence();
	Blt(pBBuf,180,180,bank,GetRect(0,0,640,413),FALSE);
}

template<class elemtype> 
class stack;

typedef union 
{
	int value;
	char* param;
}scrnode;//消息值联合

typedef struct 
{
	int MSGnum;
	scrnode value;
}mymsg;//消息结构


stack<mymsg> MYMSG;//全局消息栈
mymsg msgstruct;//临时消息存放

class MyMessage
{
public:	
	MyMessage();
	static bool PutMSG(int msgnum,int& value);//将数值型命令压入消息堆栈
	static bool PutMSG(int msgnum,char*& value);//将文本或声音、图形型命令压入消息堆栈
	static bool PutMSG(int msgnum);//无参数命令
	
	void RunMSG(const int& PlayerID=-1);//用户接口
	virtual ~MyMessage();
			
};

MyMessage::MyMessage()
{

}
MyMessage::~MyMessage()
{
}

bool MyMessage::PutMSG(int msgnum,int& value)
{
	msgstruct.MSGnum=msgnum;			//得到消息ID
	msgstruct.value.value = value;		//取得消息值
	MYMSG.push(msgstruct);				//将消息压栈	
	return true;
}

bool MyMessage::PutMSG(int msgnum,char*& value)
{
	msgstruct.MSGnum=msgnum;
	unsigned  int i=0;
	msgstruct.value.param=new char[strlen(value)];
	strcpy(msgstruct.value.param,value);	//拷贝消息参数
	MYMSG.push(msgstruct);
	
	return true;
}

bool MyMessage::PutMSG(int msgnum)
{
	msgstruct.MSGnum=msgnum;
	msgstruct.value.value=0;
	MYMSG.push(msgstruct);
	return true;
}

void MyMessage::RunMSG(const int& PlayerID)
{
	while(MYMSG.stackempty()!=true)
	{
		MYMSG.pop(msgstruct);	//弹出消息。
		switch (msgstruct.MSGnum)
		{
			//增加角色金钱:
		case ADDMONEY:
			{
				int getm=msgstruct.value.value;//暂存得到的金钱
				players[PlayerID].ChangeMoney((long)getm);//得到改变金钱
				///////////////////////////////////////////////////
				PressKey(VK_CONTROL,1);
				PlayDirectSound(getmoney);
				RECT rect={0,0,266,198};		//右上角的菜单。
				Blt(pPSur,18*32,8*32,pMenu,rect,false);
				PrintText(pPSur,18*32+25,8*32+30,"获得了金钱!爽!");
				
				_ltoa((long)getm,showmoney,10);
				PrintText(pPSur,18*32+25,9*32+30,"得到金钱:");
				PrintText(pPSur,18*32+160+25,9*32+30,showmoney);

				Sleep(1000);		//显示1秒后自动消失
				GL_GamePicShowSilence();
				Flip();
				/////////////////////////////////////////////////////////
			}
			break;
		//失去金钱:
		case MINMONEY:
			{
				int losem=msgstruct.value.value;
				players[PlayerID].ChangeMoney(-((long)losem));//得到改变金钱
				PressKey(VK_CONTROL,1);
				PlayDirectSound(losemoney);
				RECT rect={0,0,266,198};		//右上角的菜单。
				Blt(pPSur,18*32,8*32,pMenu,rect,false);
				PrintText(pPSur,18*32+25,8*32+30,"不会吧!啊!");	
				
				_ltoa((long)losem,showmoney,10);
				PrintText(pPSur,18*32+25,9*32+30,"失去金钱:");
				PrintText(pPSur,18*32+160+25,9*32+30,showmoney);

				Sleep(1000);		//显示1秒后自动消失
				GL_GamePicShowSilence();
				Flip();
			}
			break;
			//增加角色经验:
		case ADDEXP:
			{
				int gete=msgstruct.value.value;//暂存得到的经验
				players[PlayerID].ChangeExp(gete);//得到改变经验值
				///////////////////////////////////////////////////////////////////////
				PressKey(VK_CONTROL,1);
				PlayDirectSound(getexp);
				RECT rect={0,0,266,198};		//右上角的菜单。
				Blt(pPSur,18*32,8*32,pMenu,rect,false);
				PrintText(pPSur,18*32+25,8*32+32,"获得了经验!");
				
//				_ltoa(players[PlayerID].GetExp(),showmoney,10);
				_ltoa(gete,showmoney,10);
				PrintText(pPSur,18*32+25,9*32+30,"得到经验:");
				PrintText(pPSur,18*32+160+25,9*32+30,showmoney);
				Sleep(1000);		//显示1秒后自动消失
//				PressKey(VK_CONTROL,0);
				GL_GamePicShowSilence();
				Flip();
				/////////////////////////////////////////////////////////
			}
			break;

			//显示消息或文字信息:
		case SHOWMSG:
			{
				PressKey(VK_CONTROL,1);
				Blt(pPSur,6*32,6*32,pDialog1,GetRect(0,0,640,382),false);
				PrintText(pPSur,6*32+25,6*32+5+30,msgstruct.value.param,RGB(0,0,0),TRANSPARENT,RGB(255,255,255),44);
				PrintText(pPSur,12*32+25,16*32,"请按回车键返回",RGB(0,0,0),OPAQUE,RGB(255,255,0),20);
				Sleep(1000);//强制性显示1秒。
				PressKey(VK_RETURN,0);//按回车后消失。
				GL_GamePicShowSilence();
				Flip();
			}
			break;

			//游戏日期的更新显示
		case TIMEGOES:
			{
				//			^o^  ^o^
			}
			break;

			//处理在商店的事件:
		case INSHOP:
			{
				//由于设计关系,这部份不能在这里处理,由全局函数处理
				buyinshop(PlayerID);
			}
			break;
			
			//处理在银行的事件:
		case INBANK:
			{
				showbank();
				int bx=180;
				int by=180;
				Blt(pBBuf,bx+53,by+342,bankbutton,GetRect(0,0,155,50),FALSE);
				Flip();
				int Num=3;//选项个数
				int thechoice=0;//选项
				bool dochoose=true;//在选择之中
				while(dochoose)
				{
					PressKey(VK_CONTROL,1);//吸收Ctrl
					PressKey(VK_RETURN,1);
					PressKey(VK_UP,1);
					PressKey(VK_DOWN,1);
					if( GetAsyncKeyState(VK_RIGHT) )	//下一项
					{
						PressKey(VK_RIGHT,1);
						thechoice=(thechoice+1)%Num;
						showbank();						
						Blt(pBBuf,bx+53+thechoice*(36+155),by+342,bankbutton,\
								GetRect(0,thechoice*50,155,(thechoice+1)*50),FALSE);
						PlayDirectSound(selectsnd);
						Flip();
					}
					if( GetAsyncKeyState(VK_LEFT) )	//上一项
					{
						PressKey(VK_LEFT,1);
						if( thechoice==0 ) 
						{
							thechoice=Num-1;
						}
						else 
						{
							thechoice--;
						}
						showbank();						
						Blt(pBBuf,bx+53+thechoice*(36+155),by+342,bankbutton,\
								GetRect(0,thechoice*50,155,(thechoice+1)*50),FALSE);
						PlayDirectSound(selectsnd);
						Flip();
					}
					if( GetAsyncKeyState(VK_RETURN) )	//确定
					{
						PressKey(VK_RETURN,1);
						switch (thechoice)
						{
						case 0://存款:
							{
								MyMenus menu(150,260,"pics/menu1.fim",540,120,GetRect(0,0,540,120));
								char *howmany[]={"10%","20%","30%","40%","50%","取消"};
								int percent;
								percent=menu.ShowtMenu("请选择要存多少:",howmany,6);
								switch (percent)
								{
								case 0://存10%,下同。
									{
										long temp= (long)(players[PlayerID].GetMoney()*0.1);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(-temp);
										mybank.SaveM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 1://
									{
										long temp=(long)(players[PlayerID].GetMoney()*0.2);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(-temp);
										mybank.SaveM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 2://
									{
										long temp=(long)(players[PlayerID].GetMoney()*0.3);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(-temp);
										mybank.SaveM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 3://
									{
										long temp=(long)(players[PlayerID].GetMoney()*0.4);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(-temp);
										mybank.SaveM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 4://
									{
										long temp=(long)(players[PlayerID].GetMoney()*0.5);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(-temp);
										mybank.SaveM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 5://
									{
										showbank();						
										Blt(pBBuf,bx+53+thechoice*(36+155),by+342,bankbutton,\
											GetRect(0,thechoice*50,155,(thechoice+1)*50),FALSE);
										Flip();										
									}
									break;
								}//选择存款百分比。
							}
						break;
						case 1://取款
							{
								if(mybank.GetStore(PlayerID)<=0)
								{
									MyMenus menu(150,260,"pics/menu.fim",280,120,GetRect(0,0,280,120));
									char *howmany[]={"确定"};
									menu.ShowtMenu("您没有余款",howmany,1);
									showbank();						
									Blt(pBBuf,bx+53+thechoice*(36+155),by+342,bankbutton,\
										GetRect(0,thechoice*50,155,(thechoice+1)*50),FALSE);
									Flip();	
									break;									
								}
								MyMenus menu(150,260,"pics/menu.fim",280,120,GetRect(0,0,280,120));
								char *howmany[]={"50%","420%","30%","240%","10%","取消"};
								int percent;
								percent=menu.ShowtMenu("请选择要取多少:",howmany,6);
								switch (percent)
								{
								case 0://存10%,下同。
									{
										long temp= (long)(mybank.GetStore(PlayerID)*0.1);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(temp);
										mybank.GetM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 1://
									{
										long temp=(long)(mybank.GetStore(PlayerID)*0.2);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(temp);
										mybank.GetM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 2://
									{
										long temp=(long)(mybank.GetStore(PlayerID)*0.3);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(temp);
										mybank.GetM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 3://
									{
										long temp=(long)(mybank.GetStore(PlayerID)*0.4);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(temp);
										mybank.GetM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 4://
									{
										long temp=(long)(mybank.GetStore(PlayerID)*0.5);
										if(temp<=0)
											break;
										players[PlayerID].ChangeMoney(temp);
										mybank.GetM(PlayerID,temp);
										dochoose=false;
									}
									break;
								case 5://
									{
										showbank();						
										Blt(pBBuf,bx+53+thechoice*(36+155),by+342,bankbutton,\
											GetRect(0,thechoice*50,155,(thechoice+1)*50),FALSE);
										Flip();										
									}
									break;
								}//选择存款百分比。
							}
							break;
						case 2://退出
							{
								dochoose=false;
								MyMenus menu(150,260,"pics/menu.fim",280,120,GetRect(0,0,280,120));
								char *howmany[]={"确定"};
								menu.ShowtMenu("欢迎下次光临",howmany,1);
							}
							break;
						}
					}	
				}
			}
			break;

			//处理在建筑用地上的事件:
		case TOBUILD:
			{
				int tempx=(players[PlayerID].x+16)/32;
				int tempy=(players[PlayerID].y+47)/32;
				int bkind=maps.GetBuildKind(tempx,tempy);
				GL_GamePicShowSilence();//显示背景图片。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -