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 相关文章推荐
html中的input标签的checked属性jquery判断代码
Sep 19 Javascript
js图片轮播特效代码分享
Sep 07 Javascript
JavaScript修改作用域外变量的方法
Mar 25 Javascript
文件上传的几个示例分享【推荐】
Dec 16 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
Feb 28 Javascript
微信小程序 转发功能的实现
Aug 04 Javascript
详解Chart.js轻量级图表库的使用经验
May 22 Javascript
Vue组件的使用及个人理解与介绍
Feb 09 Javascript
AngularJs中$cookies简单用法分析
May 30 Javascript
JavaScript canvas仿代码流瀑布
Feb 10 Javascript
Js类的构建与继承案例详解
Sep 15 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
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
详解如何实现一个简单的 vuex
2018/02/10 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
python字符串替换的2种方法
2014/11/30 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
类的核心特性有哪些
2014/01/01 面试题
八年级物理教学反思
2014/01/19 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
技术支持岗位职责
2015/02/13 职场文书
清洁员岗位职责
2015/02/15 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
爱国教育主题班会
2015/08/14 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
深入理解python协程
2021/06/15 Python
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
Windows server 2012搭建FTP服务器
2022/04/29 Servers