CocosCreator 剛體與多邊形碰撞器的單向碰撞(向上跳穿過時忽略碰撞)


const{ccclass,property}=cc._decorator;

@ccclass
export default class Player extends cc.Component{
	
	private _rigidBody:cc.RigidBody;
	private _disabledB2Contacts:any[]=[];
	
	protected onLoad():void{
		this._rigidBody=this.node.getComponent(cc.RigidBody);
		this._rigidBody.enabledContactListener=true;//激活接觸偵聽
	}
	
	private onPreSolve(contact:cc.PhysicsContact,selfCollider:cc.PhysicsCollider,otherCollider:cc.PhysicsCollider):void{
		let b2Contact=contact["_b2contact"];
		let index=this._disabledB2Contacts.indexOf(b2Contact);
		if(index>-1){
			contact.disabled=true;
		}else{
			if(!contact.disabled&&!contact.disabledOnce&&!otherCollider.sensor&&contact.isTouching()){
				let normal=contact.getWorldManifold().normal.mulSelf(-1);
				if(normal.y<-0.7){
					this._disabledB2Contacts.push(b2Contact);
					contact.disabled=true;
				}
			}
		}
	}
	
	private onEndContact(contact:cc.PhysicsContact,selfCollider:cc.PhysicsCollider,otherCollider:cc.PhysicsCollider):void{
		let b2Contact=contact["_b2contact"];
		let index=this._disabledB2Contacts.indexOf(b2Contact);
		if(index>-1){
			if(this.getAllB2ContactEnd(this._disabledB2Contacts)){
				this._disabledB2Contacts.length=0;
			}
		}

	}

    private getAllB2ContactEnd(list:any[]):boolean{
		let result=true;
		for(let i=0,len=list.length;i<len;i++){
			if(list[i].IsTouching()){
				result=false;
				break;
			}
		}
		return result;
	}
}

碰撞回調順序:

    ...
    Step
    Step
    BeginContact
    PreSolve
    PostSolve
    Step
    PreSolve
    PostSolve
    Step
    PreSolve
    PostSolve
    Step
    EndContact
    Step
    Step
    ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM