用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,绝对会为你找 ...
随机推荐
- python—命名规范(转)
文件名全小写,可使用下划线 包应该是简短的.小写的名字.如果下划线可以改善可读性可以加入.如mypackage. 模块与包的规范同.如mymodule. 类总是使用首字母大写单词串.如MyClass. ...
- BZOJ 3720 gty的妹子树
块状树裸题 块状树: 首先对树进行分块,分出的每一块都是一个连通块 通常的分块的方式如下: 1.父亲所在块不满,分到父亲所在块中 2.父亲所在块满,自己单独开一个块 (貌似有更为优越的分块方式? 注意 ...
- 从SQL Server中导入/导出Excel的基本方法(转)
从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...
- lintcode:Matrix Zigzag Traversal 矩阵的之字型遍历
题目: 矩阵的之字型遍历 给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历. 样例 对于如下矩阵: [ [1, 2, 3, 4], [5, 6, 7, 8], [9 ...
- python学习[一]
Vamei写了很好的python教程,感谢:http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html 摘录笔记 print命令行模式: ...
- 231. Power of Two
题目: Given an integer, write a function to determine if it is a power of two. 链接: http://leetcode.com ...
- ActiveMQ集群(2)
ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要有两种:Master-Slave和Broker Cluster. 1.Master-Slave ...
- How to learn linux device driver
To learn device driver development, like any other new knowledge, the bestapproach for me is to lear ...
- JAVA文件中获取路径及WEB应用程序获取路径方法
JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...
- Spring学习8-Spring事务管理
http://blog.sina.com.cn/s/blog_7ffb8dd501014e0f.html Spring学习8-Spring事务管理(注解式声明事务管理) 标签: spring注 ...