PS:这个坦克大战是在网上下的一段源码之后,自己进行的重写。 写这个的目的是为了巩固自己这段时间对js的学习。整理到博客上,算是对自己近端时间学习js的一个整理。 同时也希望可以帮助到学习js的园友。由于自己也是刚学js不久,所以难免出现错误。如果发现希望给予指正。 这个教程适合熟悉js基本语法和面向对象语法的园友学习。 本身没有太难的东西,这个案例将js面向对象用的比较好,可以作为js面向对象的入门教程。
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2 <html> 3 <head> 4 <title>坦克大战</title> 5 <link rel=stylesheet href="CSS/main.css" /> 6 <script src="js/Common.js"></script> 7 <script src="js/TankObject.js"></script> 8 <script src="js/Mover.js"></script> 9 <script src="js/Tank.js"></script>10 <script src="js/Frame.js"></script>11 <script>12 window.onload = function () {13 // 调用游戏装载对象14 var loader = new GameLoader();15 loader.Begin();16 }17 </script>18 </head>19 20 <body>21 <!--地图容器-->22 <div id="divMap">23 </div>24 <div id="debugInfo">25 </div>26 </body>27 </html>View CodeTankObject.js文件:
1 // 顶级对象 2 TankObject = function () { 3 this.XPosition = 0; // 对象在地图(13*13)中的X的位置 4 this.YPosition = 0; 5 this.UI = null; // dom元素 6 } 7 // 更改UI静态方法 8 TankObject.PRototype.UpdateUI = function (battlFiled) { } 9 // 设置位置,参数是这样:1*40,6*4010 TankObject.prototype.SetPosition = function (leftPosition, topPosition) {11 // 在地图的位置 Math.round四舍五入 12 this.XPosition = Math.round(leftPosition / 40);13 this.YPosition = Math.round(topPosition / 40);14 // 设置在窗体上的位置15 if (this.UI != null && this.UI.style != null) {16 this.UI.style.left = leftPosition + "px";17 this.UI.style.top = topPosition + "px";18 }19 }View Code 这里?我们用X,Y坐标表示对象在地图上的位置。后面我们会将地图中的每个对象都放入二维数组中,这时可以通过X,Y坐标来取得对应的对象。 然后用css中的left和top来控制我们对象在窗体中的位置。(可以移动的对象:坦克,子弹)
// 坦克移动的四个方向var EnumDirection = { Up: "0", Right: "1", Down: "2", Left: "3"};// 通用方法对象var UtilityClass = { // 创建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); }; }};View Code
1 // 移动对象,继承自顶层对象 2 Mover = function () { 3 this.Direction = EnumDirection.Up; 4 this.Speed = 1; 5 } 6 Mover.prototype = new TankObject(); 7 Mover.prototype.Move = function () { 8 if (this.lock) { 9 return;/* 停用或者尚在步进中,操作无效 */10 }11 // 根据方向设置坦克的背景图片12 this.UI.style.backgroundPosition = "0 -" + this.Direction * 40 + "px";13 // 如果方向是上和下,vp就是top;如果方向是上和左,val就是-114 var vp = ["top", "left"][((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Down)) ? 0 : 1];15 var val = ((this.Direction == EnumDirection.Up) || (this.Direction == EnumDirection.Left)) ? -1 : 1;16 this.lock = true;/* 加锁 */17 // 把当前对象保存到This18 var This = this;19 // 记录对象移动起始位置20 var startmoveP = parseInt(This.UI.style[vp]);21 var xp = This.XPosition, yp = This.YPosition;22 var subMove = setInterval(function () {23 // 开始移动,每次移动5px24 This.UI.style[vp] = parseInt(This.UI.style[vp]) + 5 * val + "px";25 // 每次移动一个单元格 40px26 if (Math.abs((parseInt(This.UI.style[vp]) - startmoveP)) >= 40) {27 clearInterval(subMove);28 This.lock = false;/* 解锁,允许再次步进 */29 // 记录对象移动后在表格中的位置30 This.XPosition = Math.round(This.UI.offsetLeft / 40);31 This.YPosition = Math.round(This.UI.offsetTop / 40);32 33 }34 }, 80 - this.Speed * 10);35 36 }View Code 这里的移动对象继承自我们的顶级对象 ,这里this就代表调用Move方法的对象。 Move对象的功能根据对象的方向和速度进行移动,每次移动5px总共移动40px一个单元格。后面这个对象还会进行扩展,会加入碰撞检测等功能。
//tank对象 继承自MoverTank=function(){}Tank.prototype = new Mover();// 创建玩家坦克,继承自tank对象SelfTank = function () { this.UI = UtilityClass.CreateE("div", "", "itank", document.getElementById("divMap")); this.MovingState = false; this.Speed = 4;}SelfTank.prototype = new Tank();// 设置坦克的位置SelfTank.prototype.UpdateUI = function () { this.UI.className = "itank"; // 顶级对象方法,设置坦克的位置 this.SetPosition(this.XPosition * 40, this.YPosition * 40);}View Code 现在只创建了玩家坦克,后面我们还会往里添加敌人坦克。
1 // 游戏载入对象 整个游戏的核心对象 2 GameLoader = function () { 3 this.mapContainer = document.getElementById("divMap"); // 存放游戏地图的div 4 this._selfTank = null; // 玩家坦克 5 this._gameListener = null; // 游戏主循环计时器id 6 } 7 GameLoader.prototype = { 8 Begin: function () { 9 // 初始化玩家坦克10 var selfT = new Self
新闻热点
疑难解答