javascript制作坦克大戰(zhàn)全紀(jì)錄(2)
2. 完善地圖
我們的地圖中有空地,墻,鋼,草叢,水,總部等障礙物。 我們可以把這些全部設(shè)計(jì)為對象。
2.1 創(chuàng)建障礙物對象群
對象群保存各種地圖上的對象,我們通過對象的屬性來判斷對象是否可以被穿過或被攻擊。
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; // 優(yōu)先取對象的成員,繼承自父類的會被覆蓋。
}
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 寫入地圖的數(shù)據(jù)。
在Common.js 中添加以下代碼:
//地圖元素類型枚舉
/*
0:空地
1:墻
2:鋼
3:樹叢
4:河
5:總部
*/
var EnumMapCellType = {
Empty: "0"
, Wall: "1"
, Steel: "2"
, Tod: "3"
, River: "4"
, Podium: "5"
};
// 每個(gè)地形對應(yīng)的樣式名稱
var ArrayCss = ['empty', 'wall', 'steel', 'tod', 'river', 'podium'];
// 關(guān)卡地圖
/*關(guān)卡*/
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';
// 存儲關(guān)卡地圖 0,1,2,3... 分別為1-n ... 關(guān)
var Top_MapLevel = [str];
2.3 繪制地圖
準(zhǔn)備工作做完了,下面開始上大菜,繪制地圖。前面有提到我們的地圖為 13 * 13 的表格。所以我們在游戲裝載對象添加行和列兩個(gè)屬性,并且添加初始化地圖方法。
Frame.js:
// 游戲載入對象 整個(gè)游戲的核心對象
GameLoader = function () {
this._mapContainer = document.getElementById("divMap"); // 存放游戲地圖的div
this._selfTank = null; // 玩家坦克
this._gameListener = null; // 游戲主循環(huán)計(jì)時(shí)器id
/*v2.0新加的屬性*/
this._level = 1;
this._rowCount = 13;
this._colCount = 13;
this._battleField = []; // 存儲地圖對象二維數(shù)組
}
// 加載地圖方法
Load: function () {
// 根據(jù)等級初始化地圖
var map = Top_MapLevel[this._level - 1].split(",");
var mapBorder = UtilityClass.CreateE("div", "", "mapBorder", this._mapContainer);
// 遍歷地圖表格中每一個(gè)單元格
for (var i = 0; i < this._rowCount; i++) {
// 創(chuàng)建div,每一行的地圖保存在這個(gè)div中
var divRow = UtilityClass.CreateE("div", "", "", mapBorder);
// 在一維數(shù)組中再創(chuàng)建一個(gè)數(shù)組
this._battleField[i] = [];
for (var j = 0; j < this._colCount; j++) {
// 讀取地圖數(shù)據(jù),默認(rèn)值:0
var v = (map[i] && map[i].charAt(j)) || 0;
// 插入span元素,一個(gè)span元素即為一個(gè)地圖單位
var spanCol = UtilityClass.CreateE("span", "", "", divRow);
spanCol.className = ArrayCss[v];
// 將地圖對象放入二維數(shù)組中,便于后面碰撞檢測。
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("地圖數(shù)字越界!");
break;
}
to.UI = spanCol;
//這里的j就是X,因?yàn)閮?nèi)部循環(huán)是橫向的,x是橫坐標(biāo)
to.XPosition = j;
to.YPosition = i;
// 將當(dāng)前的地圖對象存入二維數(shù)組中obj為障礙物對象,occupier為占有對象
this._battleField[i][j] = { obj: to, occupier: null, lock: false };
} //end for
} // end for
// 放入window全局變量
window.BattleField = this._battleField;
}
ok,到這里我們的地圖就大功告成了。 這里的注釋已經(jīng)很詳細(xì)了,如果大家還有不理解的地方自己下載源碼調(diào)試一下就很好理解了。
這里主要加載地圖數(shù)據(jù),將每一個(gè)地圖作為span元素插入html文檔中。并且將地圖的對象存儲在二維數(shù)組中。以后我們做碰撞檢測的時(shí)候就可以直接通過對象的坐標(biāo)取到對應(yīng)的數(shù)組對象,十分方便。
附上源碼:http://xiazai.jb51.net/201411/yuanma/jstankedazhan(jb51.net).rar
相關(guān)文章
javascript基本數(shù)據(jù)類型和對象類型歸檔問題解析
這篇文章主要介紹了javascript基本數(shù)據(jù)類型和對象類型歸檔,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03每天一篇javascript學(xué)習(xí)小結(jié)(Array數(shù)組)
這篇文章主要介紹了javascript中的Array數(shù)組知識點(diǎn),對數(shù)組的基本使用方法,以及各種方法進(jìn)行整理,感興趣的小伙伴們可以參考一下2015-11-11Firefox+FireBug使JQuery的學(xué)習(xí)更加輕松愉快
FireBug是FireFox下最強(qiáng)大的調(diào)試插件.利用它,可以讓JQuery的學(xué)習(xí)過程更加輕松愉快.2010-01-01Html+CSS+JS輪播圖實(shí)現(xiàn)源碼(手動(dòng)輪播,自動(dòng)輪播)
今天做網(wǎng)站的時(shí)候需要用上JS輪播圖代碼,而且還要求是原生的JS代碼,下面這篇文章主要給大家介紹了關(guān)于Html+CSS+JS輪播圖實(shí)現(xiàn)的相關(guān)資料,文中介紹的方法包括手動(dòng)輪播和自動(dòng)輪播,需要的朋友可以參考下2023-06-06JavaScript網(wǎng)絡(luò)請求工具庫axios使用實(shí)例探索
這篇文章主要為大家介紹了JavaScript網(wǎng)絡(luò)請求工具庫axios使用實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01用javascript實(shí)現(xiàn)div可編輯的常見方法
用javascript實(shí)現(xiàn)div可編輯的常見方法...2007-10-10