html5中文学习网

您的位置: 首页 > 网站及特效实例 > javascript特效 » 正文

javascript制作坦克大战全纪录(1)_javascript技巧_

[ ] 已经帮助:人解决问题

PS:这个坦克大战是在网上下的一段源码之后,自己进行的重写。本身没有太难的东西,这个案例将js面向对象用的比较好,可以作为js面向对象的入门教程。7xPHTML5中文学习网 - HTML5先行者学习网

1.   创建基本对象,实现坦克简单的移动7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

1.1    如何在地图中绘制画布7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

    考虑到浏览器兼容的问题,我们用操作dom的方式来实现游戏对象的绘制和刷新。我们如何存储我们的地图呢? 我们应该把地图用一个二维数组来保存, js中没有二维数组,但是可以通过在一维数组从存储数组来实现。7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

1.2    代码实现7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

    我们将画布设计为 13 * 13 的一个二维数组,每个元素在地图中对应的长和宽均为40px,可以把整个地图看成由 40px*40p x大小的单元格组成的一个表格,那么我们整个画布的大小为 520px  *  520px ;7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网
   上代码前先给大家来一张对象关系图:7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

7xPHTML5中文学习网 - HTML5先行者学习网

1.2.1    创建顶级对象7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

html代码:7xPHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
7xPHTML5中文学习网 - HTML5先行者学习网
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">7xPHTML5中文学习网 - HTML5先行者学习网
 <html>7xPHTML5中文学习网 - HTML5先行者学习网
 <head>7xPHTML5中文学习网 - HTML5先行者学习网
     <title>坦克大战</title>7xPHTML5中文学习网 - HTML5先行者学习网
     <link rel=stylesheet href="css/main.css" />7xPHTML5中文学习网 - HTML5先行者学习网
     <script src="js/Common.js"></script>7xPHTML5中文学习网 - HTML5先行者学习网
     <script src="js/TankObject.js"></script>7xPHTML5中文学习网 - HTML5先行者学习网
     <script src="js/Mover.js"></script>7xPHTML5中文学习网 - HTML5先行者学习网
     <script src="js/Tank.js"></script>7xPHTML5中文学习网 - HTML5先行者学习网
     <script src="js/Frame.js"></script>7xPHTML5中文学习网 - HTML5先行者学习网
     <script>7xPHTML5中文学习网 - HTML5先行者学习网
         window.onload = function () {7xPHTML5中文学习网 - HTML5先行者学习网
             // 调用游戏装载对象7xPHTML5中文学习网 - HTML5先行者学习网
             var loader = new GameLoader();7xPHTML5中文学习网 - HTML5先行者学习网
             loader.Begin();7xPHTML5中文学习网 - HTML5先行者学习网
         }7xPHTML5中文学习网 - HTML5先行者学习网
     </script>7xPHTML5中文学习网 - HTML5先行者学习网
 </head>7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网
 <body>7xPHTML5中文学习网 - HTML5先行者学习网
     <!--地图容器-->7xPHTML5中文学习网 - HTML5先行者学习网
     <div id="divMap">7xPHTML5中文学习网 - HTML5先行者学习网
     </div>7xPHTML5中文学习网 - HTML5先行者学习网
     <div id="debugInfo">7xPHTML5中文学习网 - HTML5先行者学习网
     </div>7xPHTML5中文学习网 - HTML5先行者学习网
 </body>7xPHTML5中文学习网 - HTML5先行者学习网
 </html>7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

TankObject.js文件:7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
7xPHTML5中文学习网 - HTML5先行者学习网
 // 顶级对象7xPHTML5中文学习网 - HTML5先行者学习网
 TankObject = function () {7xPHTML5中文学习网 - HTML5先行者学习网
     this.XPosition = 0; // 对象在地图(13*13)中的X的位置 7xPHTML5中文学习网 - HTML5先行者学习网
     this.YPosition = 0;7xPHTML5中文学习网 - HTML5先行者学习网
     this.UI = null; // dom元素7xPHTML5中文学习网 - HTML5先行者学习网
 }7xPHTML5中文学习网 - HTML5先行者学习网
 // 更改UI静态方法7xPHTML5中文学习网 - HTML5先行者学习网
 TankObject.prototype.UpdateUI = function (battlFiled) { }7xPHTML5中文学习网 - HTML5先行者学习网
 // 设置位置,参数是这样:1*40,6*407xPHTML5中文学习网 - HTML5先行者学习网
 TankObject.prototype.SetPosition = function (leftPosition, topPosition) {7xPHTML5中文学习网 - HTML5先行者学习网
     // 在地图的位置 Math.round四舍五入    7xPHTML5中文学习网 - HTML5先行者学习网
     this.XPosition = Math.round(leftPosition / 40);7xPHTML5中文学习网 - HTML5先行者学习网
     this.YPosition = Math.round(topPosition / 40);7xPHTML5中文学习网 - HTML5先行者学习网
     // 设置在窗体上的位置7xPHTML5中文学习网 - HTML5先行者学习网
     if (this.UI != null && this.UI.style != null) {7xPHTML5中文学习网 - HTML5先行者学习网
         this.UI.style.left = leftPosition + "px";7xPHTML5中文学习网 - HTML5先行者学习网
         this.UI.style.top = topPosition + "px";7xPHTML5中文学习网 - HTML5先行者学习网
     }7xPHTML5中文学习网 - HTML5先行者学习网
 }7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网
    这里​我们用X,Y坐标表示对象在地图上的位置。后面我们会将地图中的每个对象都放入二维数组中,这时可以通过X,Y坐标来取得对应的对象。7xPHTML5中文学习网 - HTML5先行者学习网
    然后用css中的left和top来控制我们对象在窗体中的位置。(可以移动的对象:坦克,子弹)7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

1.2.2   创建公用对象7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

    我们还需要创建一个公共的对象,来写入我们常用的一些方法。7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网
Common.js:7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
7xPHTML5中文学习网 - HTML5先行者学习网
// 坦克移动的四个方向7xPHTML5中文学习网 - HTML5先行者学习网
var EnumDirection = {7xPHTML5中文学习网 - HTML5先行者学习网
    Up: "0",7xPHTML5中文学习网 - HTML5先行者学习网
    Right: "1",7xPHTML5中文学习网 - HTML5先行者学习网
    Down: "2",7xPHTML5中文学习网 - HTML5先行者学习网
    Left: "3"7xPHTML5中文学习网 - HTML5先行者学习网
};7xPHTML5中文学习网 - HTML5先行者学习网
// 通用方法对象7xPHTML5中文学习网 - HTML5先行者学习网
var UtilityClass = {7xPHTML5中文学习网 - HTML5先行者学习网
    // 创建dom元素到parentNode中,可指定id,className7xPHTML5中文学习网 - HTML5先行者学习网
    CreateE: function (type, id, className, parentNode) {7xPHTML5中文学习网 - HTML5先行者学习网
        var J = document.createElement(type);7xPHTML5中文学习网 - HTML5先行者学习网
        if (id) { J.id = id };7xPHTML5中文学习网 - HTML5先行者学习网
        if (className) { J.className = className };7xPHTML5中文学习网 - HTML5先行者学习网
        return parentNode.appendChild(J);7xPHTML5中文学习网 - HTML5先行者学习网
    },  // 移除元素7xPHTML5中文学习网 - HTML5先行者学习网
    RemoveE: function (obj, parentNode) {7xPHTML5中文学习网 - HTML5先行者学习网
        parentNode.removeChild(obj);7xPHTML5中文学习网 - HTML5先行者学习网
    },7xPHTML5中文学习网 - HTML5先行者学习网
    GetFunctionName: function (context, argumentCallee) {7xPHTML5中文学习网 - HTML5先行者学习网
        for (var i in context) {7xPHTML5中文学习网 - HTML5先行者学习网
            if (context[i] == argumentCallee) { return i };7xPHTML5中文学习网 - HTML5先行者学习网
        }7xPHTML5中文学习网 - HTML5先行者学习网
        return "";7xPHTML5中文学习网 - HTML5先行者学习网
    },  // 绑定事件,返回func方法,this为传入的obj7xPHTML5中文学习网 - HTML5先行者学习网
    BindFunction: function (obj,func) {7xPHTML5中文学习网 - HTML5先行者学习网
        return function () {7xPHTML5中文学习网 - HTML5先行者学习网
            func.apply(obj, arguments);7xPHTML5中文学习网 - HTML5先行者学习网
        };7xPHTML5中文学习网 - HTML5先行者学习网
    }7xPHTML5中文学习网 - HTML5先行者学习网
};7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

1.2.3    创建移动对象7xPHTML5中文学习网 - HTML5先行者学习网

Mover.js7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
7xPHTML5中文学习网 - HTML5先行者学习网
 // 移动对象,继承自顶层对象7xPHTML5中文学习网 - HTML5先行者学习网
 Mover = function () {7xPHTML5中文学习网 - HTML5先行者学习网
     this.Direction = EnumDirection.Up;7xPHTML5中文学习网 - HTML5先行者学习网
     this.Speed = 1;7xPHTML5中文学习网 - HTML5先行者学习网
 }7xPHTML5中文学习网 - HTML5先行者学习网
 Mover.prototype = new TankObject();7xPHTML5中文学习网 - HTML5先行者学习网
 Mover.prototype.Move = function () {7xPHTML5中文学习网 - HTML5先行者学习网
     if (this.lock) {7xPHTML5中文学习网 - HTML5先行者学习网
         return;/* 停用或者尚在步进中,操作无效 */7xPHTML5中文学习网 - HTML5先行者学习网
     }7xPHTML5中文学习网 - HTML5先行者学习网
     // 根据方向设置坦克的背景图片7xPHTML5中文学习网 - HTML5先行者学习网
     this.UI.style.backgroundPosition = "0 -" + this.Direction * 40 + "px";7xPHTML5中文学习网 - HTML5先行者学习网
     // 如果方向是上和下,vp就是top;如果方向是上和左,val就是-17xPHTML5中文学习网 - HTML5先行者学习网
     var vp = ["top", "left"][((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Down)) ? 0 : 1];7xPHTML5中文学习网 - HTML5先行者学习网
     var val = ((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Left)) ? -1 : 1;7xPHTML5中文学习网 - HTML5先行者学习网
     this.lock = true;/* 加锁 */7xPHTML5中文学习网 - HTML5先行者学习网
     // 把当前对象保存到This7xPHTML5中文学习网 - HTML5先行者学习网
     var This = this;7xPHTML5中文学习网 - HTML5先行者学习网
     // 记录对象移动起始位置7xPHTML5中文学习网 - HTML5先行者学习网
     var startmoveP = parseInt(This.UI.style[vp]);7xPHTML5中文学习网 - HTML5先行者学习网
     var xp = This.XPosition, yp = This.YPosition;7xPHTML5中文学习网 - HTML5先行者学习网
     var subMove = setInterval(function () {7xPHTML5中文学习网 - HTML5先行者学习网
         // 开始移动,每次移动5px7xPHTML5中文学习网 - HTML5先行者学习网
         This.UI.style[vp] = parseInt(This.UI.style[vp]) + 5 * val + "px";7xPHTML5中文学习网 - HTML5先行者学习网
         // 每次移动一个单元格 40px7xPHTML5中文学习网 - HTML5先行者学习网
         if (Math.abs((parseInt(This.UI.style[vp]) - startmoveP)) >= 40) {7xPHTML5中文学习网 - HTML5先行者学习网
             clearInterval(subMove);7xPHTML5中文学习网 - HTML5先行者学习网
             This.lock = false;/* 解锁,允许再次步进 */7xPHTML5中文学习网 - HTML5先行者学习网
             // 记录对象移动后在表格中的位置7xPHTML5中文学习网 - HTML5先行者学习网
             This.XPosition = Math.round(This.UI.offsetLeft / 40);7xPHTML5中文学习网 - HTML5先行者学习网
             This.YPosition = Math.round(This.UI.offsetTop / 40);7xPHTML5中文学习网 - HTML5先行者学习网
         }7xPHTML5中文学习网 - HTML5先行者学习网
     }, 80 - this.Speed * 10);7xPHTML5中文学习网 - HTML5先行者学习网
 }7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网
    这里的移动对象继承自我们的顶级对象 ,这里this就代表调用Move方法的对象。7xPHTML5中文学习网 - HTML5先行者学习网
    Move对象的功能根据对象的方向和速度进行移动,每次移动5px总共移动40px一个单元格。后面这个对象还会进行扩展,会加入碰撞检测等功能。7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

