javascript制作坦克大战全纪录(2)


Posted in Javascript onNovember 27, 2014

2.   完善地图

    我们的地图中有空地,墙,钢,草丛,水,总部等障碍物。 我们可以把这些全部设计为对象。

2.1  创建障碍物对象群

    对象群保存各种地图上的对象,我们通过对象的属性来判断对象是否可以被穿过或被攻击。
 
Barrier.js:
 

 // 障碍物基类对象,继承自TankObject

 Barrier = function () {

     this.DefenVal = 1;  // 防御力

     this.CanBeAttacked = true;  // 是否可以被攻击

 }

 Barrier.prototype = new TankObject();

 // 墙

 WallB = function () { }

 WallB.prototype = new Barrier();

 // 空地

 EmptyB = function () {

     this.CanAcross = true;  // 可被穿过

 }

 EmptyB.prototype = new Barrier();

 // 河流

 RiverB = function () {

     this.DefenVal = 0;

     this.CanBeAttacked = false; // 优先取对象的成员,继承自父类的会被覆盖。

 }

 RiverB.prototype = new Barrier();

 // 钢

 SteelB = function () {

     this.DefenVal = 3;

 }

 SteelB.prototype = new Barrier();

 // 草丛对象

 TodB = function () {

     this.CanBeAttacked = false;

     this.DefenVal = 0;

     this.CanAcross = true;

 }

 TodB.prototype = new Barrier();

 // 总部

 PodiumB = function () {

     this.DefenVal = 5;

 }

 PodiumB.prototype = new Barrier();

2.2    写入地图的数据。

在Common.js 中添加以下代码:
 

 //地图元素类型枚举

 /*

 0:空地    

 1:墙    

 2:钢    

 3:树丛        

 4:河        

 5:总部    

 */

 var EnumMapCellType = {

     Empty: "0"

     , Wall: "1"

     , Steel: "2"

     , Tod: "3"

     , River: "4"

     , Podium: "5"

 };

 // 每个地形对应的样式名称

 var ArrayCss = ['empty', 'wall', 'steel', 'tod', 'river', 'podium'];

 // 关卡地图

 /*关卡*/

 var str = '0000000000000';

 str += ',0011100111010';

 str += ',1000010000200';

 str += ',1200333310101';

 str += ',0000444400001';

 str += ',3313300001011';

 str += ',3011331022011';

 str += ',3311031011011';

 str += ',0101011102010';

 str += ',0101011010010';

 str += ',0100000000110';

 str += ',0100012101101';

 str += ',0010015100000';

 // 存储关卡地图   0,1,2,3... 分别为1-n ... 关

 var Top_MapLevel = [str];

2.3    绘制地图

    准备工作做完了,下面开始上大菜,绘制地图。前面有提到我们的地图为 13 * 13 的表格。所以我们在游戏装载对象添加行和列两个属性,并且添加初始化地图方法。
 
Frame.js:
 

 // 游戏载入对象 整个游戏的核心对象

 GameLoader = function () {

     this._mapContainer = document.getElementById("divMap");  // 存放游戏地图的div

     this._selfTank = null;  // 玩家坦克

     this._gameListener = null; // 游戏主循环计时器id

     /*v2.0新加的属性*/

     this._level = 1;

     this._rowCount = 13;

     this._colCount = 13;

     this._battleField = []; // 存储地图对象二维数组

 }

 // 加载地图方法

    Load: function () {

         // 根据等级初始化地图

         var map = Top_MapLevel[this._level - 1].split(",");

         var mapBorder = UtilityClass.CreateE("div", "", "mapBorder", this._mapContainer);

         // 遍历地图表格中每一个单元格

         for (var i = 0; i < this._rowCount; i++) {

             // 创建div,每一行的地图保存在这个div中

             var divRow = UtilityClass.CreateE("div", "", "", mapBorder);

             // 在一维数组中再创建一个数组

             this._battleField[i] = [];

             for (var j = 0; j < this._colCount; j++) {

                 // 读取地图数据,默认值:0

                 var v = (map[i] && map[i].charAt(j)) || 0;

                 // 插入span元素,一个span元素即为一个地图单位

                 var spanCol = UtilityClass.CreateE("span", "", "", divRow);

                 spanCol.className = ArrayCss[v];

                 // 将地图对象放入二维数组中,便于后面碰撞检测。

                 var to = null;

                 switch (v) {

                     case EnumMapCellType.Empty:

                         to = new EmptyB();

                         break;

                     case EnumMapCellType.Wall:

                         to = new WallB();

                         break;

                     case EnumMapCellType.Steel:

                         to = new SteelB();

                         break;

                     case EnumMapCellType.Tod:

                         to = new TodB();

                         break;

                     case EnumMapCellType.River:

                         to = new RiverB();

                         break;

                     case EnumMapCellType.Podium:

                         to = new PodiumB();

                         break;

                     default:

                         throw new Error("地图数字越界!");

                         break;

                 }

                 to.UI = spanCol;

                 //这里的j就是X,因为内部循环是横向的,x是横坐标

                 to.XPosition = j;

                 to.YPosition = i;

                 // 将当前的地图对象存入二维数组中obj为障碍物对象,occupier为占有对象

                 this._battleField[i][j] = { obj: to, occupier: null, lock: false };

             }   //end for

         }   // end for

         // 放入window全局变量

         window.BattleField = this._battleField;

     }

    ok,到这里我们的地图就大功告成了。 这里的注释已经很详细了,如果大家还有不理解的地方自己下载源码调试一下就很好理解了。

这里主要加载地图数据,将每一个地图作为span元素插入html文档中。并且将地图的对象存储在二维数组中。以后我们做碰撞检测的时候就可以直接通过对象的坐标取到对应的数组对象,十分方便。

附上源码:http://xiazai.3water.com/201411/yuanma/jstankedazhan(3water.com).rar

Javascript 相关文章推荐
走出JavaScript初学困境—js初学
Dec 29 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
使用jQuery插件创建常规模态窗口登陆效果
Aug 23 Javascript
HTML Color Picker(js拾色器效果)
Aug 27 Javascript
用Javascript获取页面元素的具体位置
Dec 09 Javascript
bootstrap日历插件datetimepicker使用方法
Dec 14 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
js实现年月日表单三级联动
Apr 17 Javascript
JavaScript中立即执行函数实例详解
Nov 04 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
Vue无限滑动周选择日期的组件的示例代码
Jul 18 Javascript
vue实现重置表单信息为空的方法
Sep 29 Javascript
javascript制作坦克大战全纪录(1)
Nov 27 #Javascript
使用jsonp完美解决跨域问题
Nov 27 #Javascript
JavaScript变量声明详解
Nov 27 #Javascript
js脚本实现数据去重
Nov 27 #Javascript
实例分析js和C#中使用正则表达式匹配a标签
Nov 26 #Javascript
javascript几个易错点记录
Nov 26 #Javascript
jquery选择器需要注意的问题
Nov 26 #Javascript
You might like
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
详解js闭包
2014/09/02 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
材料物理专业个人求职信
2013/12/15 职场文书
给领导的致歉信范文
2014/01/13 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
我爱读书演讲稿
2014/05/07 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript