之前,我们完成了坦克的移动和地图的绘制,这次我们来完成碰撞检测和炮弹的发射。

 

  上代码前来张最新的类图:

 

用javascript 面向对象制作坦克大战(三)

3. 碰撞检测

    前面我们已经完成了坦克的移动和地图的绘制,下面我们开始写碰撞检测。

3.1    创建碰撞检测对象

        我们创建一个对象来做碰撞检测,由于碰撞检测都是在对象移动的时候进行的所以我们让Mover继承我们的碰撞对象。
 
HitTestObject.js:
 
 1 // 碰撞检测对象 继承自顶级对象
 2 HitTestObject = function () { }
 3 
 4 HitTestObject.prototype = new TankObject();
 5 // 碰撞检测 参数为地图对象 返回true则不能移动
 6 HitTestObject.prototype.HitTest = function (battleField) {
 7 
 8     var nextObj = this.GetNextBattleFieldCell(battleField);
 9     if (nextObj == null) {
10         return true;// 场景越界
11     }
12     // 检测是否是障碍物
13     if (nextObj.obj instanceof Barrier) {
14 
15         if (nextObj.obj instanceof EmptyB) {
16             // 判断是否被其他坦克占用  Tank继承自Mover
17             return nextObj.occupier instanceof Mover;
18         }
19         return !nextObj.obj.CanAcross;
20     }
21 
22 
23 }
24 
25 // 返回对象移动下个位置的地图对象
26 HitTestObject.prototype.GetNextBattleFieldCell = function (battleField) {
27 
28     if (this.Direction == EnumDirection.Up && this.YPosition == 0 ||
29         this.Direction == EnumDirection.Down && this.YPosition == 12 ||
30         this.Direction == EnumDirection.Left && this.XPosition == 0 ||
31         this.Direction == EnumDirection.Right && this.XPosition == 12
32         ) {
33         return null;/* 场景越界 */
34     }
35 
36     var y = this.YPosition;
37     var x = this.XPosition;
38     var nextAxes = this.GetNextAxes(x, y);
39     return battleField[nextAxes.y][nextAxes.x];
40 }
41 
42 // 得到对象的下个位置的坐标
43 HitTestObject.prototype.GetNextAxes = function (x, y) {
44     var point = { x: x, y: y };
45     switch (this.Direction + "") {    // 加空字符转换为字符串类型
46         case EnumDirection.Up:
47             point.y--; break;
48         case EnumDirection.Right:
49             point.x++; break;
50         case EnumDirection.Down:
51             point.y++; break;
52         case EnumDirection.Left:
53             point.x--; break;
54     }
55     return point;
56 }
57 
58 
59 HitTestObject.prototype.OnHitTest = function (battleField) {
60     //  预留给炮弹对象重写
61 }
View Code

 

相关文章: