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 // 建立div,且每一行的地圖保存在這個div中
var divRow = UtilityClass.CreateE("div", "", "", mapBorder);
// 在一維陣列中再建立一個陣列
this._battleField[i] = [];
for (var j = 0; 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.jb51.net/201411/yuanma/jstankedazhan(jb51.net).rar

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。