欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript制作坦克大戰(zhàn)全紀(jì)錄(1)

 更新時(shí)間:2014年11月27日 10:06:19   投稿:hebedich  
本文寫(xiě)作的目的是鞏固一下自己最近學(xué)習(xí)的js知識(shí), 這個(gè)教程適合熟悉js基本語(yǔ)法和面向?qū)ο笳Z(yǔ)法的小伙伴學(xué)習(xí)。由于自己也是剛學(xué)js不久,所以難免出現(xiàn)錯(cuò)誤。如果發(fā)現(xiàn)希望給予指正。

PS:這個(gè)坦克大戰(zhàn)是在網(wǎng)上下的一段源碼之后,自己進(jìn)行的重寫(xiě)。本身沒(méi)有太難的東西,這個(gè)案例將js面向?qū)ο笥玫谋容^好,可以作為js面向?qū)ο蟮娜腴T教程。

1.   創(chuàng)建基本對(duì)象,實(shí)現(xiàn)坦克簡(jiǎn)單的移動(dòng)

1.1    如何在地圖中繪制畫(huà)布?

    考慮到瀏覽器兼容的問(wèn)題,我們用操作dom的方式來(lái)實(shí)現(xiàn)游戲?qū)ο蟮睦L制和刷新。我們?nèi)绾未鎯?chǔ)我們的地圖呢? 我們應(yīng)該把地圖用一個(gè)二維數(shù)組來(lái)保存, js中沒(méi)有二維數(shù)組,但是可以通過(guò)在一維數(shù)組從存儲(chǔ)數(shù)組來(lái)實(shí)現(xiàn)。

1.2    代碼實(shí)現(xiàn)

    我們將畫(huà)布設(shè)計(jì)為 13 * 13 的一個(gè)二維數(shù)組,每個(gè)元素在地圖中對(duì)應(yīng)的長(zhǎng)和寬均為40px,可以把整個(gè)地圖看成由 40px*40p x大小的單元格組成的一個(gè)表格,那么我們整個(gè)畫(huà)布的大小為 520px  *  520px ;
 
   上代碼前先給大家來(lái)一張對(duì)象關(guān)系圖:

1.2.1    創(chuàng)建頂級(jí)對(duì)象

html代碼:

復(fù)制代碼 代碼如下:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 <html>
 <head>
     <title>坦克大戰(zhàn)</title>
     <link rel=stylesheet href="css/main.css" />
     <script src="js/Common.js"></script>
     <script src="js/TankObject.js"></script>
     <script src="js/Mover.js"></script>
     <script src="js/Tank.js"></script>
     <script src="js/Frame.js"></script>
     <script>
         window.onload = function () {
             // 調(diào)用游戲裝載對(duì)象
             var loader = new GameLoader();
             loader.Begin();
         }
     </script>
 </head>
 
 <body>
     <!--地圖容器-->
     <div id="divMap">
     </div>
     <div id="debugInfo">
     </div>
 </body>
 </html>

TankObject.js文件:
 

復(fù)制代碼 代碼如下:

 // 頂級(jí)對(duì)象
 TankObject = function () {
     this.XPosition = 0; // 對(duì)象在地圖(13*13)中的X的位置
     this.YPosition = 0;
     this.UI = null; // dom元素
 }
 // 更改UI靜態(tài)方法
 TankObject.prototype.UpdateUI = function (battlFiled) { }
 // 設(shè)置位置,參數(shù)是這樣:1*40,6*40
 TankObject.prototype.SetPosition = function (leftPosition, topPosition) {
     // 在地圖的位置 Math.round四舍五入   
     this.XPosition = Math.round(leftPosition / 40);
     this.YPosition = Math.round(topPosition / 40);
     // 設(shè)置在窗體上的位置
     if (this.UI != null && this.UI.style != null) {
         this.UI.style.left = leftPosition + "px";
         this.UI.style.top = topPosition + "px";
     }
 }

 
    這里​我們用X,Y坐標(biāo)表示對(duì)象在地圖上的位置。后面我們會(huì)將地圖中的每個(gè)對(duì)象都放入二維數(shù)組中,這時(shí)可以通過(guò)X,Y坐標(biāo)來(lái)取得對(duì)應(yīng)的對(duì)象。
    然后用css中的left和top來(lái)控制我們對(duì)象在窗體中的位置。(可以移動(dòng)的對(duì)象:坦克,子彈)
 

