📄 mymessage.h
字号:
//*******************************************************
//游戏消息类
//作者:曾铮
//时间: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 + -