public override void onMessage(Movable obj, StateMsg <Movable> msg) { MovableMsg type = (MovableMsg)msg.type; switch (type) { case MovableMsg.onLabber: obj.getSM().changeState(OnLabberState.Instance()); break; case MovableMsg.toNormal: obj.getSM().changeState(NormalState.Instance()); break; case MovableMsg.moveDown: //降落 if (!obj.downTileIsBlock()) { obj.setFallTargetY(true); obj.getSM().changeState(FallToTargetState.Instance()); } break; case MovableMsg.moveLeft: obj.doMoveLeft(); obj.adjustWhenMoveOnRope(); break; case MovableMsg.moveRight: obj.doMoveRight(); obj.adjustWhenMoveOnRope(); break; case MovableMsg.stopMove: obj.doStopMove(); break; case MovableMsg.wait: obj.doWait(); break; case MovableMsg.moveUp: //通知發訊者此動作無效 if (msg.sender != null) { //從繩子移到JumpPoint會發動fall to rope,這時目標就停留在JumpPoint // //--J // -- if (Movable.Debug_do_moveUp) { obj.printDebugMsg("[注意!]do MoveUp on rope"); } AIMoveController ai = msg.sender.myAI; ai.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.reFindPath, null)); } break; } }
void OnTriggerEnter2D(Collider2D other) { Debug.Log("enter trap"); catchPlayer = other.gameObject.GetComponent <UserMoveController>(); catchAI = other.gameObject.GetComponent <AIMoveController>(); if (catchAI != null) { catchAI.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.catchByTrap, null)); } }
void OnTriggerEnter2D(Collider2D other) { Debug.Log("enter trap"); catchPlayer = other.gameObject.GetComponent<UserMoveController>(); catchAI = other.gameObject.GetComponent<AIMoveController>(); if (catchAI != null) { catchAI.getSM().handleMessage(new StateMsg((int)AIMsg.catchByTrap)); } }
void handleTooClose(AIMoveController ai, funPtr doFunction) { //迎面而來的情況 => <= //比較距離,近者勝出;距離一樣,先搶先贏 var myAInowTarget = myAI.getNowTarget(); Vector2 v1 = transform.position - myAInowTarget.GetPosition(); Vector2 v2 = ai.transform.position - myAInowTarget.GetPosition(); float myD = v1.sqrMagnitude; float d = v2.sqrMagnitude; if (myD < d) { if (Debug_Oncoming) { printDebugMsg("我比" + ai.name + "近"); } doFunction(this); } else if (myD > d) { if (Debug_Oncoming) { printDebugMsg("我比[" + ai.name + "]遠他的行動(" + ai.movable.getMoveCommand().ToString() + ")"); } myAI.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.waitForSomebody, ai)); } else //看來是平手了 { if (Debug_Oncoming) { printDebugMsg(ai.name + "等我 (" + myD + "," + d + ")"); } ai.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.waitForSomebody, myAI)); doFunction(this); } }
void preMove(Vector2 dir) { if (Mathf.Abs(dir.x) > Mathf.Abs(dir.y)) { //左右移動 if (dir.x > 0) { AIMoveController ai = tooCloseDetect( new Vector2(Movable.tooCloseOffset, Movable.tooCloseHalfLongSide), new Vector2(Movable.tooCloseOffset + Movable.tooCloseShortSide, Movable.tooCloseHalfLongSide), new Vector2(Movable.tooCloseOffset, -Movable.tooCloseHalfLongSide), new Vector2(Movable.tooCloseOffset + Movable.tooCloseShortSide, -Movable.tooCloseHalfLongSide) ); if (ai != null) { bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI; bool aiOnAir = ai.movable.getSM().getCurrentState() == Movable.OnAirState.Instance(); bool isBothHorizontal = Mathf.Abs(ai.transform.position.y - this.transform.position.y) < 0.5f; bool fitCommand = ai.getMoveCommand() == MoveCommand.right || ai.getMoveCommand() == MoveCommand.up || ai.getMoveCommand() == MoveCommand.down || (ai.getMoveCommand() == MoveCommand.stop && isBothHorizontal); bool stopSituation = fitCommand || aiOnAir || aiWaitButNotForMe; if (stopSituation) { this.sendMsgStopMove(); } else { handleTooClose(ai, this.sendMsgMoveRight); } } else { this.sendMsgMoveRight(); } } else if (dir.x < 0) { AIMoveController ai = tooCloseDetect( new Vector2(-Movable.tooCloseOffset, Movable.tooCloseHalfLongSide), new Vector2(-Movable.tooCloseOffset - Movable.tooCloseShortSide, Movable.tooCloseHalfLongSide), new Vector2(-Movable.tooCloseOffset, -Movable.tooCloseHalfLongSide), new Vector2(-Movable.tooCloseOffset - Movable.tooCloseShortSide, -Movable.tooCloseHalfLongSide) ); if (ai != null) { bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI; bool aiOnAir = ai.movable.getSM().getCurrentState() == Movable.OnAirState.Instance(); bool isBothHorizontal = Mathf.Abs(ai.transform.position.y - this.transform.position.y) < 0.5f; bool fitCommand = ai.getMoveCommand() == MoveCommand.left || ai.getMoveCommand() == MoveCommand.up || ai.getMoveCommand() == MoveCommand.down || (ai.getMoveCommand() == MoveCommand.stop && isBothHorizontal); bool stopSituation = fitCommand || aiOnAir || aiWaitButNotForMe; if (stopSituation) { this.sendMsgStopMove(); } else { handleTooClose(ai, this.sendMsgMoveLeft); } } else { this.sendMsgMoveLeft(); } } } else { //上下移動 if (dir.y > 0) { AIMoveController ai = tooCloseDetect(new Vector2(-Movable.tooCloseHalfLongSide, Movable.tooCloseOffset + Movable.tooCloseShortSide), new Vector2(Movable.tooCloseHalfLongSide, Movable.tooCloseOffset + Movable.tooCloseShortSide), new Vector2(-Movable.tooCloseHalfLongSide, Movable.tooCloseOffset), new Vector2(Movable.tooCloseHalfLongSide, Movable.tooCloseOffset) ); if (ai != null) { bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI; bool fitCommand = ai.getMoveCommand() == MoveCommand.up || ai.getMoveCommand() == MoveCommand.left || ai.getMoveCommand() == MoveCommand.right; //LodeRunnerScreenshot\fixed\互等的情況.jpg //爬梯子往上,碰到上面的AI是stop時,自己才要stop bool aiStopAndOnLadder = ai.getMoveCommand() == MoveCommand.stop && ai.movable.getSM().getCurrentState() == Movable.OnLabberState.Instance(); bool stopSituation = fitCommand || aiWaitButNotForMe || aiStopAndOnLadder; if (Debug_Oncoming) { if (aiStopAndOnLadder) { printDebugMsg("[注意]aiStopAndOnLadder"); } else { printDebugMsg("[注意]aiStop but not OnLadder"); } } if (stopSituation) { this.sendMsgStopMove(); } else { //如果對方正往下落,就還是往上 bool aiIsFallToTarget = ai.movable.getSM().getCurrentState() == Movable.FallToTargetState.Instance(); if (aiIsFallToTarget) { this.sendMsgMoveUp(this); } else { handleTooClose(ai, this.sendMsgMoveUp); } } } else { this.sendMsgMoveUp(this); } } else if (dir.y < 0) { AIMoveController ai = tooCloseDetect(new Vector2(-Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset - Movable.tooCloseShortSide), new Vector2(Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset - Movable.tooCloseShortSide), new Vector2(-Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset), new Vector2(Movable.tooCloseHalfLongSide, -Movable.tooCloseOffset) ); if (ai != null) { bool aiWaitButNotForMe = ai.getSM().getCurrentState() == AIMoveController.AIWaitState.Instance() && ai.getWaitAI() != this.myAI; bool fitCommand = ai.getMoveCommand() == MoveCommand.down || ai.getMoveCommand() == MoveCommand.left || ai.getMoveCommand() == MoveCommand.right || ai.getMoveCommand() == MoveCommand.stop; bool stopSituation = fitCommand || aiWaitButNotForMe; if (stopSituation) { this.sendMsgStopMove(); } else { handleTooClose(ai, this.sendMsgMoveDown); } } else { this.sendMsgMoveDown(); } } } }
public override void onMessage(Movable obj, StateMsg <Movable> msg) { MovableMsg type = (MovableMsg)msg.type; switch (type) { case MovableMsg.onLabber: obj.getSM().changeState(OnLabberState.Instance()); break; case MovableMsg.onRope: obj.getSM().changeState(OnRopeState.Instance()); break; case MovableMsg.onAir: obj.getSM().changeState(OnAirState.Instance()); break; case MovableMsg.fallToAlignRope: //站在rope上時 obj.setFallTargetY(false); obj.getSM().changeState(FallToTargetState.Instance()); break; case MovableMsg.moveLeft: obj.doMoveLeft(); break; case MovableMsg.moveRight: obj.doMoveRight(); break; case MovableMsg.stopMove: obj.doStopMove(); break; case MovableMsg.wait: obj.doWait(); break; case MovableMsg.moveDown: if (!obj.downTileIsBlock()) { obj.doMoveDown(); } break; case MovableMsg.toKinematic: obj.getSM().changeState(KinematicState.Instance()); break; case MovableMsg.moveUp: //通知發訊者此動作無效 if (msg.sender != null) { //解決[在梯子卡點]的問題 //從H往下走,但因為有其他AI檔在下面,所以進入stop;之後reFindPath,y就會低於pathNode // O //口H口口 obj.adjustY(); //這是為了解決從高處落下,MoveTargetPoint還在上面的問題(在normal狀態如果執行moveUp就觸發reFindPath) // . // 口口 // . //口口口口 //降落在Brick、Stone、ladder時觸發 if (Movable.Debug_do_moveUp) { obj.printDebugMsg("[注意!]do MoveUp on Normal"); } AIMoveController ai = msg.sender.myAI; ai.getSM().handleMessage(new StateMsg <AIMoveController>((int)AIMsg.reFindPath, null)); } break; } }