1:首先是index.wxml文件代码:
<!--index.wxml--> <canvas canvas-id=\'snakeCanvas\' style=\'width:100%;height:100%;background-color:#ccc;\'
bindtouchstart=\'canvasStart\' bindtouchmove=\'canvasMove\' bindtouchend=\'canvasEnd\'></canvas>
2:然后是index.js文件代码
//index.js //手指按下时的坐标 var startX = 0; var startY = 0; //手指在canvas上移动的坐标 var moveX = 0; var moveY = 0; //移动位置跟开始位置差值 var X =0; var Y = 0; //手指方向 var direction = null; //蛇移动方向 var snakeDirection = "right"; //身体对象(数组) var snakeBodys = []; //食物对象(数组) var foods = []; //窗口的宽高 var windowWidth = 0; var windowHeight = 0; //用来获取屏幕大小 wx.getSystemInfo({ success: function (res) { windowWidth = res.windowWidth; windowHeight = res.windowHeight; } }); //蛇头对象 var snakeHead = { x: parseInt(Math.random() * (windowWidth-20)), y: parseInt(Math.random() * (windowHeight-20)), color: \'#ff0000\', //这里只能接受16进制 没法写red这样 w: 20, h: 20, reset:function(){ this.x = parseInt(Math.random() * (windowWidth - 20)); this.y = parseInt(Math.random() * (windowHeight - 20)); } } //用于确定是否删除 var collideBol = true; Page({ canvasStart:function(e){ startX = e.touches[0].x; startY = e.touches[0].y; }, canvasMove:function(e){ moveX = e.touches[0].x; moveY = e.touches[0].y; X = moveX - startX; Y = moveY - startY; if(Math.abs(X) > Math.abs(Y) && X > 0){ direction = "right"; }else if(Math.abs(X) > Math.abs(Y) && X < 0){ direction = "left"; }else if (Math.abs(Y) > Math.abs(X) && Y > 0) { direction = "down"; //这里很奇怪,是我数学坐标系没学好吗?明明Y轴正坐标是向上才对啊 }else if (Math.abs(Y) > Math.abs(X) && Y < 0) { direction = "top"; } }, canvasEnd:function(){ snakeDirection = direction; }, onReady:function(){ var context = wx.createContext(); //帧数 var frameNum = 0; function draw(obj){ context.setFillStyle(obj.color); context.beginPath(); context.rect(obj.x, obj.y, obj.w, obj.h); context.closePath(); context.fill(); } //蛇头与食物碰撞函数 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; } } //蛇头与墙壁碰撞函数 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; } } function directionSet(){ switch (snakeDirection) { case "left": snakeHead.x -= snakeHead.w; break; case "right": snakeHead.x += snakeHead.w; break; case "down": snakeHead.y += snakeHead.h; break; case "top": snakeHead.y -= snakeHead.h; break; } } function animate(){ frameNum++; if (frameNum % 20 == 0){ //蛇身体数组添加一个上一个的位置(身体对象) snakeBodys.push({ x: snakeHead.x, y: snakeHead.y, w: 20, h: 20, color: "#00ff00" }); if (snakeBodys.length > 4) { //移除不用的身体位置 if (collideBol){ snakeBodys.shift(); }else{ collideBol = true; } } directionSet(); } //绘制蛇头 draw(snakeHead); if (collide2(snakeHead)) { collideBol = false; snakeHead.reset(); snakeBodys=[]; draw(snakeHead); } //绘制蛇身 for(var i=0;i<snakeBodys.length;i++){ var snakeBody = snakeBodys[i]; draw(snakeBody); } //绘制食物 for(var i=0;i<foods.length;i++){ var foodObj = foods[i]; draw(foodObj); if (collide(snakeHead,foodObj)){ //console.log("撞上了"); collideBol = false; foodObj.reset(); } } wx.drawCanvas({ canvasId:"snakeCanvas", actions:context.getActions() }); requestAnimationFrame(animate); } function rand(min,max){ return parseInt(Math.random()*(max-min))+min; } //构造食物对象 function Food() { var w = rand(10,20); this.w = w; this.h = w; this.x = rand(this.w, windowWidth - this.w); this.y = rand(this.h, windowHeight - this.h); this.color = "rgb("+rand(0,255)+","+rand(0,255)+","+rand(0,255)+")"; //内部方法 (重置食物位置颜色) 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 < 20; i++) { var foodObj = new Food(); foods.push(foodObj); } animate(); } })