求问一本小说,应该是今年写的,主角重生成为一直鸟系妖怪,立志要学成五色神光,前期有加入个势力_百度知道游戏开发技术总结(经典之作)第十二集
游戏角色的生命、经验值等进行详说 - 博客频道 - CSDN.NET
游戏开发实验室_孙广东
做什么事,喜欢最重要!
分类:游戏开发技术总结(经典之作)
本集源代码下载地址-------&游戏开发技术总结(经典之作)第十二集
&&&&&& 我们规定,在人与动物相遇打斗时,生命值man[q].smz随对方的攻击力而减少。当
对象生命值减少到一定程度时,我们就认为这个对象生命终结了。对比动画的表现有
一个对象倒地的过程,倒地后的残体还应该慢慢的化解,到最后消失。下面我们在程
序中加入这种过程的算法。这些算法多数是在原来的程序中加入的,所以我们就按修
改程序的顺序来讲解。
对象生命值结束后的倒地和残体化解都是动画的变换过程; 所以在设置活动对象
初值函数中,对倒地和残体化解应该有单独的处理。
void game::setman(int q)//设置活动对象初值
1{ if(man[q].zs&3){man[q].zs++;} //倒地后,转为下一动作。
2 if(man[q].smz&-1&&man[q].smz&1){man[q].zs=4;} //生命值以完,转为倒地。
aa: int a=400;
2 行是生命值小于1时,对象的动作转为倒地。加上大于-1的判断是
在对象倒地后,man[q].smz用于它用。
在活动对象的移动函数中,应该把倒地和残体化解的过程屏蔽,死了的对象不能
再动了嘛。
void game::manmove(int i)//活动对象的移动
{ if(man[i].smz&1) //生命值小于正常返回,不要移
同理,对象倒地和残体化解也不做方位转换了,所以也应该在方位转换函数中将
它屏蔽。但是倒地和残体化解的动画过程还有,所以设置活动对象初值setman(q)还是
void game::bianfw(int q)//方位转换
{ if(man[q].smz&1)
{setman(q);} //对象倒地以后不做方位转换
不同的动物其生命值、攻击力也不同。我们用一个全局定义的二维数组来表示。
unsigned short smz[2][7]={ 60, 50, 30, 20,40, 10, 15, //生命值
10, 8, 6, 3, 5, 1, 2 };//攻击力
//兽[ 0豹 1 狼 2 猪 3 鹿 4 马 5 雀 6 羊 ]
siz[n][m] n=0为生命值,n=1为攻击力
m 为不同的动物m{0豹1狼2猪3鹿4马5雀6羊}
例如:siz[0][2]表示猪的生命值;siz[1][2]表示猪的攻击力。
人有一个初始的生命值,我们允许人的生命值可以用其它方式增加。人还有一个
初始的攻击力我们称为经验值,人的经验值可以在猎物中增加。我们还可以设置人的
金钱、猎物拥有量等。
在 game.h中我们定义一维数组来表示人的生命值等的拥有量
short int mansmz[5]; //0生命1经验2金钱3猎物4
game.cpp 中init()程序初始化时赋与初值。
mansmz[0]=200; //生命
mansmz[1]=5; //经验
mansmz[2]=10; //金钱
mansmz[3]=20; //猎物
mansmz[4]=0; //其它
//**************************************************
// Insert() //添加物品
// 在man[]中顺序加入物品,加入后对象数rs 加1。
//**************************************************
void game::Insert() //添加物品
{ int a=rand()%100+5; //随机产生物品数
for (int i=0;i&a;i++)
{if(rs&SU_LIANG-2)//AfxMessageBox(&对象数超出!&);
man[i].jisu=i+1; //序号
man[i].lb=3; //类别:0 人1 兽2 景3 物
man[i].p=rand()%4; //静物图形号
man[i].xix=man[i].x0=rand()%(WIDTH*SCRP0-10); //随机产生位置x
man[i].xiy=man[i].y0=rand()%(HEIGHT*SCRP0-10); //随机产生位置y
if(getpic(i,0)==FALSE)
man[i].w=w; man[i].h=h; //对象的尺寸
rs++; //对象数加1
&&&&&& 还有一项重要的修改,就是在原来调入、读取资源压缩包的地方加入物品压缩包。
常数定义.h中加入
#define WBUF 10 //物最大数
Game.h 中加入
CFile sfile,rfile,jfile, //压缩资源包的文件指针
BYTE * stmp,*rtmp,*jtmp,* //压缩的内存变量
int wbufadd[10]; //物的资源指针
Game.cpp 的调压缩资源包中加入
void gamepro::loaddata()//调压缩资源包
cc=dir+&物.dar&; //读物品的数据指针
f=fopen(cc,&r&);
if(f==NULL)
fscanf(f,&%d&,&len);
for(i=0;i&i++)
fscanf(f,&%d,%d,%d&,&wbufadd[i],&j,&j);//读图形的位置
fclose(f);
cc=dir+&物.gam&; //读物品的压缩包
if( !wfile.Open(cc, CFile::modeRead, NULL ) )
Game.cpp 的调图片中加入
BOOL game::getpic(int q,int a)//调图片
if(man[q].lb==3) //是调物品
{if(p&WBUF-1) return FALSE;
len=wbufadd[p+1]-wbufadd[p]; //取数据块长度
tmp=(BYTE *)new BYTE[len];
Memcpy0(tmp,wtmp+wbufadd[p],len);
&&&&&&& 在时钟函数的显示信息段加入人牺牲后的结束游戏的处理和在主界面显示生命
值、经验值,金钱、食物等信息的代码。
void CMyDlg::OnTimer(UINT nIDEvent) //时钟函数
{ if(nIDEvent==1) //动画刷屏
if(nIDEvent==2) //显示信息
{char cc[255],c1[255];
int q=m_game.
1 if(m_game.man[q].smz&-5) //人倒,开始计时。
2 {KillTimer(1);KillTimer(2);
3 MCIWndStop(hMCI);
4 AfxMessageBox(&你牺牲了! 游戏结束。&);
6 setsmz(m_game.man[q].smz,0);
7 setsmz(m_game.mansmz[1],1);
8 sprintf(cc,&金钱:%d&,m_game.mansmz[2]);
9 SetDlgItemText(IDC_STATIC9,cc);
10 sprintf(cc,&食物:%d&,m_game.mansmz[3]);
11 SetDlgItemText(IDC_STATIC10,cc);
第1~5行是人牺牲后的结束游戏的处理。
第 6行显示人的生命值。
第 7行显示人的经验值。
第 8~11行显示人的金钱、食物等信息。
12-6-2 新加主界面上显示生命值函数
这是一个最简单的生命值图形显示方式。读者可以在此基础上改成更生动好看的
void CMyDlg::setsmz(int h,int a)
{ CClientDC dc(this); //取客户区设备环境
1 int x,y;
2 int s=m_game.mansmz[0];
3 char cc[255];
4 CBrush Brush(RGB(120,120,130));
5 dc.SelectObject(Brush);
6 if(a==0) // 在主界面左下方显示生命值图
7 {x=3;y=500;
8 dc.PatBlt(x,y,40,50,PATCOPY);
9 CBrush Brush(RGB(200,0,0));
10 dc.SelectObject(Brush);
11 dc.PatBlt(x,y+51-h*50/s,40,h*50/s,PATCOPY);
12 sprintf(cc,&生命:%d&,h);
13 SetDlgItemText(IDC_STATIC7,cc);
14 if(a==1) // 在主界面右下方显示经验值图示
15 {x=600;y=500;
16 dc.PatBlt(x,y,40,50,PATCOPY);
17 CBrush Brush(RGB(0,0,200));
18 dc.SelectObject(Brush);
19 dc.PatBlt(x,y+50-h*50/20,40,h*50/20,PATCOPY);
20 sprintf(cc,&经验:%d&,h);
21 SetDlgItemText(IDC_STATIC8,cc);
第1行 定义显示的x,y坐标。
第 2行 取人的生命值。
第 4行 定义灰色刷子。
第 5行 置当前显示设备环境为灰色
第 6行a=0时第7~13行在主界面左下方显示生命值图示
第 7行 设显示坐标。
第 8行 在当前显示设备显一个40×50的灰色矩形。
第 9行 定义红色刷子
第 10行置当前显示设备环境为红色
第 11行在当前显示设备显一个表示当前生命值的红色矩形。
第 12、13行在IDC_STATIC7上显示生命数值。
第 14~21行在主界面右下方显示经验值图示。
到此,我们的游戏中生命值和有关的修改基本完成。现在再进入游戏中可要小心
了,这下可是“要命” 的了;当然你可以拾红色的药瓶为你加生命值??。有关游戏
情节设计和玩法设计就留给读者自己去发挥了。