1.2.2   創(chuàng)建公用對(duì)象

    我們還需要?jiǎng)?chuàng)建一個(gè)公共的對(duì)象,來(lái)寫(xiě)入我們常用的一些方法。
 
Common.js:
 

復(fù)制代碼 代碼如下:

// 坦克移動(dòng)的四個(gè)方向
var EnumDirection = {
    Up: "0",
    Right: "1",
    Down: "2",
    Left: "3"
};
// 通用方法對(duì)象
var UtilityClass = {
    // 創(chuàng)建dom元素到parentNode中,可指定id,className
    CreateE: function (type, id, className, parentNode) {
        var J = document.createElement(type);
        if (id) { J.id = id };
        if (className) { J.className = className };
        return parentNode.appendChild(J);
    },  // 移除元素
    RemoveE: function (obj, parentNode) {
        parentNode.removeChild(obj);
    },
    GetFunctionName: function (context, argumentCallee) {
        for (var i in context) {
            if (context[i] == argumentCallee) { return i };
        }
        return "";
    },  // 綁定事件,返回func方法,this為傳入的obj
    BindFunction: function (obj,func) {
        return function () {
            func.apply(obj, arguments);
        };
    }
};

1.2.3    創(chuàng)建移動(dòng)對(duì)象

Mover.js
 

復(fù)制代碼 代碼如下:

 // 移動(dòng)對(duì)象,繼承自頂層對(duì)象
 Mover = function () {
     this.Direction = EnumDirection.Up;
     this.Speed = 1;
 }
 Mover.prototype = new TankObject();
 Mover.prototype.Move = function () {
     if (this.lock) {
         return;/* 停用或者尚在步進(jìn)中,操作無(wú)效 */
     }
     // 根據(jù)方向設(shè)置坦克的背景圖片
     this.UI.style.backgroundPosition = "0 -" + this.Direction * 40 + "px";
     // 如果方向是上和下,vp就是top;如果方向是上和左,val就是-1
     var vp = ["top", "left"][((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Down)) ? 0 : 1];
     var val = ((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Left)) ? -1 : 1;
     this.lock = true;/* 加鎖 */
     // 把當(dāng)前對(duì)象保存到This
     var This = this;
     // 記錄對(duì)象移動(dòng)起始位置
     var startmoveP = parseInt(This.UI.style[vp]);
     var xp = This.XPosition, yp = This.YPosition;
     var subMove = setInterval(function () {
         // 開(kāi)始移動(dòng),每次移動(dòng)5px
         This.UI.style[vp] = parseInt(This.UI.style[vp]) + 5 * val + "px";
         // 每次移動(dòng)一個(gè)單元格 40px
         if (Math.abs((parseInt(This.UI.style[vp]) - startmoveP)) >= 40) {
             clearInterval(subMove);
             This.lock = false;/* 解鎖,允許再次步進(jìn) */
             // 記錄對(duì)象移動(dòng)后在表格中的位置
             This.XPosition = Math.round(This.UI.offsetLeft / 40);
             This.YPosition = Math.round(This.UI.offsetTop / 40);
         }
     }, 80 - this.Speed * 10);
 }

 
    這里的移動(dòng)對(duì)象繼承自我們的頂級(jí)對(duì)象 ,這里this就代表調(diào)用Move方法的對(duì)象。
    Move對(duì)象的功能根據(jù)對(duì)象的方向和速度進(jìn)行移動(dòng),每次移動(dòng)5px總共移動(dòng)40px一個(gè)單元格。后面這個(gè)對(duì)象還會(huì)進(jìn)行擴(kuò)展,會(huì)加入碰撞檢測(cè)等功能。

