微信小程序---贪吃蛇

App Store搜索 "段友键盘" https://itunes.apple.com/cn/app/%E6%AE%B5%E5%8F%8B%E9%94%AE%E7%9B%98/id1335869458?mt=8

完整项目demo在github上的地址 https://github.com/CoderPeak/---snakeGame

iOS开发的小伙伴们可以看下本人写的其他iOS控件哟

游戏效果图

demo.gif

大家的时间都很宝贵,话不多说, 直接进入主题
前阵子公司的app刚上架,这段时间比较空闲, 就稍微研究了一下微信小程序...(本人iOS开发, 对h5,js语法也是略懂略懂---会前端的同学搞微信小程序应该是轻轻松松) . 毕竟微信小程序的主要构成为(wxml+wxss+js+json) 类比于前端的(html5+css+js).... 大家就一目了然了

贪吃蛇项目主要由两个文件完成(snakeGame.wxml+snakeGame.js), 这两个文件也是必不可少的...现在先看snakeGame.wxml文件, 内容很简单, 如下

<canvas style="width: 100%; height: 100%; background-color: #ccc" canvas-id="snakeCanvas" class="snake-canvas-C" bindtouchstart="touchStart" bindtouchmove="touchMove"></canvas>

创建画布标签 配置一些样式 绑定了两个事件 ---bindtouchstart="touchStart" bindtouchmove="touchMove" 在snakeGame.js 对这两个事件(touchStart手指触摸屏幕/touchMove手指在手机上移动)进行处理

下面着重解释snakeGame.js文件内容
主要是调用此函数 requestAnimationFrame(function xx) // 循环执行动画绘制

// 核心代码为
function beginDraw (){   
    //  ........逻辑操作代码
    // 调用 wx.drawCanvas,通过 canvasId 指定在哪张画布上绘制,通过 actions 指定绘制行为
    wx.drawCanvas({
         canvasId: 'snakeCanvas',
         actions: context.getActions() // 获取绘图动作数组
      });
       // 循环执行动画绘制
       requestAnimationFrame(beginDraw);
    }
    beginDraw();
 }

上面代码会循环调用beginDraw()函数, 进行蛇身, 食物的添加等操作...

下面逐行解释代码:

// 获取手机屏幕宽/高 
wx.getSystemInfo({
        success: function(res) { 
            windowW = res.windowWidth;
            windowH = res.windowHeight;
            
        }
    })
   // 游戏开始的时候, 弹窗进行游戏说明
    wx.showModal({
        title: '请开始游戏',
        content: "每得"+perSocre+"分,蛇身增长1 ",
        success: function(res) {
            if (res.confirm) {
                 beginGame();                     
            } else {
                initGame();
                // 点击取消 返回上一页
                wx.navigateBack({
                    delta: 1
                })
            }
        }
    });

游戏需要使用的变量

// 手指开始位置
var startX = 0;
var startY = 0;

// 手指移动路径
var moveX = 0;
var moveY = 0;

// 差值
var diffX = 0;
var diffY = 0;

var snakeW = 10;
var snakeH = 10;

var context = null;

// 蛇头
var snakeHead = {
    color: "#0000ff",
    x: 0,
    y: 0,
    w: snakeW,
    h: snakeH
};

// 蛇身 数组 
var snakeBodys = [];

// 窗口宽/高
var windowW = 0;
var windowH = 0;

// 食物
var foods = [];

// 蛇头移动方向
var snakeMoveDirection = "right";

// 总得分(吃到的食物大小-宽度的总和)
var score = 0;
// 蛇身总长(每得perSocre分 +1)
var snakeLength = 0;
// 是否变长/即移除蛇身 (每得perSocre分 变长-蛇身+1)
var shouldRemoveBody = true;
// (每得perSocre分 变长-蛇身+1)
var perSocre = 5;
// 得了count个perSocre分 
var count = 1;
// 蛇移动的速度(帧频率-----越大越慢)
var defaultSpeedLevel = 10;
var moveSpeedLevel = defaultSpeedLevel;
//   减慢动画
var perform = 0;

// 吃到食物的次数
var eatFoodCount=0;
// 每 speederPerFood 次吃到食物加速
var speederPerFood = 2;   // 初始化为2  表示每吃到2次食物, 蛇的移动速度增加

初始化游戏配置函数

    // 初始化游戏环境
    function initGame(){
        snakeHead.x= 0;
        snakeHead.y = 0;
        snakeBodys.splice(0,snakeBodys.length);//清空数组 
        snakeMoveDirection = "right";
        // 上下文
        context = wx.createContext();
        foods.splice(0,foods.length);

        score = 0;
        count = 1;
        moveSpeedLevel = defaultSpeedLevel;  // 恢复默认帧频率
        perform = 0;
        eatFoodCount = 0;


        // 创建食物 20个
        for (var i = 0; i<20; i++) {       
            var food = new Food();
            foods.push(food);
        }
    }

snakeGame.wxml文件中绑定的两个函数(手机点击touchStart/手机移动touchMove)函数

touchStart: function (e){
     
      startX = e.touches[0].x;
      startY = e.touches[0].y;

    //   console.log("开始点击"); 
  },

  touchMove: function (e){
    //   console.log("开始拖动手指"); 
      moveX = e.touches[0].x;
      moveY = e.touches[0].y; 

      diffX = moveX - startX;
      diffY = moveY - startY;

    
      if ( Math.abs(diffX) > Math.abs(diffY) && diffX>0 && !(snakeMoveDirection == "left") ){
          //  向右
          snakeMoveDirection = "right";
        //   console.log("向右"); 
      } else if (Math.abs(diffX) > Math.abs(diffY) && diffX<0 && !(snakeMoveDirection == "right") ){
          //  向左
          snakeMoveDirection = "left";
        //   console.log("向左");
      } else if (Math.abs(diffX) < Math.abs(diffY) && diffY>0 && !(snakeMoveDirection == "top") ){
          //  向下
          snakeMoveDirection = "bottom";
        //   console.log("向下");
      } else if (Math.abs(diffX) < Math.abs(diffY) && diffY<0 && !(snakeMoveDirection == "bottom") ){
          //  向上
          snakeMoveDirection = "top";
        //   console.log("向上");
      }
  },

完整可运行demo请移驾github https://github.com/CoderPeak/---snakeGame

重要的事情后面说... 微信小程序是不允许用来开发游戏的, 确切的说是不允许在微信小程序上架游戏(比较tx主业就是游戏, 不能砸了自己的饭碗)... 此项目请在模拟器上运行...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 关于于小程序笔者就不做介绍了,官方有详细文档,我们还是先来看张图吧 就是这个样子的,游戏界面跟之前的OC版是差不多...
    Programmer客栈阅读 2,549评论 0 0
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,412评论 2 45
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,827评论 25 707
  • 跟另外一个老师练习了一个多星期,感觉身体越来越紧,然后又回来听之前的老师的录音跟着练,感觉打开的更多,我更喜欢这样...
    图润麻阅读 185评论 0 0
  • ​ “我没有那么喜欢你。 可是我心目那个人在现实中并不存在。 因为我心目中的她太完美了。” 01. 可能这个“她”...
    马小渣阅读 346评论 0 2