1.2.4    创建坦克对象7xPHTML5中文学习网 - HTML5先行者学习网
 7xPHTML5中文学习网 - HTML5先行者学习网
Tank.js 文件:7xPHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
7xPHTML5中文学习网 - HTML5先行者学习网
//tank对象 继承自Mover7xPHTML5中文学习网 - HTML5先行者学习网
Tank=function(){}7xPHTML5中文学习网 - HTML5先行者学习网
Tank.prototype = new Mover();7xPHTML5中文学习网 - HTML5先行者学习网

// 创建玩家坦克,继承自tank对象7xPHTML5中文学习网 - HTML5先行者学习网
SelfTank = function () {7xPHTML5中文学习网 - HTML5先行者学习网
    this.UI = UtilityClass.CreateE("div", "", "itank", document.getElementById("divMap"));7xPHTML5中文学习网 - HTML5先行者学习网
    this.MovingState = false;7xPHTML5中文学习网 - HTML5先行者学习网
    this.Speed = 4;7xPHTML5中文学习网 - HTML5先行者学习网
}7xPHTML5中文学习网 - HTML5先行者学习网
SelfTank.prototype = new Tank();7xPHTML5中文学习网 - HTML5先行者学习网
// 设置坦克的位置7xPHTML5中文学习网 - HTML5先行者学习网
SelfTank.prototype.UpdateUI = function () {7xPHTML5中文学习网 - HTML5先行者学习网
    this.UI.className = "itank";7xPHTML5中文学习网 - HTML5先行者学习网
    // 顶级对象方法,设置坦克的位置7xPHTML5中文学习网 - HTML5先行者学习网
    this.SetPosition(this.XPosition * 40, this.YPosition * 40);7xPHTML5中文学习网 - HTML5先行者学习网
}7xPHTML5中文学习网 - HTML5先行者学习网

7xPHTML5中文学习网 - HTML5先行者学习网

     现在只创建了玩家坦克,后面我们还会往里添加敌人坦克。7xPHTML5中文学习网 - HTML5先行者学习网