1.2.4    創(chuàng)建坦克對(duì)象
 
Tank.js 文件:

復(fù)制代碼 代碼如下:

//tank對(duì)象 繼承自Mover
Tank=function(){}
Tank.prototype = new Mover();

// 創(chuàng)建玩家坦克,繼承自tank對(duì)象
SelfTank = function () {
    this.UI = UtilityClass.CreateE("div", "", "itank", document.getElementById("divMap"));
    this.MovingState = false;
    this.Speed = 4;
}
SelfTank.prototype = new Tank();
// 設(shè)置坦克的位置
SelfTank.prototype.UpdateUI = function () {
    this.UI.className = "itank";
    // 頂級(jí)對(duì)象方法,設(shè)置坦克的位置
    this.SetPosition(this.XPosition * 40, this.YPosition * 40);
}

     現(xiàn)在只創(chuàng)建了玩家坦克,后面我們還會(huì)往里添加敵人坦克。

1.2.5    創(chuàng)建游戲裝載對(duì)象(核心)

復(fù)制代碼 代碼如下:

 // 游戲載入對(duì)象 整個(gè)游戲的核心對(duì)象
 GameLoader = function () {
     this.mapContainer = document.getElementById("divMap");  // 存放游戲地圖的div
     this._selfTank = null;  // 玩家坦克
     this._gameListener = null; // 游戲主循環(huán)計(jì)時(shí)器id
 }
 GameLoader.prototype = {
     Begin: function () {
         // 初始化玩家坦克
         var selfT = new SelfTank();
         selfT.XPosition = 4;
         selfT.YPosition = 12;
         selfT.UpdateUI();
         this._selfTank = selfT;
         // 添加按鍵事件
         var warpper = UtilityClass.BindFunction(this, this.OnKeyDown);
         window.onkeydown = document.body.onkeydown = warpper;
         warpper = UtilityClass.BindFunction(this, this.OnKeyUp);
         window.onkeyup = document.body.onkeyup = warpper;
         // 游戲主循環(huán)
         warpper = UtilityClass.BindFunction(this, this.Run);
         /*長(zhǎng)定時(shí)器監(jiān)聽(tīng)控制鍵*/
         this._gameListener = setInterval(warpper, 20);
     }
     // 鍵盤按下玩家坦克開(kāi)始移動(dòng)
     , OnKeyDown: function (e) {
         switch ((window.event || e).keyCode) {
             case 37:
                 this._selfTank.Direction = EnumDirection.Left;
                 this._selfTank.MovingState = true;
                 break;        //左
             case 38:
                 this._selfTank.Direction = EnumDirection.Up;
                 this._selfTank.MovingState = true;
                 break;        //上
             case 39:
                 this._selfTank.Direction = EnumDirection.Right;
                 this._selfTank.MovingState = true;
                 break;        //右
             case 40:
                 this._selfTank.Direction = EnumDirection.Down;
                 this._selfTank.MovingState = true;
                 break;        //下
         }
     }
     // 按鍵彈起停止移動(dòng)
     , OnKeyUp: function (e) {
         switch ((window.event || e).keyCode) {
             case 37:
             case 38:
             case 39:
             case 40:
                 this._selfTank.MovingState = false;
                 break;
         }
     }
     /*游戲主循環(huán)運(yùn)行函數(shù),游戲的心臟,樞紐*/
     , Run: function () {
         if (this._selfTank.MovingState) {
             this._selfTank.Move();
         }
     }
 };

   游戲裝載對(duì)象代碼看起來(lái)很多,其實(shí)就做了兩件事情:
        1、創(chuàng)建玩家坦克對(duì)象。
        2、添加按鍵監(jiān)聽(tīng)事件,當(dāng)玩家按下移動(dòng)鍵調(diào)用坦克Move方法移動(dòng)坦克。

