RPG角色跟随移动

随便说点

可能这是个简单的问题吧,在论坛中搜索,百度搜索。都没有太详细的文章介绍怎么实现。我以前发过一个,但现在看起来,自己都不知道说的是啥,没找到删除的方法。

示图与地图



实现思路

一. 基础定义

  1. 地图地形是个二维数组(一维数组也可以,自己实现转换) 假设是 0,0 到 49,49的地图
  2. 每个地图块(0,0)的大小是4848 每个角色的大小也是4848
  3. 队伍中有角色A、B、C、D、E 每个角色都是一个player类
  4. player类有属性如下
    tv2:cc.Vec2 角色在地图上的图块坐标
    position:cc.Vec2 cc.Node的属性 像素坐标
    follow:Player 当前角色的跟随者
    moveLog:cc.Vec2[] 当前角色的移动日记

二 移动问题简化

  1. 简化移动问题 即 角色大小为1像素 地图图块大小为1像素 每次移动距离为1像素
  2. 简化问题后,我们能很快知道,跟随要怎么做
    A->移动【在移动中记录当前移动的位置点放入到moveLog中。并通知其跟随者】
    B接收到A的移动信号后,获取A moveLog的上次记录,并将上次记录的位置设置成B的位置【B通知跟随者C】

三 角色移动 dir移动方向 cc.Vec2

  1. 对移动问题简化后,我们的思路也能很清晰的扩展出来了。
  2. 以基础定义中的数据来设计 每次移动4像素(48的整除) 角色每移动一个格子的距离需要 12 次 即 moveLog的长度为 12
class player{
   update(){
            let p  = this.node.position.add(dir.mul(4))
            this.node.position = p
           this.moveLog.push(p)
           if(this.moveLog.length>12){
             this.moveLog.shift();//让moveLog的长度最大保持12
             this.follow.followMove(player); //通知跟随者,跟随移动。   这里在超过12时才跟随,是因为。可能在出生点,两个角色重合时,跟随者一开始是不用跟随移动的
          }      
   }
    followMove(target:Player){
        //跟随目标移动
         let p = target.moveLog[0];
       //角色移动方向的判断 其实应该也可以在移动时一并记得移动的方向 但我也这里没有使用这种方法
      //我这里是角色的四方向移动(不是八方向) 用当前角色的位置与将要移动到的位置 进行求夹角 即可判断角色将要朝什么方向移动
        var angle = cc.Vec2.RIGHT.signAngle( this.node.position.sub(p) )*180/Math.PI;
     //根据angle判断方向 播放方向移动动画

         this.node.position = p
        this.moveLog.push(p)
       if(this.moveLog.length>12){
          this.moveLog.shift()
        if(this.follow){
           this.follow.followMove(this) //通知跟随者移动
        }

       }
   }
}

四 关于角色的移动的位置(重要)

  1. 要保证角色像素坐标的绝对位置,不然会很奇怪
  2. 上面的例子中48为一个图块 每次移动4像素。假设角色从0,0像素向右移动
    即 4,0 8,0 12,0 16,0 …
  3. 假设是按下D键后 角色右移,即 调用update中的方法。 在8,0时用户抬起了D键. 这时update中移动的方法不能停.一直要到48,0才能真正停止.不然角色的位置与 固定的npc 场景物动对比会很奇怪。 我最开始做的时候,这里也卡了很久,没有想明白,脑筋转不过来。 多想想就知道了。不要去纠结会啥角色不能1像素1像素的移动
  4. 我在观察原游戏时,发现有时抬起移动键后,角色还会移动一段很短的距离。
  5. 在三重审 千万不要去纠结1像素1像素移动.:joy:

五 关于tv2

  1. tv2在思路中没有使用到:joy:
  2. tv2是当前角色在地图中的图块坐标,结合地型来判断角色是否可以移动 前方是什么 NPC、门、宝箱等等之类的
  3. 在update中 position+4移去吧距离后 对新的坐标转换成 tv2 将tv2放到地型中去检测,判断角色是否可移动等.
    不可以移动就False 不会通知跟随者移动,自己也不会移动

六 关于这个思路之前的思路

  1. 使用过runAction tween效果都不理想。一卡一卡的。最后还是放到update中更新角色的位置才正常。
  2. cc.follow(跟随) 至今也不知道怎么用,感觉是个坑 在unity中角色跟随是有follow函数的
  3. 以上代码都是在这里手打的,可能少括号少符号错单词,不要在意这些无关的东西,思路最重要

七 猜想

  1. 根据A*寻路算法。在其他游戏中,无论地图是怎么做的[tilemap] 的 应该都是将地图切成N个小块对每个小块进行地形判断
  2. 以前总是很纠结 1像素1像素的移动。怎么去判断.但好像rpg中 角色都不是1像素移动。而是有一个块(即xx)这类的。保证角色的坐标在一个标准上 例如上面的4848 而不会出现 13.5这类的结果
2赞

角色移动有2种方案可以实现:

  1. 镜头跟随角色移动
  2. 角色不动,地图做相对运动

现在推荐用第一种方案实现,在早期 cocos 的版本中不支持,就只能用第二种方案

你好 请问两种方法哪种实现起来更简单

第1种更简单,记得之前官方的demo里面就有;
第二种要计算相对移动,稍微复杂一点。

好的 谢谢你 我去看看官方demo

:joy:我明明说是的角色跟随角色移动。怎么到你们这,就是镜头与角色移动了???

1赞

你肯定是群里那个谁·····

实际需求实际解决,一般RPG里会出现3种情况:

  1. 将角色限制在视口中心, 角色移动,地图反向移动,
  2. 将角色限制在视口中心, 角色移动,地图不动(有局限,比如角色不能走到视口的4个角落,永远都在视口中心,一般较少用)
  3. 将角色限制在视口的矩形范围(在此范围角色移动,地图不动),

地图需要地图编辑器,将地图划分成矩形(正方形,长方形),如果地图上要放置地图物件的话,长方形在表现上更接近斜视角吧,具体寻路的话采用A星, 角色是按照从1个矩形中心移动到另一个矩形的中心的。

另外,如果是我做优化,还要加上虚拟相机的概念,比视口略大,这样的话保证了角色移动时地图块能及时加载显示出来,避免白块,还可以做到地图块,地图物件在相机可视范围外时,及时的移除掉,避免占用内存和cpu和过多的渲染。等等等细节。加油!

你们回复都不看原文的吗?我们说的是同一个东西吗?

哈哈哈,虽然我知道你说的什么东西,例如 梦幻模拟战,或者新出的 八方旅人就是这种小队玩法,但是目前我连一个小人跑图(就是人在大图中 是摄像机动还是 大背景图动还在纠结)借个地方看回帖讨论也挺有意思