微信小程序-贪吃蛇开发9 滑动控制与碰撞检测

本文详细介绍了一款贪吃蛇游戏的设计与实现过程,包括滑动控制、setInterval函数的应用及碰撞检测等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列是作者自学实践过程的记录
本文是关于贪吃蛇的滑动控制
有问题欢迎讨论

一、滑动控制

1.1 设计思想

在之间的滑动控制中,我们使用的代码过于复杂,这里我们要有模块化设计思想,即将判断函数和滑动控制函数分开,进一步理清设计思路。
前面我们提到了,根据tapstart和tapend获取触摸开始和触摸结束的坐标,并分别计算出两个点之间横纵距离的差值。
水平方向移动:

  • 若横坐标差值绝对值大于纵坐标差值绝对值,则当前移动是沿水平方向
  • 若此时横坐标差值为正,则沿正反向,即向左(自定义坐标系)

垂直方向移动:

  • 若纵坐标差值绝对值大于横坐标差值绝对值,则当前移动是沿垂直方向
  • 若此时纵坐标差值为正,则沿正反向,即向下(自定义坐标系)

1.2 代码实现

于是,我们可以这样设计函数:

  // 手指触摸结束函数
  tapend:function(e){
    // 获取滑动距离,当手指划出屏幕不再赋值
    var distance_x = (this.data.end_x > 0)?  this.data.end_x - this.data.start_x : 0
    var distance_y = (this.data.end_y > 0)?  this.data.end_y - this.data.start_y : 0
    
    // 简单判断滑动方向,已注释
    // 向右滑动
    // if(Math.abs(distance_x) > Math.abs(distance_y) && distance_x > 0){
    //   console.log("向右滑动")
    // }
    // else if(Math.abs(distance_x) > Math.abs(distance_y) && distance_x < 0){
    //   console.log("向左滑动")
    // }
    // else if(Math.abs(distance_x) < Math.abs(distance_y) && distance_y < 0){
    //   console.log("向上滑动")
    // }
    // else if(Math.abs(distance_x) < Math.abs(distance_y) && distance_y > 0){
    //   console.log("向下滑动")
    // }
    // else{
    //   console.log("点击但未滑动")
    // }
    
    // 使用面向对象方法进行滑动判断
    if(Math.abs(distance_x) > 5 || Math.abs(distance_y) > 5){
      var direction
      if(Math.abs(distance_x) > Math.abs(distance_y)){
        direction = this.judge(1,distance_x)
      }
      else{
        direction = this.judge(0,distance_y)
      }
      console.log(direction)
    }
    console.log("触摸结束")
  },

  // 判断方向的函数,这里参数一个是布尔值,1表示水平方向,0表示垂直方向,distance是传回的距离值
  judge:function(judge,distance){
    // 左右滑动
    if(judge)
      return distance > 0 ? "right":"left"
    // 上下滑动
    else 
      return distance > 0 ? "down":"up"
  }

1.3 效果展示:

在这里插入图片描述

1.4 整体赋值

我们这里输出的只是tapend函数的局部变量,我们需要使用setData对全局变量进行数据绑定。
这里我们选择使用switch函数代替不断的if语句,不过需要注意的是这里要对局部变量和全局变量进行一个判断,因为蛇不可以直接掉头,例如不可以直接由向左改变为向右。

      switch(direction){
        case "left":
          if(this.data.direction == "right")
            return;
          break;
        case "right":
          if(this.data.direction == "left")
            return;
          break;
        case "down":
          if(this.data.direction == "up")
            return;
          break;
        case "up":
          if(this.data.direction == "down")
            return;
          break;
      }
      this.setData({
        direction:direction,
        start_x:0,
        start_y:0,
        end_x:0,
        end_y:0
      })

二、setInterval函数

这里有一个新的知识点,即setInterval(function,time)方法,执行这个代码块,那么小程序就会依据给定的时间间隔,不断执行function函数,直到执行了clearInterval()函数。
我们可以在后面的课程中使用这个函数对蛇的移动和更新进行设计。

代码如下:

  // 移动函数
  move:function(){
    this.data.timer = setInterval(function() {

    },400)
  },

三、碰撞检测

