战斗过程图示意:
[img]/upload/attachment/50153/d795065a-57e8-343c-9b37-8d1f27bfe3c8.jpg" alt="[/img]
在《自动战斗实现以及一些游戏细节》的上一篇里面介绍了游戏人物战斗属性的设计以及战斗的触发,本章节是一个重点,主要介绍战斗过程的一系列函数与算法的实现。
本作的一个基本的思路很简单:
伤害 = 攻击-防御
速度决定攻击的间隔,其值为最大速度-速度,比如最大速度设置为12,那攻击间隔就是12-3 =9.也就是9秒发动一次攻击。
幸运决定了暴击跟躲闪,如果躲闪,伤害为0,如果暴击,伤害为攻击*2-防御
双方有任何一方HP小于0,则认为战斗结束,如果双方HP都不小于0结束战斗,即战斗中断,则判断人物逃跑,扣除一次攻击的hp。来看看在上篇就给出的代码:
//开始战斗,当前双方hp都大于0
if(bobo.curHp >0 || monster.curHp > 0 ){
var timer = 0; //战斗计时
var timerStr = '[00:00]'; //显示时间字符串
sysBattleMessage('战斗开始');
var boboSpeed = maxSpeed-bobo.speed; //宝宝速度计算
var monsterSpeed = maxSpeed-monster.speed; //怪物速度计算
var battleTimer=setInterval(function(){ //计时,定时显示信息
var s = timer%60;
var m = Math.floor(timer/60);
if (s<10) {
s = "0" + s;
}
if(m<10){
m = "0" + m;
}
timerStr = '['+m+':'+s+']';
//显示宝宝动作进度条
var temp = (timer+1)%boboSpeed == 0 ? boboSpeed : (timer+1)%boboSpeed;
$('#boboAction').width(temp/boboSpeed*100+'%');
//显示怪物动作进度条
temp = (timer+1)%monsterSpeed == 0 ? monsterSpeed : (timer+1)%monsterSpeed;
$('#monsterAction').width(temp/monsterSpeed*100+'%');
//计时增加
timer++;
},1000);
这段代码前面主要是拼凑一个时间戳,类似[00:00]的格式。值得注意的地方在于下面的动作进度条,这个进度条是每秒推进一次,可以很直观的让用户感觉到战斗的过程。实现算是一个小小的技巧:
2个div都设置成绿色的背景,初始的css设置宽度为0。宝宝需要9秒进度条才会满,怪物需要7秒,满之前显示的就是进度的百分比。比如战斗进行了4秒,宝宝显示的进度的长度应该是4/9,而怪物是4/7。据此,temp是战斗时间对宝宝速度的求余操作,每次过9秒宽度就要从0开始。注意的是到9秒的时候进度是满的,求余结果是0,所以要进行一个判断。
接下来是一个核心部分,双方发动攻击的代码:
//宝宝定时发动攻击
var attackMonsterT = setInterval(function(){
//战斗模式,先判断对方躲闪,如果躲闪,此次攻击无效
var dodge = Math.floor(Math.random()*100) < monster.luck; //躲闪
if(dodge){
battleMessage(bobo,monster,'dodge',0,timerStr,monster.curHp);
}
else{
var crit = Math.random()*100 < bobo.luck; //暴击判断,返回bool值
//暴击crit=1,否则为0。使用Number强制类型转换
var damage = bobo.ap*(Number(crit)+1) - monster.def > 0 ? bobo.ap*(Number(crit)+1) - monster.def : 0; //考虑攻击<防御
monster.curHp -= damage;
if(monster.curHp < 0 ){
monster.curHp = 0;//hp不能小于0
}
//显示战斗信息
battleMessage(bobo,monster,crit?'crit':'common',damage,timerStr,monster.curHp);
//战斗结束,清除所有定时任务
if(monster.curHp <=0){
clearInterval(attackMonsterT);
clearInterval(attackBoboT);
clearInterval(battleTimer);
battleOver(boboWin,monster);
}
}
},boboSpeed*1000);
我这里用的是setInterval(function(){},boboSpeed*1000)这样的方式,就是按照宝宝的速度定时发动攻击。注意setInterval在没有进行clear之前是一直执行的。因为设计的初衷是给自家MM玩,战斗过程不要人操作,遇到怪物就直接开打一直到结束。如果你要要进行攻击设定,可能用setTimeout程序控制战斗过程更合适。
战斗逻辑部分的处理是这样的:根据对方的幸运判断对方躲闪,没有躲闪的话,根据自己幸运判断自己是否出现暴击。这里有个隐藏的bug陷阱,由于伤害是简单的攻击-防御来计算的,如果不加判断,遇到敌人的防御大于攻击的情况,那每次攻击没伤害还会让敌人的hp增加。所以damage的计算要有这个考虑。另外,hp是不能小于0的,这个也有考虑到。
战斗结束后一定要记得清除所有的定时任务,否则会在后台不断运行。这个是宝宝对怪物进行攻击的实现。怪物对宝宝进行攻击基本相同,不再赘述。
接下来看看战斗结束部分。战斗的结束主要要进行的一些动作包括:对一些临时的数据进行清除,判断战斗结果,数据重置等。战斗的结束分为2种,一种是中断逃跑,一种是完全结束,一方阵亡。对于中断逃跑的情况:
if(bobo.curHp>0
&& monster.curHp>0
&& confirm('战斗还未结束,逃跑将被怪兽追击,确定宝宝要逃跑吗?')){ //战斗未结束
$.unblockUI({
onUnblock: function(){
bobo.curHp = bobo.curHp - monster.ap >0?bobo.curHp - monster.ap : 1; //逃跑惩罚,扣除一次hp
//ajax 到服务器
setBoradValue('#boboHp',bobo.curHp+'/'+bobo.hp); //设置面板上面宝宝的信息
clearInterval(attackMonsterT);
clearInterval(attackBoboT);
clearInterval(battleTimer);
$('#battleInfo').html(''); //清空战斗信息
$('#monsterFace').empty(); //清空头像
$('#boboAction').width('0%'); //重置战斗计时
$('#monsterAction').width('0%');
//将图片改为普通图片,占据位置
$(boboFace).attr({
src:'images/'+bobo.type+'/'+bobo.file+'/'+'lv'+bobo.level+'/common.gif'
});
$(prePosObj).append(boboFace);
//设置坐标
bobo.pos.X = prePos.X;
bobo.pos.Y = prePos.Y;
//怪兽图片
$(monsterFace).attr({
src:'images/'+monster.type+'/'+monster.file+'/'+'lv'+monster.level+'/common.gif'
});
$(curPosObj).append(monsterFace);
$("#battleCloseIcon").unbind( "click" );
}
});
}
注释部分基本做了流程的概括。需要注意的一点是,如果战斗是中断的,那么宝宝跟怪兽都要回到原来的格子上面,所以战斗前要保存宝宝原来的位置的值。而如果战斗进行到底的话,肯定会有一方阵亡。宝宝赢了就占据当前格,输了则直接被移除,就不存在这个问题。
完全结束,一方阵亡的情况基本是相同的流程,只是少了逃跑惩罚以及位置回复。
战斗部分完整的代码在上一篇的最后有给出,可以点击这里查看
http://playfish.iteye.com/blog/265264
本章的最后介绍一下在上面代码里面出现的一些很重要的函数,
/*
* 战斗进行时显示战斗信息
* @attacker 攻击者
* @target 攻击目标
* @result 攻击结果,暴击,躲闪,普通
* @damage 造成的伤害
* @time 攻击发动的时间
* @hp 当前生命值
*/
function battleMessage(attacker,target,result,damage,time,hp){
if(!attacker || !target ||!result || !time){
console.error('msg function param error');
}
setBoradValue('#_'+target.type+'Hp',hp); //设置HP显示
var s = $("#battleInfo").html();
s += '<p class="'+attacker.type+'">';
s += time;
s += ' '+attacker.name+'对'+target.name+'发起攻击,';
switch(result){
case 'dodge': //躲闪
s += target.name+'RP爆发,躲过本次攻击,'; //头像表情切换
$('#'+attacker.type+'Face img').attr({
src:'images/'+attacker.type+'/'+attacker.file+'/'+'lv'+attacker.level+'/bedodge.gif'
});
$('#'+target.type+'Face img').attr({
src:'images/'+target.type+'/'+target.file+'/'+'lv'+target.level+'/dodge.gif'
});
break;
case 'crit' ://暴击
s += attacker.name+'RP爆发,攻击命中要害,';
$('#'+attacker.type+'Face img').attr({
src:'images/'+attacker.type+'/'+attacker.file+'/'+'lv'+attacker.level+'/crit.gif'
});
$('#'+target.type+'Face img').attr({
src:'images/'+target.type+'/'+target.file+'/'+'lv'+target.level+'/becrit.gif'
});
break;
case 'common'://普通攻击
default :
$('#'+attacker.type+'Face img').attr({
src:'images/'+attacker.type+'/'+attacker.file+'/'+'lv'+attacker.level+'/common.gif'
});
$('#'+target.type+'Face img').attr({
src:'images/'+target.type+'/'+target.file+'/'+'lv'+target.level+'/common.gif'
});
break;
}
s += '造成伤害'+damage+'</p>';
$("#battleInfo").html(s); //战斗信息显示
$("#battleInfo")[0].scrollTop = 10000; //使得滚动条保持在底部
};
这个函数的作用就是拼凑出战斗信息字符串,如开头的示意图所示。函数的最后使用了$("#battleInfo")[0].scrollTop = 10000;来使得滚动条保持在最底部,现实的效果就是战斗信息会自动往下滚,不然战斗信息多了以后还要手动的下拉滚动条。
在整个程序中大量的用到了jquery的attr函数,稍微做一下介绍,attr支持对dom的属性进行获取跟设置,本代码里面大部分应用都是用来修改宝宝与怪物在各种情况下的表情,例如战斗最后结束,胜利的一方会摆出胜利的表情,而失败会摆出郁闷的表情。
宝宝攻击被躲闪的表情:
另外一个重要的函数是战斗结果的函数,目前还不完整,还缺少了获得战利品跟经验等级的实现。
function battleOver(result,monster){
//清除计时并显示战斗结果
if (result) {
sysBattleMessage('宝宝赢了 ^_^');
$('#boboFace img').attr({
src: 'images/' + bobo.type + '/' + bobo.file + '/' + 'lv' + bobo.level + '/win.gif'
});
$('#monsterFace img').attr({
src: 'images/' + monster.type + '/' + monster.file + '/' + 'lv' + monster.level + '/lose.gif'
});
}
else {
sysBattleMessage('宝宝输了 >_<');
$('#boboFace img').attr({
src: 'images/' + bobo.type + '/' + bobo.file + '/' + 'lv' + bobo.level + '/lose.gif'
});
$('#monsterFace img').attr({
src: 'images/' + monster.type + '/' + monster.file + '/' + 'lv' + monster.level + '/win.gif'
});
}
};
战斗部分就暂时介绍到这里。以后再下去的部分会介绍物品的设计实现,以及对之前的介绍过的地图设计实现做一些补充,增加了地图障碍实现等。
- 大小: 35.7 KB
- 大小: 4.3 KB
分享到:
相关推荐
### Webgame开发简明教程知识点总结 #### 一、Webgame概述 ...Webgame作为一种独特的游戏形式,在技术实现和玩法设计上都有其独特之处。未来随着技术的发展和玩家需求的变化,Webgame也将不断进化和发展。
尽管这个引擎在当时可能处于不完整状态,特别是其人工智能(AI)部分尚未实现,但我们可以从这个项目中探讨一些关键的Web游戏开发技术和JavaScript编程知识。 1. JavaScript基础:作为Webgame引擎的核心语言,...
7. 游戏功能实现:文档举例说明了一个webgame的基本功能,如玩家登录、角色升级、战斗系统、建筑和物品的买卖等,并提及每个功能对应至少一个或多个数据表。通过具体的功能实现,展现了游戏开发的实际应用过程。 8....
【标题】"Webgame ASP JavaScript在线游戏源代码"揭示了这是一个使用ASP(Active Server Pages)技术和JavaScript编程语言构建的在线游戏平台的源码资源。ASP是微软开发的一种服务器端脚本环境,常用于动态网页的...
在当前的游戏开发领域中,Webgame作为一种可以通过浏览器直接运行的游戏类型,受到了越来越多玩家的喜爱。为了更好地满足这一需求,许多开发者开始深入研究Webgame的开发技术。本文旨在提供一系列关于Webgame引擎...
### Webgame开发简明教程知识点概述 ...通过以上内容,我们可以了解到Webgame开发涉及多个方面的技术知识,包括前后端技术、数据库设计以及具体的实现案例等。对于初学者而言,掌握这些基础知识是非常重要的。
### WebGame大型游戏...通过上述分析可以看出,“WebGame大型游戏架构书”不仅提供了一个清晰的游戏设计框架,还详细介绍了游戏开发过程中的关键技术点和实现细节。这对于理解和学习WebGame开发具有重要的参考价值。
### 网页游戏开发入门教程(webgame design) #### 一、基础知识点概述 本教程旨在为初学者提供一个简单易懂的网页游戏开发入门指南,并为有经验的开发者提供一些新的启发。通过本教程,您将了解网页游戏开发的...
网页游戏斗地主源码是一种基于Web技术实现的在线扑克牌游戏,允许玩家在浏览器上直接进行游戏,无需下载客户端。这种源码是开发者通过HTML、CSS、JavaScript等前端技术,以及可能的后端语言(如PHP、Node.js)构建的...
总之,"webgame网页游戏源码"是一个宝贵的资源,它涵盖了Flex和AS3开发网页游戏的关键技术,并提供了实践和学习的实例。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的技能和项目实施能力。
同时,创新和改良现有模式是区分竞争的关键,无论是通过添加新元素、改进现有机制,还是探索全新的游戏玩法。 总之,网页游戏开发是一门融合多种技术的艺术,开发者需要深入理解游戏模式,掌握关键系统的设计,并...
开发Web游戏时,通常需要考虑性能优化、用户交互设计、网络通信以及数据同步等问题。 【压缩包子文件的文件名称列表】只给出了"wog3",这可能是游戏项目的简称或者是某个版本号。通常,一个Web游戏项目会包含多个...
"AS3客户端代码.rar"包含了游戏客户端的全部源代码,开发者可以通过查看和分析这些代码来了解游戏界面的实现、角色控制、交互逻辑以及网络通信等核心部分。而"SGS服务端代码.rar"则包含了服务端的源码,这将揭示游戏...
"Unity开发的飞机游戏(WebGame)"这个项目表明,游戏是利用Unity3D引擎进行开发的,并且设计成可以在网页上运行的形式。WebGL是一种基于JavaScript的开放标准,允许在任何兼容的浏览器中直接运行3D图形,无需插件。...
资源名称:webgame网页游戏开发设计简明教程 中文WORD版本文档是webgame网页游戏开发设计简明教程;webgame程序构成:三大部分。第一是数据流程。第二是程序。第三是美术。其中,数据流程包括了功能。也只有在功能中...
在本文中,我们将深入探讨WebGame游戏开发中的一个重要部分——人物移动。WebGame是一种基于Web浏览器的游戏,通常使用Flash技术来实现丰富的图形界面和交互性。在这个特定的资源包中,我们关注的是ActionScript(AS...
以下是一些关于使用Flex框架开发WebGame的关键知识点: 1. **ActionScript 3.0**:Flex的核心编程语言是ActionScript 3.0,它是面向对象的,与ECMAScript 4标准紧密相关的。ActionScript 3.0提供了更强的类型检查、...
《最终幻想webgame(access)》是一款基于网页的在线游戏,其源码可供学习和研究。这款游戏使用了big5编码,这是一种繁体中文字符编码,主要用于处理台湾、香港等地的中文文本。通过分析这款网页游戏的源码,我们...
同时,利用Web Storage和IndexedDB等技术,游戏可以将玩家数据存储在本地,实现进度保存和加载,增加了游戏的可玩性和用户体验。 JavaScript作为网页的脚本语言,在这个项目中起到了至关重要的作用。它负责游戏逻辑...
【标题】"侠域网页游戏WebGame源代码" 涉及的知识点主要集中在网页游戏开发、PHP编程语言以及Web应用程序架构上。侠域网页游戏是一款基于Web平台的游戏,其源代码的公开提供了深入理解此类游戏开发过程和技术实现的...