總結(jié):到這里我們的坦克可以通過(guò)按鍵自由的移動(dòng)了。下一步我們需要完善地圖和碰撞檢測(cè)。

相關(guān)文章

  • JS判斷微信掃碼的方法

    JS判斷微信掃碼的方法

    這篇文章通過(guò)代碼給大家介紹了JS判斷是否是微信掃碼的方法,非常不錯(cuò),需要的朋友參考下吧
    2017-08-08
  • Javascript變量作用域詳解

    Javascript變量作用域詳解

    這篇文章主要是對(duì)Javascript變量作用域進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • JavaScript動(dòng)態(tài)提示輸入框輸入字?jǐn)?shù)的方法

    JavaScript動(dòng)態(tài)提示輸入框輸入字?jǐn)?shù)的方法

    這篇文章主要介紹了JavaScript動(dòng)態(tài)提示輸入框輸入字?jǐn)?shù)的方法,實(shí)例分析了javascript針對(duì)頁(yè)面元素的動(dòng)態(tài)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • TypeScript聯(lián)合類型,交叉類型和類型保護(hù)

    TypeScript聯(lián)合類型,交叉類型和類型保護(hù)

    這篇文章主要介紹了TypeScript聯(lián)合類型,交叉類型和類型保護(hù),聯(lián)合類型就是定義一些類型,定義的變量只需要滿足任意一種類型即可,交叉類型就是需要滿足所有類型,交叉類型使用,更多內(nèi)容我們來(lái)看看下面文章詳細(xì)內(nèi)容吧
    2021-12-12
  • JavaScript變量聲明詳解

    JavaScript變量聲明詳解

    本文詳細(xì)向大家介紹了javascript變量聲明,并通過(guò)示例進(jìn)行了具體分析,是篇非常不錯(cuò)的文章,這里推薦給剛?cè)腴T的jser。
    2014-11-11
  • 解決微信小程序云開(kāi)發(fā)中獲取數(shù)據(jù)庫(kù)的內(nèi)容為空的方法

    解決微信小程序云開(kāi)發(fā)中獲取數(shù)據(jù)庫(kù)的內(nèi)容為空的方法

    這篇文章主要介紹了解決微信小程序云開(kāi)發(fā)中獲取數(shù)據(jù)庫(kù)的內(nèi)容為空的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • 讓JavaScript代碼更加精簡(jiǎn)的方法技巧

    讓JavaScript代碼更加精簡(jiǎn)的方法技巧

    這篇文章主要介紹了讓JavaScript代碼更加精簡(jiǎn)的方法技巧,文章通過(guò)使用?JavaScript對(duì)象解構(gòu)來(lái)節(jié)省代碼,JavaScript?對(duì)象解構(gòu)賦值在項(xiàng)目開(kāi)發(fā)中是一個(gè)常用的技能。下文實(shí)現(xiàn)過(guò)程需要的小伙伴可以參考一下
    2022-06-06
  • 沒(méi)有document.getElementByName方法

    沒(méi)有document.getElementByName方法

    document.getElementByName方法沒(méi)有document.getElementsByName得到的是標(biāo)簽的數(shù)組,下面為大家詳細(xì)介紹下具體的使用,感興趣的朋友可以參考下,希望對(duì)大家有所幫助
    2013-08-08
  • 前端必會(huì)的圖片懶加載(三種方式)

    前端必會(huì)的圖片懶加載(三種方式)

    在我們?cè)L問(wèn)一個(gè)圖片展示比較多的網(wǎng)頁(yè)時(shí),加載速度慢很多時(shí)候正是因?yàn)閳D片多導(dǎo)致,本文主要介紹了前端必會(huì)的圖片懶加載(三種方式),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 使用js寫(xiě)的一個(gè)簡(jiǎn)易的投票

    使用js寫(xiě)的一個(gè)簡(jiǎn)易的投票

    投票想必大家并不陌生吧,下面為大家介紹下使用js是如何寫(xiě)一個(gè)簡(jiǎn)易的投票
    2013-11-11

最新評(píng)論