JS学习笔记之贪吃蛇小游戏demo实例详解(2)

//游戏 (function(){ var that=null; //游戏的构造函数 function Game(map){ this.food=new Food(); this.snake=new Snake(); this.map=map;//地图 that=this; } Game.prototype.init=function(){ //初始化游戏 //食物初始化 this.food.init(this.map); this.snake.init(this.map); this.runSnake(this.food,this.map) this.bindKey(); } Game.prototype.runSnake=function(food,map){ //自动的去移动 var timeId=setInterval(function(){ //此时的this是window //蛇的移动 this.snake.move(food,map); //初始化蛇 this.snake.init(map); //横坐标最大值 var maxX=map.offsetWidth/this.snake.width; //获取纵坐标的最大值 var maxY=map.offsetHeight/this.snake.height; //蛇头的坐标 var headX=this.snake.body[0].x; var headY=this.snake.body[0].y; //判断横坐标 if(headX<0||headX>=maxX){ clearInterval(timeId) alert("游戏结束") } //判断纵坐标 if(headY<0||headY>maxY){ clearInterval(timeId) alert("游戏结束") } console.log(headX) }.bind(that),150) } Game.prototype.bindKey=function(){ //获取用户的按键,改变小蛇的方向 document.addEventListener("keydown",function(e){ //获取案件的值 switch(e.keyCode){ case 37: this.snake.direction="left"; break; case 38: this.snake.direction="top"; break; case 39: this.snake.direction="right"; break; case 40: this.snake.direction="bottom"; break; } }.bind(that),false) } window.Game=Game; }()); //初始化游戏对象 var gm=new Game(document.querySelector(".map")); gm.init()

这里加一个小插曲,关于匿名函数自调用的三种写法

第一种


第二种


第三种


注意!注意! 注意! 匿名函数的最后不要忘记加封号;  因为如果忘了加,系统很容易与后面的代码混淆 造成各种很奇葩的报错;

这里我推荐第三种写法,比较清晰明了

好,代码贴完了,我们来分析一下实现思路

首先 第一步

建立一个画布

设置画布的宽度为800px   高度为600px  因为小蛇 需要在画布内任意移动,需要脱离标准文档流,所以需要设置绝对定位, 因此我给画布添加了position:relative;  ,再给背景添加一个颜色 ,灰色#ccc

好,画布创建好了,我们可以开始编写逻辑代码了

Food.js 代码分析

首先我们需要创建一个贪吃蛇 吃的“食物”,因此我们需要创建一个食物的对象,这里我在food.js中创建了一个自定义构造函数

定义了 “食物Food”的 x值、y值、宽度、高度、颜色

JS学习笔记之贪吃蛇小游戏demo实例详解

这里我利用 || 运算设置了默认值,如果 || 左边为false 则会自动取右边的值,所以当实例化对象时若未传参时 自动取 “||” 运算符右边的值

然后在"Food"的原型上定义了一个 init 初始化方法

首先创建一个div ,并将此对象保存在 div变量中

然后 在地图中 添加上这个 div  再逐步给这个 div元素 加上他的宽度、高度、背景颜色、并且设置绝对定位

那我们怎么定位呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c453ccd5d2d46bb9946b7502a414a1d7.html