在微信小游戏中开发一个贪食蛇
为什么80%的码农都做不了架构师?>>>
我自己也写过一个贪食蛇的小游戏,不过是对dom的操作,微信小游戏是采用js语法基于canvas的开发。为了省事在网上直接搜了一个基于canvas的贪食蛇实现。
非常感谢作者: 不是加多宝的宝 (来自简书)
文章地址:https://www.jianshu.com/p/ba5031c20cde
不过作者的代码如果想完全在小游戏中使用需要做一些修改,比如eval的支持问题,alert的支持问题,还有就是源代码的事件是键盘事件,蛇的宽高太小等。我对源代码做了上述部分的修改,下面是目录结构和代码,大家可以创建项目,复制代码演示:
根目录:
js目录:
libs目录保持不变,采用快速生成会自动生成这个目录;
libs目录:
game.js
import './js/libs/weapp-adapter'
import './js/libs/symbol'import Main from './js/main'
js/main.js
var c = canvas.getContext('2d')
console.log(canvas)var mWidth = canvas.width; //当前可视区域的宽,即canvas的宽
var mHeight = canvas.height; //当前可视区域的高,即canvas的高
var unit = 15; //设定每个格子的边长
var mwid = mWidth / unit; //计算当前横向格子数量
var mhei = mHeight / unit; //计算当前竖向格子数量
var point = point = {x : 0 , y : 0}; //记录食物的坐标的变量初始化
var score = 0; //记录成绩的变量初始化//注意本对象,并不改变其在画布上的样子,只是负责改变状态,改变样子的另有方法
//蛇对象
var shake = {startX: 3,//开始头x坐标startY: 0,//开始头y坐标currOri: 'right',//初始化方向ori: [['left', 'right'], ['up', 'down']],//相逆方向数组oriss: ['left', 'right', 'up', 'down'],//所有允许的方向,用来判断方向合法性,在canChangeOri方法mes: [{x: 3,y: 0},{x: 2,y: 0},{x: 1,y: 0}],//初始化蛇的身体坐标,初始长度3//坐标为格子坐标非像素坐标//添加一个身体的方法add: function () {//判断当前尾部方向var last = this.mes[this.mes.length - 1]; //获取最后一个身体var plast = this.mes[this.mes.length - 2]; //获取倒数第二个身体var px = last.x - plast.x;var py = last.y - plast.y; //根据计算最后两个身体的坐标差,来计算添加身体应在的方向//计算新加元素位置var newEle = {x: last.x + px,y: last.y + py}; //创建一个新身体this.mes.push(newEle); //将新身体假如身体数组},//移动方向方法,下面几个方法类似,只是方向不同moveup: function () {var pre = this.mes[0]; //记录第一个身体,即头部的坐标this.mes[0] = {x: pre.x,y: pre.y - 1}; //让头部的坐标像上移动一格this.move(pre); //调用移动身体的方法},movedown: function () {var pre = this.mes[0];this.mes[0] = {x: pre.x,y: pre.y + 1};this.move(pre);},moveleft: function () {var pre = this.mes[0];this.mes[0] = {x: pre.x - 1,y: pre.y};this.move(pre);},moveright: function () {var pre = this.mes[0];this.mes[0] = {x: pre.x + 1,y: pre.y};this.move(pre);},//移动身体move: function (pre) { //参数为之前第一个身体,即头部的位置对象var tmp;for (var i = 1; i < this.mes.length; i++) { //遍历每一个身体节点tmp = this.mes[i];this.mes[i] = pre;pre = tmp;} //并且把每个节点的左边变化成前一个节点的坐标,达到依次向前的目的},//改变方向changeOri: function (ori) {if (this.oriss.indexOf(ori) == -1) { //判断方向是否在允许方向内return;}if (!this.canChangeOri(ori)) { //判断改变方向是否合法return;}this.currOri = ori; //如果上面两个都通过,改变方向},//判断改变的方向是否合法canChangeOri: function (ori) { //参数为方向字符串 例如:leftif (ori == this.currOri) { //判断方向是否为当前方向,如果是则无需操作return false;}var oris = null;for (var i in this.ori) { //判断是否改变方向为当前方向的逆方向if (this.ori[i].indexOf(this.currOri) != -1) {oris = this.ori[i];break;}}if (oris.indexOf(ori) != -1) {return false;}return true;},//判断是否碰撞到了自己isCrashSelf: function () {var head = this.mes[0]; //获取头节点for (var i = 1; i < this.mes.length; i++) { //遍历身体节点if (this.mes[i].x == head.x && this.mes[i].y == head.y) { //判断头结点是否碰撞身体return true;}}return false;},//判断是否撞墙isCrashWell: function (width, height) { //参数为横竖的格子数量var head = this.mes[0]; //获取头节点if (head.x < 0 || head.y < 0) { //判断是否撞左上墙return true;}if (head.x > (width - 1) || head.y > (height - 1)) { //判断是否撞右下墙return true;}return false;},//处理吃东西handleAdd: function () {var head = this.mes[0]; //获取头节点if (head.x == point.x && head.y == point.y) { //判断头节点是否碰撞食物节点,食物在外定义this.add(); //调用添加身体getPoint(); //生成一个节点setPoint(); //画一个节点score++; //加分//s.innerHTML = score; //显示分数}}
}//生成点
function getPoint() {point.x = Math.floor(Math.random( ) * mwid);point.y = Math.floor(Math.random( ) * mhei);
}//画点
function setPoint() {c.rect(point.x * unit, point.y * unit, unit, unit);
}//画蛇
function setShake() {for (var i = 0; i < shake.mes.length; i++) {//c.fullStyle = '#ffffff';c.strokeStyle = 'red';c.rect(shake.mes[i].x * unit, shake.mes[i].y * unit, unit, unit);}c.stroke();
}//清屏
function clear() {c.clearRect(0, 0, mWidth, mHeight);
}//开始游戏
var looper=null;
function startGame() {clearInterval(looper); //终止游戏主循环//初始化状态shake.mes = [{x: 3,y: 0},{x: 2,y: 0},{x: 1,y: 0}];shake.currOri = 'right';c.beginPath(); //开始画笔getPoint(); //设置点setPoint();setShake(); //话蛇//画c.stroke();//游戏主循环looper = setInterval(function () {//var method = 'move' + shake.currOri + '()'; //调用方向函数//eval('shake.' + method); //执行方向方法/*移动*///ori: [['left', 'right'], ['up', 'down']],if (shake.currOri =="left"){shake.moveleft();} else if (shake.currOri == "right"){shake.moveright();} else if (shake.currOri == "up"){shake.moveup();} else if (shake.currOri == "down"){shake.movedown();}clear(); //清理屏幕c.beginPath(); //开始绘制shake.handleAdd(); //处理吃东西setPoint(point); //设置点setShake(); //画蛇if (shake.isCrashWell(mwid, mhei)) { //是否撞墙,未使用是否吃自己。想用调用shake.isCrashSelf方法。clearInterval(looper);//console.log('you die');//console.log('you die , and your score is ' + score);/*提示*/wx.showModal({title: '提示',content: '游戏结束 , 你的分数是 ' + score,success: function (res) {if (res.confirm) {console.log('用户点击确定')startGame()} else if (res.cancel) {console.log('用户点击取消')}}})}},200);
}
/*
启动
*/
wx.showModal({title: '提示',content: '是否开始游戏 ',success: function (res) {if (res.confirm) {console.log('用户点击确定')startGame()} else if (res.cancel) {console.log('用户点击取消')}}
})//键盘监听
// window.onkeyup = function (key) {
// var ori = '';
// switch (key.keyCode) {
// case 65:
// ori = 'left';
// break;
// case 68:
// ori = 'right';
// break;
// case 87:
// ori = 'up';
// break;
// case 83:
// ori = 'down';
// break;
// }
// if (ori == '') {
// return;
// }
// //改变蛇走向
// shake.changeOri(ori);
// }
/*
方向
*/
var startX=0;
var startY = 0;
var moveEndX = 0;
var moveEndY = 0;
wx.onTouchStart(function (e) {//pageX//pageY//console.log(e.touches[0])startX = e.changedTouches[0].pageX;startY = e.changedTouches[0].pageY;
})wx.onTouchMove(function (e) {// console.log(e.touches[0])
})wx.onTouchEnd(function (e) {//console.log(e.changedTouches[0])moveEndX = e.changedTouches[0].pageX;moveEndY = e.changedTouches[0].pageY;var X = moveEndX - startX;var Y = moveEndY - startY;if (Math.abs(X) > Math.abs(Y) && X > 0) {console.log("right");shake.changeOri("right");}else if (Math.abs(X) > Math.abs(Y) && X < 0) {console.log(" left");shake.changeOri("left");}else if (Math.abs(Y) > Math.abs(X) && Y > 0) {console.log("down");shake.changeOri("down");}else if (Math.abs(Y) > Math.abs(X) && Y < 0) {console.log("up");shake.changeOri("up");}else {console.log("just touch");}
})wx.onTouchCancel(function (e) {console.log(e.touches)
})
模拟器中效果:
也可以点击编辑器预览按钮扫描二维码真机试玩。
转载于:https://my.oschina.net/tbd/blog/1649337
在微信小游戏中开发一个贪食蛇相关推荐
- 微信小游戏云开发在cocos creator中的设置
之前用three.js手撸了一个微信小游戏半成品,但是因为这种手撸的方式,程序和美术很难配合,而且开发难度和时间成本太大,最终决定还是用cocos creator进行微信小游戏的开发. 微信小程序早已 ...
- 微信小游戏客户端开发环境搭建
微信小游戏客户端开发环境搭建 开发工具 环境配置 发布小游戏 一直以来,弄App形式的游戏比较多,近年来,微信小游戏火了起来.出于好奇,研究了一番,觉得还是挺有意思的,想和大家分享下. 官方手册网址: ...
- 在微信小游戏中实现语音互动
之前在unity里尝试用过语音控制,当时的想法是实时控制游戏角色的移动与攻击,这在通过在线api解析语义的方式下体验一般,不过也想到在实时性要求不那么高的互动场景应该可以用起来.这里就在微信小游戏中尝 ...
- 微信小游戏云开发数据库
关于微信小游戏云开发数据库的使用 初始化云开发 // 可以传入一个默认使用的环境名称 wx.cloud.init() 初始化数据库 // 这里的环境参数应传入云开发数据库中对应环境id const d ...
- 对于微信小游戏JS开发的一点整理
对于微信小游戏JS开发的一点整理 我像大家一样,遇到了不懂的喜欢在csdn上搜索解决问题,这篇文章参考了csdn上一些博主的文章,故标为转载,主要是参考博主:陈田田. tips 代码包大小上限为4MB ...
- CocosCreator微信小游戏排行榜开发
CocosCreator微信小游戏排行榜开发 开发前言 步骤1 开发前言 第一次接触微信小游戏开发的小伙伴,可以看看排行榜的开发和注意事项: 一.开发微信排行榜的话,用户的信息需要从微信提供的API获 ...
- h5小游戏嵌入到微信小游戏中(以egret为例)
H5小游戏源代码不能直接转换为微信小游戏发布,但是可以把现有的h5小游戏嵌入到微信小游戏中,这里使用egret举例.使用egret创建一个空的微信小游戏,在main.ts中资源加载完成后执行Webvi ...
- 解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题
解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题 参考文章: (1)解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题 (2)https:// ...
- 微信小程序中开发的小坑
微信小程序中开发的小坑 本文随时更新微信小程序开发过程中遇到的小坑.现已收集如下. 微信小程序编译后的大小不能超过1MB. 微信小程序不能建立两个(含)以上的WebStock连接.
最新文章
- LightSpeed 的Left Join Bug解决方案
- 在DNN中如何使FriendlyURL使用PageName作为页面名称
- double小数点后最多几位_30年前很火的零食,00后最多吃过2种,全吃过的至少是“叔叔辈”...
- 最长公共子序列和追踪解
- 割点和桥算法——摘自《算法艺术与信息学竞赛》
- 使用Spock 1.2简化对遗留应用程序的集成测试
- 来吧~不要互相伤害,ssh之间要互相信任
- java导_java——导入功能
- VBA—EXCEL操作集合—05
- 关于材料设计vector矢量图形
- easydarwin 安装_win10安装EasyDarwin并作为流媒体服务器的推流和拉流实例
- 2021中国开源年报发布!一篇报告带你读懂中国开源的2021~
- 生物信息中的Python 01 | 从零开始处理基因序列
- 运维工程师是桥的护栏_海沧大桥护栏救过不少车 海沧大桥护栏如何养护
- 深度解析CentOS通过日志反查***
- python:for循环和range()函数用法
- amazon - sellercentral 之 sellercentral report - monthly storage fee report
- 景安服务器怎么重装系统,怎么全盘重装系统|全盘重装系统步骤
- 为什么协程比线程的执行效率更高?
- 【hash使用场景之房间号创建】
热门文章
- 台式计算机的主流配置,目前, 台式电脑的主流配置是什么样的?
- Typora的崩溃导致文件丢失
- 通过teamviewer访问内网
- SQL 语法查询手册
- 山东省计算机应用能力等级考试,山东省2017年9月全国计算机等级考试报名时间...
- OSAL(操作系统抽象层)
- 《花雕学AI》07:AI脑洞大开-盘点最火爆人工智能ChatGPT的23种新颖用法
- 人脸检测卷积神经网络_卷积神经网络和计算机视觉的人脸面具检测算法
- 《Django开发教程》1.2 在ubuntu上安装Django
- 苹果要给高通多少钱?瑞银分析师预计最多支付60亿美元