随便说点
可能这是个简单的问题吧,在论坛中搜索,百度搜索。都没有太详细的文章介绍怎么实现。我以前发过一个,但现在看起来,自己都不知道说的是啥,没找到删除的方法。
示图与地图
实现思路
一. 基础定义
- 地图地形是个二维数组(一维数组也可以,自己实现转换) 假设是 0,0 到 49,49的地图
- 每个地图块(0,0)的大小是4848 每个角色的大小也是4848
- 队伍中有角色A、B、C、D、E 每个角色都是一个player类
- player类有属性如下
tv2:cc.Vec2 角色在地图上的图块坐标
position:cc.Vec2 cc.Node的属性 像素坐标
follow:Player 当前角色的跟随者
moveLog:cc.Vec2[] 当前角色的移动日记
二 移动问题简化
- 简化移动问题 即 角色大小为1像素 地图图块大小为1像素 每次移动距离为1像素
- 简化问题后,我们能很快知道,跟随要怎么做
A->移动【在移动中记录当前移动的位置点放入到moveLog中。并通知其跟随者】
B接收到A的移动信号后,获取A moveLog的上次记录,并将上次记录的位置设置成B的位置【B通知跟随者C】
三 角色移动 dir移动方向 cc.Vec2
- 对移动问题简化后,我们的思路也能很清晰的扩展出来了。
- 以基础定义中的数据来设计 每次移动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) //通知跟随者移动
}
}
}
}
四 关于角色的移动的位置(重要)
- 要保证角色像素坐标的绝对位置,不然会很奇怪
- 上面的例子中48为一个图块 每次移动4像素。假设角色从0,0像素向右移动
即 4,0 8,0 12,0 16,0 … - 假设是按下D键后 角色右移,即 调用update中的方法。 在8,0时用户抬起了D键. 这时update中移动的方法不能停.一直要到48,0才能真正停止.不然角色的位置与 固定的npc 场景物动对比会很奇怪。 我最开始做的时候,这里也卡了很久,没有想明白,脑筋转不过来。 多想想就知道了。不要去纠结会啥角色不能1像素1像素的移动
- 我在观察原游戏时,发现有时抬起移动键后,角色还会移动一段很短的距离。
- 在三重审 千万不要去纠结1像素1像素移动.
五 关于tv2
- tv2在思路中没有使用到
- tv2是当前角色在地图中的图块坐标,结合地型来判断角色是否可以移动 前方是什么 NPC、门、宝箱等等之类的
- 在update中 position+4移去吧距离后 对新的坐标转换成 tv2 将tv2放到地型中去检测,判断角色是否可移动等.
不可以移动就False 不会通知跟随者移动,自己也不会移动
六 关于这个思路之前的思路
- 使用过runAction tween效果都不理想。一卡一卡的。最后还是放到update中更新角色的位置才正常。
- cc.follow(跟随) 至今也不知道怎么用,感觉是个坑 在unity中角色跟随是有follow函数的
- 以上代码都是在这里手打的,可能少括号少符号错单词,不要在意这些无关的东西,思路最重要
七 猜想
- 根据A*寻路算法。在其他游戏中,无论地图是怎么做的[tilemap] 的 应该都是将地图切成N个小块对每个小块进行地形判断
- 以前总是很纠结 1像素1像素的移动。怎么去判断.但好像rpg中 角色都不是1像素移动。而是有一个块(即xx)这类的。保证角色的坐标在一个标准上 例如上面的4848 而不会出现 13.5这类的结果