贪吃蛇身匀速运动模型

通用运动模型

我们已知斜线为移动的距离 d d d, x x x轴总偏移量为 d x dx dx, y y y轴总偏移量为 d y dy dy,在一帧当中,我们也知道能走的距离为 m d md md。那么作为一般的运动模型,该如何确定我们进行移动的方向呢?需要向夹角 θ θ θ的方向移动,这样我们移动的所有点都在直角三角形的斜边上,这是一个正确的移动模式。

从上图我们可以看到,需要求的就是 m d x mdx mdx和 m d y mdy mdy了。也就是 m d md md在 x x x轴和 y y y轴上的投影。我们可以简单思考确定物体移动方向 的问题,夹角 θ θ θ决定了物体移动的方向。其中, s i n θ = d y / d sinθ=dy/d sinθ=dy/d, c o s θ = d x / d cosθ=dx/d cosθ=dx/d,若要沿相同角度出发,即两次的 θ θ θ相同,那么也应该有对应的 s i n θ 2 sinθ_2 sinθ2和 c o s θ 2 cosθ_2 cosθ2。

整个过程就是从结果反推过程:

  1. 一个点是如何移动到目标位置的呢?向 t h e t a theta theta方向移动 m d md md。
  2. 如何达到 m d md md呢?先朝 x x x轴走一点,再朝 y y y轴走一点。
  3. 朝 x 、 y x、y x、y走多少呢?具体计算...
简易版运动模型

当然,这是一个通用的运动模型,即在物体运动的动作空间为连续(360度随便走)时和离散时(如本项目:上右下左)都适用。我们可以想到,当我们的贪吃蛇向右走时,其实只有 y y y轴(标准坐标系,非canvas)有移动,因此我们要移动的总距离 d d d和每一帧移动距离 m d md md都只会分配到 y y y轴上 ,该公式理论上恒成立 d y / d = 1 dy/d=1 dy/d=1(具体计算中可能有浮点数精度问题)。

有了这个想法,我们就可以实现一个仅适用本项目的离散版本的。

js 复制代码
  update_move() {
    const distance = Math.sqrt(dx * dx + dy * dy);
    if (distance < this.eps) {
      this.cells[0] = this.next_cell;
      this.next_cell = null;
      this.status = "idle";
      this.direction = -1;

      if (!this.check_tail_increasing()) {
        this.cells.pop();
      }
    } else {
      const move_distance = this.speed * this.timedelta / 1000; 
      // 设置snake0
      if (this.id === 0) {
        if (this.direction === 0) this.cells[0].y -= move_distance;
        else if (this.direction === 1) this.cells[0].x += move_distance;
        else if (this.direction === 2) this.cells[0].y += move_distance;
        else if (this.direction === 3) this.cells[0].x -= move_distance;
      }
      // 设置snake1
      if (this.id === 1) {
        if (this.direction === 0) this.cells[0].y -= move_distance;
        else if (this.direction === 1) this.cells[0].x += move_distance;
        else if (this.direction === 2) this.cells[0].y += move_distance
        else if (this.direction === 3) this.cells[0].x -= move_distance;
      }
    }
  }

这段代码就是如果当前为移动状态,每一帧刷新时直接根据获取的direction添加固定方向的偏移量。注意上面是渲染cell,因此 ( x , y ) (x,y) (x,y)会变成 ( y , x ) (y,x) (y,x)因此当动作为 0 0 0(向上)时,我们要给 y y y减去偏移量而不是 x x x。

相关推荐
一只鱼^_3 天前
用JS实现植物大战僵尸(前端作业)
javascript·css·vscode·游戏引擎·游戏程序·html5·动画
DanmF--16 天前
Protobuf协议生成和使用
网络·unity·c#·游戏引擎·游戏程序
小羊Linux客栈17 天前
自动化:批量文件重命名
运维·人工智能·python·自动化·游戏程序
动感光博17 天前
Unity碰撞检测(射线投射、胶囊体投射)、交互(图层、掩码)
unity·c#·游戏引擎·游戏程序·动画
DanmF--18 天前
Protobuf工具
网络·unity·游戏引擎·游戏程序
passionSnail24 天前
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-贪吃蛇的百变玩法:从命令行到AI对战
开发语言·matlab·游戏程序
passionSnail25 天前
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-俄罗斯方块:用旋转矩阵打造经典
算法·matlab·矩阵·游戏程序·交互
小羊Linux客栈1 个月前
Python小程序:上班该做点摸鱼的事情
开发语言·python·小程序·游戏程序
DanmF--1 个月前
详解UnityWebRequest类
网络·unity·c#·游戏引擎·游戏程序
小羊Linux客栈1 个月前
Python自我娱乐小游戏
开发语言·python·游戏程序·娱乐