微信小程序之贪吃蛇游戏开发最后一天了,今天主要讲的是以下三点:

1:绘制蛇身

2:碰撞函数

3:重新开始

 

一:绘制蛇身

  蛇的身体一开始有个默认长度,然后等吃到食物的时候就加一长度。

//身体对象(数组)
var snakeBodys = [];

也是给了一个数组对象,并且逻辑是不断往数组里添加元素,但是当大于长度4的时候就停止自动添加元素

只有当吃到食物才继续变长

//蛇身体数组添加一个上一个的位置(身体对象)
        snakeBodys.push({
          x: snakeHead.x,
          y: snakeHead.y,
          w: 20,
          h: 20,
          color: "#00ff00"
        });

绘制身体部分代码:

//绘制蛇身
      for(var i=0;i<snakeBodys.length;i++){
        var snakeBody = snakeBodys[i];
        draw(snakeBody);
      }

再加一个判断条件用来控制初始最大身体长度

if (snakeBodys.length > 4) {
          //移除不用的身体位置
            snakeBodys.shift();
     //.shift()数组删除函数
        }

 

二:碰撞函数

只有当蛇头碰到食物的时候才会增加蛇身长度。逻辑如下:

蛇头为一个四方边框,我们设置了蛇头的坐标和长宽,那么就可以利用四边的坐标值是否大于等于食物

所在的坐标值,以此来判断是否发生了碰撞。

那么就有这么个逻辑函数:

//蛇头与食物碰撞函数
    function collide(obj1,obj2){
      var l1 = obj1.x;
      var r1 = obj1.w + l1;
      var t1 = obj1.y;
      var b1 = obj1.h+t1;

      var l2 = obj2.x;
      var r2 = obj2.w + l2;
      var t2 = obj2.y;
      var b2 = obj2.h + t2;

      //这里1是蛇头方块的上下左右边框  2是食物,同样是上下左右
//(当蛇头又边框撞到食物左边框也就是大于左边框时就是碰撞了)
      if(r1>l2 && l1<r2 && b1 > t2 && t1< b2){
        return true;
      }else{
        return false;
      }
    }

obj1接收的是蛇头对象,obj2接收的是食物对象。

l1:蛇头左边框坐标值,r1:蛇头右边框坐标值,t1:蛇头上边框坐标值,b1:蛇头下边框坐标值

同理l2,r2,t2,b2

然后再设置一个用来确认是否增加蛇身的变量

//用于确定是否删除

var collideBol = true; 一开始默认是直接调用.shift()方法的

当碰撞到食物后

if (snakeBodys.length > 4) {
          //移除不用的身体位置
          if (collideBol){
            snakeBodys.shift();
          }else{
            collideBol = true;
          }
         
        }

对于碰撞后食物的重新绘制,代码如下:

在Food()对象创建方法里加一个内部方法:

this.reset = function (){
        this.x = rand(0,windowWidth);
        this.y = rand(0,windowHeight);
        this.color = "rgb(" + rand(0, 255) + "," + rand(0, 255) + "," + rand(0, 255) + ")";
      }

在绘制食物的同时加上是否碰撞的逻辑判断

//绘制食物
      for(var i=0;i<foods.length;i++){
        var foodObj = foods[i];
        draw(foodObj); 
        if (collide(snakeHead,foodObj)){
          //console.log("撞上了");
          collideBol = false;
          foodObj.reset();//撞到后食物对象重绘,内部方法reset()
        }
      }

三:蛇头与墙壁碰撞函数(重新开始)

//蛇头与墙壁碰撞函数
    function collide2(obj1){
      var l1 = obj1.x;
      var r1 = obj1.w + l1;
      var t1 = obj1.y;
      var b1 = obj1.h + t1;
      if (l1 <=snakeHead.w || r1 >=windowWidth || t1 <=snakeHead.h || b1 >= windowHeight){
        return true;
      }else{
        return false;
      }
    }

对于这里的windowWidth等屏幕长宽,我设置了全局变量来获取

//窗口的宽高
var windowWidth = 0;
var windowHeight = 0;

//用来获取屏幕大小
wx.getSystemInfo({
  success: function (res) {
    windowWidth = res.windowWidth;
    windowHeight = res.windowHeight;
  }
});

 

好了这就是微信小程序之贪吃蛇小游戏开发代码解析所有内容了。后一文将会贴出完整的代码