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 相关文章推荐
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
Sep 15 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
Nov 23 Javascript
javascript实现tab切换的两个实例
Nov 05 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
May 27 Javascript
Jquery遍历select option和添加移除option的实现方法
Aug 26 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
Oct 18 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
Jun 12 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 jQuery
vuex存取值和映射函数使用说明
Jul 24 Javascript
vue 中的动态传参和query传参操作
Nov 09 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
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
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
linux中cd命令使用详解
2015/01/08 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
Javascript的一种模块模式
2008/03/22 Javascript
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
javascript 变量作用域 代码分析
2009/06/26 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
用Pygal绘制直方图代码示例
2017/12/07 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
安踏官方商城:anta.cn
2019/12/16 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
传播学毕业生求职信
2013/10/11 职场文书
初中校园之声广播稿
2014/01/15 职场文书
机械设计及其自动化求职推荐信
2014/02/17 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
房屋维修协议书范本
2014/09/25 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL