
思路
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;
}