1.2.5    创建游戏装载对象(核心)7xPHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
7xPHTML5中文学习网 - HTML5先行者学习网
 // 游戏载入对象 整个游戏的核心对象7xPHTML5中文学习网 - HTML5先行者学习网
 GameLoader = function () {7xPHTML5中文学习网 - HTML5先行者学习网
     this.mapContainer = document.getElementById("divMap");  // 存放游戏地图的div7xPHTML5中文学习网 - HTML5先行者学习网
     this._selfTank = null;  // 玩家坦克7xPHTML5中文学习网 - HTML5先行者学习网
     this._gameListener = null; // 游戏主循环计时器id7xPHTML5中文学习网 - HTML5先行者学习网
 }7xPHTML5中文学习网 - HTML5先行者学习网
 GameLoader.prototype = {7xPHTML5中文学习网 - HTML5先行者学习网
     Begin: function () {7xPHTML5中文学习网 - HTML5先行者学习网
         // 初始化玩家坦克7xPHTML5中文学习网 - HTML5先行者学习网
         var selfT = new SelfTank();7xPHTML5中文学习网 - HTML5先行者学习网
         selfT.XPosition = 4;7xPHTML5中文学习网 - HTML5先行者学习网
         selfT.YPosition = 12;7xPHTML5中文学习网 - HTML5先行者学习网
         selfT.UpdateUI();7xPHTML5中文学习网 - HTML5先行者学习网
         this._selfTank = selfT;7xPHTML5中文学习网 - HTML5先行者学习网
         // 添加按键事件7xPHTML5中文学习网 - HTML5先行者学习网
         var warpper = UtilityClass.BindFunction(this, this.OnKeyDown);7xPHTML5中文学习网 - HTML5先行者学习网
         window.onkeydown = document.body.onkeydown = warpper;7xPHTML5中文学习网 - HTML5先行者学习网
         warpper = UtilityClass.BindFunction(this, this.OnKeyUp);7xPHTML5中文学习网 - HTML5先行者学习网
         window.onkeyup = document.body.onkeyup = warpper;7xPHTML5中文学习网 - HTML5先行者学习网
         // 游戏主循环7xPHTML5中文学习网 - HTML5先行者学习网
         warpper = UtilityClass.BindFunction(this, this.Run);7xPHTML5中文学习网 - HTML5先行者学习网
         /*长定时器监听控制键*/7xPHTML5中文学习网 - HTML5先行者学习网
         this._gameListener = setInterval(warpper, 20);7xPHTML5中文学习网 - HTML5先行者学习网
     }7xPHTML5中文学习网 - HTML5先行者学习网
     // 键盘按下玩家坦克开始移动7xPHTML5中文学习网 - HTML5先行者学习网
     , OnKeyDown: function (e) {7xPHTML5中文学习网 - HTML5先行者学习网
         switch ((window.event || e).keyCode) {7xPHTML5中文学习网 - HTML5先行者学习网
             case 37:7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.Direction = EnumDirection.Left;7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.MovingState = true;7xPHTML5中文学习网 - HTML5先行者学习网
                 break;        //左7xPHTML5中文学习网 - HTML5先行者学习网
             case 38:7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.Direction = EnumDirection.Up;7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.MovingState = true;7xPHTML5中文学习网 - HTML5先行者学习网
                 break;        //上7xPHTML5中文学习网 - HTML5先行者学习网
             case 39:7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.Direction = EnumDirection.Right;7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.MovingState = true;7xPHTML5中文学习网 - HTML5先行者学习网
                 break;        //右7xPHTML5中文学习网 - HTML5先行者学习网
             case 40:7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.Direction = EnumDirection.Down;7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.MovingState = true;7xPHTML5中文学习网 - HTML5先行者学习网
                 break;        //下7xPHTML5中文学习网 - HTML5先行者学习网
         }7xPHTML5中文学习网 - HTML5先行者学习网
     }7xPHTML5中文学习网 - HTML5先行者学习网
     // 按键弹起停止移动7xPHTML5中文学习网 - HTML5先行者学习网
     , OnKeyUp: function (e) {7xPHTML5中文学习网 - HTML5先行者学习网
         switch ((window.event || e).keyCode) {7xPHTML5中文学习网 - HTML5先行者学习网
             case 37:7xPHTML5中文学习网 - HTML5先行者学习网
             case 38:7xPHTML5中文学习网 - HTML5先行者学习网
             case 39:7xPHTML5中文学习网 - HTML5先行者学习网
             case 40:7xPHTML5中文学习网 - HTML5先行者学习网
                 this._selfTank.MovingState = false;7xPHTML5中文学习网 - HTML5先行者学习网
                 break;7xPHTML5中文学习网 - HTML5先行者学习网
         }7xPHTML5中文学习网 - HTML5先行者学习网
     }7xPHTML5中文学习网 - HTML5先行者学习网
     /*游戏主循环运行函数,游戏的心脏,枢纽*/7xPHTML5中文学习网 - HTML5先行者学习网
     , Run: function () {7xPHTML5中文学习网 - HTML5先行者学习网
         if (this._selfTank.MovingState) {7xPHTML5中文学习网 - HTML5先行者学习网
             this._selfTank.Move();7xPHTML5中文学习网 - HTML5先行者学习网
         }7xPHTML5中文学习网 - HTML5先行者学习网
     }7xPHTML5中文学习网 - HTML5先行者学习网
 };7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

   游戏装载对象代码看起来很多,其实就做了两件事情:7xPHTML5中文学习网 - HTML5先行者学习网
        1、创建玩家坦克对象。7xPHTML5中文学习网 - HTML5先行者学习网
        2、添加按键监听事件,当玩家按下移动键调用坦克Move方法移动坦克。7xPHTML5中文学习网 - HTML5先行者学习网
7xPHTML5中文学习网 - HTML5先行者学习网

总结:到这里我们的坦克可以通过按键自由的移动了。下一步我们需要完善地图和碰撞检测。7xPHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助