[求问]关于主角移动的边界是如何实现的?

请教各位大触,如果想要让player在某一个图层面(这个面是不规则的一个面)内移动,cc里面有什么方法可以实现的吗?

tiedmap

用 cc.Intersection 做多边形接触检测

tiledmap?

用边界检测出来了。当player走到边界的时候,如何实现,命令player往边界外面走的时候,player不是直接停下,而是沿着边界走的效果呢?

算出下一步的坐标放临时变量里,用这个数据做边缘检测,不碰撞再设置节点位置

嗯嗯嗯,明白,我就是想问,如何计算出下一点的坐标值?因为图形是不规则的,所以我想问在cc中,有没有什么方法,可以用player已有的方向向量dir,来计算player沿着边界走的下一点的坐标值?

检测到下一步触碰边界后
分别判断dir方向只移动x轴和只移动y轴是否超出
如果全部超出,就停止
单x轴超出就移动dir向量的y轴
单y轴超出就移动dir向量的x轴

下一步的坐标应该是业务逻辑可以确定的吧

let _x = this.x;
let _y = this.y;
let obstaclePolygons = scene.map.obstaclePolygons;
let i = 0;
_x += this.speed * Math.cos(this.angle / 180 * Math.PI);	// 下一步 x
let bodyPolygon = this.getBodyRotatePolygon(Math.floor(_x), Math.floor(_y));
// x碰撞计算
for (i = 0; i < obstaclePolygons.length; i += 1) {
    let obstaclePolygon = obstaclePolygons[i];
    if (cc.Intersection.polygonPolygon(bodyPolygon, obstaclePolygon)) {
        _x = this.x;
        break;
    }
}
_y += this.speed * Math.sin(this.angle / 180 * Math.PI);	// 下一步 y
bodyPolygon = this.getBodyRotatePolygon(Math.floor(_x), Math.floor(_y));
// y碰撞计算
for (i = 0; i < obstaclePolygons.length; i += 1) {
    let obstaclePolygon = obstaclePolygons[i];
    if (cc.Intersection.polygonPolygon(bodyPolygon, obstaclePolygon)) {
        _y = this.y;
        break;
    }
}
this.x = Math.floor(_x);
this.y = Math.floor(_y);
this.node.x = _x >> 10;
this.node.y = _y >> 10;

关键在于 x y 坐标分开判定碰撞。

自己的移动做的比较简单,cc.Vec2 本身提供了甚多向量移动的方法可以调用,如果一次移动距离太长可以尝试用 cc.Vec2.lerp 分割这次移动。