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 相关文章推荐
用js+xml自动生成表格的东西
Dec 21 Javascript
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
JavaScript与Div对层定位和移动获得坐标的实现代码
Sep 08 Javascript
JavaScript调用后台的三种方法实例
Oct 17 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 Javascript
通过npm引用的vue组件使用详解
Mar 02 Javascript
node.js中cluster的使用教程
Jun 09 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
Jul 25 Javascript
解决layui-open关闭自身窗口的问题
Sep 10 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
Sep 12 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中文件下载功能实现超详细流程分析
2012/06/13 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
JavaScript高级程序设计
2006/12/29 Javascript
基于jquery的表格排序
2010/09/11 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Django实现文件上传下载
2019/10/06 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
亚洲在线旅行门户网站:Expedia.com.hk(智游网)
2020/04/14 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
工程专业毕业生自荐信范文
2013/12/25 职场文书
幼儿教师考核制度
2014/01/25 职场文书
活动倡议书范文
2014/05/13 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
党员作风建设整改方案
2014/10/27 职场文书
校本培训个人总结
2015/02/28 职场文书
如何写新闻稿
2015/07/18 职场文书
2019消防宣传标语!
2019/07/10 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
如何理解PHP核心特性命名空间
2021/05/28 PHP