设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记十六 讲解一个完整的回合制游戏demo (八)
2014-11-23 19:48:53 来源: 作者: 【 】 浏览:76
Tags:Visual 游戏 开发 笔记 十六 讲解 一个 完整 回合 demo
,100,100,bufdc,100,0,SRCAND);
BitBlt(mdc,480,190,100,100,bufdc,0,0,SRCPAINT);

//第30个画面时计算玩家受伤害程度并加入显示消息
if(f == 30)
{
damage = rand()%10 + 3*monster.w;
player.nHp -= (int)damage;

sprintf(str,"怪物释放闪电链...对玩家照成 %d 点伤害",damage);
MsgInsert(str);

CheckDie(player.nHp,true);
}
break;
case 2: //致命一击
SelectObject(bufdc,slash);
BitBlt(mdc,480,150,98,162,bufdc,98,0,SRCAND);
BitBlt(mdc,480,150,98,162,bufdc,0,0,SRCPAINT);

//第30个画面时计算玩家受伤害程度并加入显示消息
if(f == 30)
{
damage = rand()%10 + monster.lv*monster.w*5;
player.nHp -= (int)damage;

sprintf(str,"怪物致命一击...对玩家照成 %d 点伤害.",damage);
MsgInsert(str);

CheckDie(player.nHp,true);
}
break;
case 3: //使用梅肯斯姆补血
SelectObject(bufdc,recover);
BitBlt(mdc,60,160,150,150,bufdc,150,0,SRCAND);
BitBlt(mdc,60,160,150,150,bufdc,0,0,SRCPAINT);

//第30个画面时怪物回复生命值并加入显示消息
if(f == 30)
{
monster.nHp += 30;

sprintf(str,"怪物使用梅肯斯姆...恢复了30点生命值",damage);
MsgInsert(str);
}
break;
case 4:
//在第30个画面时判断怪物是否逃跑成功
if(f == 30)
{
if(1== rand()%3 ) //逃跑几率1/3
{
over = true;
monster.nHp = 0;

sprintf(str,"怪物逃跑中...逃跑成功");
MsgInsert(str);
}
else
{
sprintf(str,"怪物逃跑中...逃跑失败");
MsgInsert(str);
}
}
break;
}
}

if(f == 30) //回合结束
{
attack = false;
f = 0;
}
}

BitBlt(hdc,0,0,640,510,mdc,0,0,SRCCOPY);

tPre = GetTickCount();

pNum++;
if(pNum == 8)
pNum = 0;
}

//****新增的对战消息函数********************************
void MsgInsert(char* str)
{
if(txtNum < 5)
{
sprintf(text[txtNum],str);
txtNum++;
}
else
{
for(int i=0;i sprintf(text[i],text[i+1]);

sprintf(text[4],str);
}
}

//****生命值判断函数*************************
void CheckDie(int hp,bool player)
{
char str[100];

if(hp <= 0)
{
over = true;
if(player)
{
sprintf(str,"胜败乃兵家常事,大侠请重新来过......");
MsgInsert(str);
}
else
{
sprintf(str,"少年,你赢了,有两下子啊~~~~~!!!!");
MsgInsert(str);
}
}
}

//****消息处理函数***********************************
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int x,y;

switch (message)
{
case WM_KEYDOWN: //键盘消息
if(wParam==VK_ESCAPE) //按下Esc键
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN: //鼠标左键消息
if(!attack)
{
x = LOWORD(lParam); //X坐标
y = HIWORD(lParam); //Y坐标

if(x >= 500 && x <= 550 && y >= 350 && y <= 400)
attack = true;
}
break;
case WM_DESTROY: //窗口结束消息
DeleteDC(mdc);
DeleteDC(bufdc);
DeleteObject(bg);
DeleteObject(sheep);
DeleteObject(girl);
DeleteObject(skill);
DeleteObject(skillult);
DeleteObject(slash);
DeleteObject(magic);
DeleteObject(recover);
DeleteObject(game);

ReleaseDC(hWnd,hdc);

PostQuitMessage(0);
break;
default: //默认消息
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}


每一回合开始的时候,我们点击画面上“无敌斩”的技能图标,就可以进行攻击,对怪物造成伤害,人品好的话,还可以触发强力被动技能“恩赐解脱”,对怪物造成4倍暴击伤害,这里我们设定的暴击概率为20%

浅墨在截图的时候,人品挺好的,恩赐解脱的暴击概率为20%,但是浅墨的4次攻击里,有3次都打出了“恩赐解脱”的暴击效果,直接果断地把这只小绵羊带走了,呵呵。

下面就是游戏运行的截图:


游戏开始\

第一刀就出暴击了,48点伤害

\

运气不错,又

首页 上一页 5 6 7 8 9 下一页 尾页 8/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇vc里实现不规则窗体 下一篇richedit研究04 ? 高效时钟

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: