之前,我们完成了坦克的移动和地图的绘制,这次我们来完成碰撞检测和炮弹的发射。
上代码前来张最新的类图:
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 }