碰撞检测 人物行走 抖动

思路

1 如果人物碰撞到边界后,要回退一点,才能再次正常移动。但这里刚开始写时,容易产生抖动,特别是人物移动速度过快时。

下面是解决方案

关键点在于update 与 lateUpdate的搭配使用 如果将移动代码都放到update或lateUpdate中,就会产品抖动的效果

isCollision:boolean = false;
lastPosition:cc.Vec2;
_moveDir:cc.Vec2=cc.Vec2.ZERO;
set moveDir(dir:cc.Vec2){
    if(this.moveDir.equals(dir)){
        return ;
    }
    this._moveDir = dir;                    

    if(dir.equals(cc.Vec2.ZERO)){
        this.animation.stop();                            
    }else{
        var angle = Number(cc.Vec2.ZERO.signAngle(dir)*180/Math.PI);
        var index = this.animAngle.indexOf(angle);
        if(index>-1){
            var name = this.animDir[index];
            this.animation.play(name,0);
        }   
    }                                     
}
get moveDir(){
    return this._moveDir;
}




update(){
    //这里执行人物的移动
    var p1 = this.node.getPosition();        
    var p2 = p1.add(this.moveDir.mul(this.speed));                
    this.node.setPosition(p2);
}


lateUpdate(){           
    //这里最终决定人物是否移动 还是回到上一个位置
    if(this.isCollision){          
        this.node.position = this.lastPosition;
        return ;
    }                     
    this.lastPosition = this.node.getPosition();          
}

onCollisionEnter(other, self){       
    //碰撞了
    this.isCollision = true;
}

onCollisionExit(other, self){        
    //离开了碰撞
    this.isCollision = false;
}

1赞

这种类型的地图用这种碰撞检测太奢侈了吧。刷格子,判断格子能不能通过就只需要一个bool判断

1赞

lateUpdate update交换一下试试看效果

mark一下。

mark一下