视觉上碰撞检测需要判断是小蛇的头是否碰到操场或者碰到自己的身体。
逻辑上碰撞检测即小蛇的头的坐标是否和某些坐标重合,这时候便是游戏失败。

3.1 游戏介绍碰撞检测

当碰撞发生时,我们只需要将移动速度中的timer进行关闭就可以暂停游戏,再输出对应的游戏结束效果即可。
碰撞代码如下:

  // 游戏状态
  check_Game:function(){
    // 获取小蛇数据
    var snake = this.data.snake
    var len = this.data.snake.length
    var snake_head = arr[len-1];

    // 小蛇超过了操场边框
    if(snake_head[0] < 0 || snake_head[0] >= this.data.rows ||
      snake_head[1] < 0 || snake_head[1] >= this.data.cols){
        clearInterval(this.data.timer)
    }
    // 小蛇碰到了自己
    for(var i=0;i<len-1;i++){
      if(snake_head[0] == arr[i][0] && snake_head[1] == arr[i][1]){
        clearInterval(this.data.timer)
      }
    }
  }

3.2 食物碰撞检测

当小蛇碰撞到食物时,身体应该变长,这里就可以用到shift和unshift函数对数组头部进行添加和删除,类似于栈的push和pop函数。
代码如下:

    // 小蛇碰撞到食物
    if(snake_head[0] == this.data.food[0] && snake_head[1] == this.data.food[1]){
      // snakeTAIL专门用来添加蛇的长度
      arr.unshift(snakeTAIL)
      this.setData({
        score:this.data.score + 10
      })
      // 再创建一个食物
      this.initFood()
      
      // 这里应该再添加统计历史最高分的函数
    }
### 使用微信开发者工具制作坦克大战小游戏教程 #### 准备工作 为了使用微信开发者工具创建或修改《坦克大战》游戏,需先安装并配置好微信开发者工具。确保已经注册成为微信公众平台的小程序开发者,并获取相应的AppID。 #### 创建新项目 启动微信开发者工具后点击【新建小程序】按钮,在弹出窗口内填写项目名称以及本地存储路径,选择已有 AppID 或者测试号来初始化工程文件夹结构[^1]。 #### 导入资源 由于《坦克大战》原本是基于 Python 和 Pygame 库构建的桌面端应用[^3],将其移植至微信小游戏环境涉及大量代码重构和技术栈转换的工作。因此建议直接利用 Cocos Creator 这样的跨平台游戏引擎来进行开发,该引擎支持快速导出为微信小游戏格式。 对于图形素材部分可以直接沿用原版设计风格,通过图片编辑软件调整尺寸适应手机屏幕比例;音频方面则要遵循微信官方文档中的音效规范进行处理。 #### 编写逻辑脚本 采用 JavaScript 实现核心玩法机制,比如玩家控制碰撞检测等功能模块。考虑到微信小游戏运行于特定 runtime 环境而非标准 web 浏览器中[^2],所以在编写过程中要注意区分两者差异之处: - **事件监听**:不同于传统网页上的 mouseevent/touchevent ,应优先考虑 WeChat Mini Program 提供的一套 API 来响应用户交互操作; - **性能优化**:鉴于移动设备硬件条件参差不齐,务必关注帧率表现,减少不必要的 DOM 操作频率,合理规划动画效果更新周期; - **数据持久化**:借助 wx.setStorageSync() 方法保存进度记录等重要信息以便下次加载时读取恢复状态。 ```javascript // 示例:定义一个简单的坦克类 class Tank { constructor(x, y) { this.x = x; this.y = y; // ...其他属性... } move(direction){ switch (direction){ case &#39;up&#39;: this.y -= 5; break; case &#39;down&#39;: this.y += 5; break; case &#39;left&#39;: this.x -= 5; break; case &#39;right&#39;: this.x += 5; break; } } } ``` #### 调试发布 完成初步编码之后就可以进入模拟器预览模式下反复测试直至满意为止。期间如果遇到任何疑问都可以查阅官方指南寻求解决方案。当确认无误准备上线前还需要经过严格的审核流程才能正式对外公开分享链接给其他玩家尝试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小子挺不错

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值