用javascript 面向对象制作坦克大战(三)
之前,我们完成了坦克的移动和地图的绘制,这次我们来完成碰撞检测和炮弹的发射。
上代码前来张最新的类图:
3. 碰撞检测
3.1 创建碰撞检测对象
// 碰撞检测对象 继承自顶级对象
HitTestObject = function () { } HitTestObject.prototype = new TankObject();
// 碰撞检测 参数为地图对象 返回true则不能移动
HitTestObject.prototype.HitTest = function (battleField) { var nextObj = this.GetNextBattleFieldCell(battleField);
if (nextObj == null) {
return true;// 场景越界
}
// 检测是否是障碍物
if (nextObj.obj instanceof Barrier) { if (nextObj.obj instanceof EmptyB) {
// 判断是否被其他坦克占用 Tank继承自Mover
return nextObj.occupier instanceof Mover;
}
return !nextObj.obj.CanAcross;
} } // 返回对象移动下个位置的地图对象
HitTestObject.prototype.GetNextBattleFieldCell = function (battleField) { if (this.Direction == EnumDirection.Up && this.YPosition == 0 ||
this.Direction == EnumDirection.Down && this.YPosition == 12 ||
this.Direction == EnumDirection.Left && this.XPosition == 0 ||
this.Direction == EnumDirection.Right && this.XPosition == 12
) {
return null;/* 场景越界 */
} var y = this.YPosition;
var x = this.XPosition;
var nextAxes = this.GetNextAxes(x, y);
return battleField[nextAxes.y][nextAxes.x];
} // 得到对象的下个位置的坐标
HitTestObject.prototype.GetNextAxes = function (x, y) {
var point = { x: x, y: y };
switch (this.Direction + "") { // 加空字符转换为字符串类型
case EnumDirection.Up:
point.y--; break;
case EnumDirection.Right:
point.x++; break;
case EnumDirection.Down:
point.y++; break;
case EnumDirection.Left:
point.x--; break;
}
return point;
} HitTestObject.prototype.OnHitTest = function (battleField) {
// 预留给炮弹对象重写
}
3.2 调用碰撞检测
这里需要我们在之前的代码做一系列的更改了。
更改 Mover.js
Mover.prototype = new HitTestObject();
// 碰撞检测
if (this.HitTest(battleField)) { return this.OnHitTest(battleField); }
battleField[nextPoint.y][nextPoint.x].occupier = This; /*占用新位置*/ // 清空对象原来位置占有
battleField[yp][xp].occupier = null;
4. 发射炮弹
炮弹可以移动,所以继承自我们的Mover对象。炮弹击中障碍物时会有爆炸效果,所以我们先写爆炸对象。
4.1 爆炸效果对象
Explode.js:
// 爆炸效果类
Explode = function () {
this.container = document.getElementById("divMap");
this.UI = null;
this.step = 8; // 共8张图
this.speed = 50; // 动画播放速度
} // 播放爆炸效果
Explode.prototype.Play = function (x,y) {
this.UI = UtilityClass.CreateE("div", "", "explode", this.container);
this.MoveTo(x, y); var i = 0;
var This = this;
var FxTimer = setInterval(function () {
This.UI.style.backgroundPosition = '0 -' + i * 60 + 'px';
i++;
if (i==This.step) {
clearInterval(FxTimer);
This.Stop();
}
},this.speed);
} // 播放位置
Explode.prototype.MoveTo = function (x,y) { if (this.UI != null) {
this.UI.style.left = x * 40 - 10 + "px";
this.UI.style.top = y * 40 - 10 + "px";
} } // 移除dom元素
Explode.prototype.Stop = function () {
UtilityClass.RemoveE(this.UI, this.container);
}
4.2 炮弹对象
// 炮弹对象,这个对象需要放在TANK对象前面,有先后顺序
Bomb = function () {
this.Owner = null;
this.Power = 1;
this.Speed = 7;
} Bomb.prototype = new Mover();
Bomb.prototype.Load = function (x,y) {
// 创建炮弹对象,初始化位置
this.UI = UtilityClass.CreateE("div", "", "bomb", document.getElementById("divMap"))
this.SetPosition(x * 40, y * 40); /*父类方法*/ } // 重写HitTest方法
Bomb.prototype.HitTest = function (battleField) {
var nextObj = this.GetNextBattleFieldCell(battleField);
if (nextObj == null) {
return true;
}
// 检测是否是障碍物
if (nextObj.obj instanceof Barrier) {
// 河流穿过
if (this instanceof Bomb && nextObj.obj instanceof RiverB) {
return false;
} return !nextObj.obj.CanAcross;
} } // 重写OnHitTest方法 当炮弹碰撞到不可穿过对象时调用
Bomb.prototype.OnHitTest = function (battleField) { // 播放爆炸效果
var ex = new Explode();
ex.Play(this.XPosition, this.YPosition);
this.Owner.BombUsed--; /*已用弹药数减一*/
// 清空地图占有位置,移除元素
battleField[this.YPosition][this.XPosition].occupier = null;
UtilityClass.RemoveE(this.UI, document.getElementById("divMap")); var nextObj = this.GetNextBattleFieldCell(battleField);
if (nextObj == null) { return; }
// 炮弹打到了障碍物
if (nextObj.obj instanceof Barrier) {
if (nextObj.obj.CanBeAttacked) {
nextObj.obj.DefenVal -= this.Power;
// 障碍物防御值降到0,把障碍物变为空地
if (nextObj.obj.DefenVal <= 0) {
var to = new EmptyB();
to.UI = nextObj.obj.UI;
to.XPosition = nextObj.obj.XPosition;
to.YPosition = nextObj.obj.YPosition;
nextObj.obj = to;
to.UI.className = "";
battleField[this.YPosition][this.XPosition].obj.UI.className = "";
}
}
} }
用javascript 面向对象制作坦克大战(三)的更多相关文章
- javascript 面向对象制作坦克大战 (一)
PS:这个坦克大战是在网上下的一段源码之后,自己进行的重写. 写这个的目的是为了巩固自己这段时间对js的学习.整理到博客上,算是对自己近端时间学习js的一个整理. 同时也希望可以帮助到学习js的园 ...
- 用javascript 面向对象制作坦克大战(四)
我们现在还差一个重要的功能,没错,敌人坦克的创建以及子弹击中敌人坦克时的碰撞检测功能. 5. 创建敌人坦克完成炮弹碰撞检测 5.1 创建敌人坦克对象 敌人坦克和玩家坦克一样,同样继承自我们的坦克 ...
- 用javascript 面向对象制作坦克大战(二)
2. 完善地图 我们的地图中有空地,墙,钢,草丛,水,总部等障碍物. 我们可以把这些全部设计为对象. 2.1 创建障碍物对象群 对象群保存各种地图上的对象,我们通过对象的属性来判断对 ...
- javascript面向对象精要第三章对象整理精要
什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...
- Java坦克大战 (三) 之可完全控制坦克朝八个方向运动
本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...
- html5制作坦克大战
全部html5都采用绘图技术完成.坦克是画出来的.(坦克,子弹,墙,水,草坪) 首先我们画出坦克. 坦克是两边两个矩形,中间一个大矩形,矩形了有一个圆,还有一根线. 画出坦克的思路是以坦克的左上角为参 ...
- JavaScript 面向对象的编程(三) 类的继承
定义父类和子类的继承关系 //声明父类 function SuperClass(){ this.superValue = true; } //为父类添加共有方法 SuperClass.prototyp ...
- 【blade04】用面向对象的方法写javascript坦克大战
前言 javascript与程序的语言比如C#或者java不一样,他并没有“类”的概念,虽然最新的ECMAScript提出了Class的概念,我们却没有怎么用 就单以C#与Java来说,要到真正理解面 ...
- 汉顺平html5课程分享:6小时制作经典的坦克大战!
记起自己去年參加的一次面试,在做过Java多年的面试官面前发挥的并不好,但他一听说我会html5,立刻眼睛发亮.无论不顾的想要和我签约.. .所以.如今为工作犯愁的朋友们,学好html5,绝对会为你找 ...
随机推荐
- Matlab中编译C++文件
今天在跑<Robust Object Tracking via Sparsity-based Collaborative Model>这篇文章的代码时候,发现出现如下错误: 发现错误时由于 ...
- Tomcat就是个容器,一种软件
1.tomcat就是一个容器而已,一个软件,运行在java虚拟机. 2.tomcat是一种能接收http协议的软件,java程序猿自己也可以写出http解析的服务器啊. 3.tomcat支持servl ...
- php动态滚动加载实例
内容涉及:php.分页.jquery.div+css 实例下载:http://download.csdn.net/detail/roro5119/7373905 index.php <? //数 ...
- Servlet中如何实现页面转发
在Servlet中实现页面转发主要是利用RequestDispatcher接口实现的.此接口可以把一个请求转发到另一个JSP页面上. forward():把请求转发到服务器上的另一个资源. ...
- Redis是什么?
1. Redis是什么 这个问题的结果影响了我们怎么用Redis.如果你认为Redis是一个key value store, 那可能会用它来代替MySQL;如果认为它是一个可以持久化的cache, 可 ...
- shell编程基础(5)---循环指令
while类型的循环 while类型的循环是不定循环的一种,每一次循环都会验证给出的循环条件,判断是否要进行下一次循环.linux中while循环的写法和c语言中很想,但是条件给出的方式有些区别. 首 ...
- Android AIDL-跨进程
Android在设计理念上强调组件化,组件之间的依赖性很小.我们往往发一个Intent请求就可以启动另一个应用的Activity,或者一个你不知道在哪个进程的Service,或者可以注册一个广播,只要 ...
- 加密解密(11)HMAC-在sha1,md5基础上加密
HMAC: Hash-based Message Authentication Code http://baike.sogou.com/v10977193.htm http://www.baike.c ...
- gulp browser-sync自动刷新插件
很久没弄gulp了,都快忘了,今天又来温习下browser-sync 自动刷新插件,在安装的时候出现以下提示: $ npm install browser-sync --save-dev> ws ...
- bzoj2324营救皮卡丘
费用流. 建图比较重要. 1.S->id[0][0] flow=k. 表示k条路径. 2.S->id[i][0] flow=1, 每次消耗1流量就补充1流量. 3.id[i][1]-> ...