用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)
生活随笔
收集整理的這篇文章主要介紹了
用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用Unity3D實現簡單的牧師與魔鬼游戲(動作分離版)
項目地址
牧師與魔鬼游戲(動作分離版)
完成效果圖
上次博客鏈接
牧師與魔鬼游戲
實現心得
這次作業是在上次作業的基礎上完成的,具體做出的改變是添加了一個裁判類和一個行為類,將其它控制類中涉及到判斷游戲狀態的代碼都封裝到了裁判類中,并在主控制類添加了一個裁判類的成員變量,在主控制器中使用裁判類的相關方法對游戲狀態和游戲對象狀態進行判斷:
/* 裁判控制類 */ public class JudgeController {private int gameState = (int)GameState.Playing; // 游戲狀態,0表示游戲正在進行,1表示游戲失敗,2表示游戲成功public void InitJudgeController() {gameState = (int)GameState.Playing;}/* 獲取游戲對象是否在船上 */public bool IsOnBoat(RoleController role) {return role.GetRoleModel().GetIsOnBoat();}/* 判斷船上是否沒有角色 */public bool IsNoRoleOnBoat(BoatController boat) {string [] roleOnBoat = boat.GetBoatModel().GetRoleOnBoat();if (roleOnBoat[0] != "" || roleOnBoat[1] != "") {return false;} else {return true;}}/* 檢查游戲狀態 */public int CheckGameState(ShoreController leftShore, ShoreController rightShore, BoatController boat) {// 初始化左邊和右邊的牧師和魔鬼數量都為0int leftPriest = 0, rightPriest = 0;int leftDevil = 0, rightDevil = 0;// 獲取左岸和右岸以及船上的牧師和魔鬼的數量數組int [] leftShoreCount = leftShore.GetRoleCountOnShore();int [] rightShoreCount = rightShore.GetRoleCountOnShore();int [] boatCount = boat.GetRoleCountOnBoat();// 如果船在左邊,那么左邊的牧師和魔鬼的數量為左岸數量加上船里的數量if (boat.GetBoatSide() == (int)ShoreSide.Left) {leftPriest = leftShoreCount[0] + boatCount[0];leftDevil = leftShoreCount[1] + boatCount[1];rightPriest = rightShoreCount[0];rightDevil = rightShoreCount[1]; } else {// 如果船在右邊,那么右邊的牧師和魔鬼的數量為右岸數量加上船里的數量leftPriest = leftShoreCount[0];leftDevil = leftShoreCount[1];rightPriest = rightShoreCount[0] + boatCount[0];rightDevil = rightShoreCount[1] + boatCount[1]; }// 如果左邊牧師加魔鬼的數量等于6且魔鬼全部上岸,那么游戲成功if (leftPriest + leftDevil == 6 && leftShoreCount[1] == 3) {gameState = (int)GameState.Win;} else if (leftPriest < leftDevil && leftPriest > 0) {// 如果任意一邊牧師的數量小于魔鬼的數量且有牧師,那么游戲失敗gameState = (int)GameState.Lose;} else if (rightPriest < rightDevil && rightPriest > 0) {gameState = (int)GameState.Lose;} else {// 否則游戲正在進行中gameState = (int)GameState.Playing;}return gameState;}/* 返回是否正在進行游戲 */public bool isPlayingGame() {return gameState == (int)GameState.Playing; } }而行為類則是將原先代碼中的移動控制器MoveController和點擊控制器ClickController合并到了一起,其它控制類中出現這兩個類的地方也換成了行為類:
/* 行為控制器,一般會掛載到某個具體的游戲對象上 */ public class ActionController : MonoBehaviour {private ActionModel actionModel;private ActionView actionView;private RoleController clickRole; // 如果點擊的是角色,那么記錄點擊的對象的控制器void Start() {actionModel = new ActionModel();actionView = gameObject.AddComponent<ActionView>() as ActionView;}void Update() {int state = actionModel.GetState();Vector3 middlePos = actionModel.GetMiddlePos();Vector3 endPos = actionModel.GetEndPos();int speed = actionModel.GetSpeed();// 根據速度、中間位置、終點位置、移動狀態來移動物體Move(state, middlePos, endPos, speed);}/* 初始化控制器,設置物體不移動 */public void InitActionController() {// 如果對象是船,獲取船在哪邊int side = actionModel.GetSide();// 在左邊的話,船會回到右邊去if (side == (int)ShoreSide.Left) {MoveToOtherSide();}}/* 如果對象是船,設置船的岸邊邊側 */public void SetBoatSide(int side) {actionModel.SetSide(side);}/* 獲取船的岸邊邊側 */public int GetBoatSide() {return actionModel.GetSide();}/* 根據速度、中間位置、終點位置、移動狀態來移動物體 */public void Move(int state, Vector3 middlePos, Vector3 endPos, int speed) {switch (state) {case (int)MoveState.Not_Moving:break;case (int)MoveState.Moving_To_Middle:// 移動物體到中間位置,移動到后,設置物體的下一個狀態為移動到終點actionView.MoveTo(middlePos, speed);if (transform.position == middlePos) {actionModel.SetState((int)MoveState.Moving_To_End);}break;case (int)MoveState.Moving_To_End:// 移動物體到終點位置,移動到后,設置物體的下一個狀態為不移動actionView.MoveTo(endPos, speed);if (transform.position == endPos) {actionModel.SetState((int)MoveState.Not_Moving);}break;}}/* 設置物體要移動到的位置 */public void SetMovePos(Vector3 pos) {// 設置物體開始往中間位置移動actionModel.SetState((int)MoveState.Moving_To_Middle);// 設置最終移動位置為posactionModel.SetEndPos(pos);// 如果要移動到的位置的y坐標等于物體所在位置的y坐標,說明是船在移動if (pos.y == transform.position.y) {// 船沿直線運動,所以中間位置也可設為最終位置actionModel.SetMiddlePos(pos);// 移動狀態可以直接設為往終點移動actionModel.SetState((int)MoveState.Moving_To_End);}// 如果要移動到的位置的y坐標小于物體所在位置的y坐標,說明是物體從岸上移動到船上else if (pos.y < transform.position.y) {actionModel.SetMiddlePos(new Vector3(pos.x, transform.position.y, pos.z));}// 如果要移動到的位置的y坐標小于物體所在位置的y坐標,說明是物體從船上移動到岸上else {actionModel.SetMiddlePos(new Vector3(transform.position.x, pos.y, pos.z));}}/* 將船移動到岸的另一側 */public void MoveToOtherSide() {// 先獲取船在哪邊int lastSide = actionModel.GetSide();// 移動船到另一邊if (lastSide == (int)ShoreSide.Left) {SetMovePos(new Vector3(2.5F, -1, 0));actionModel.SetSide((int)ShoreSide.Right);} else {SetMovePos(new Vector3(-2.5F, -1, 0));actionModel.SetSide((int)ShoreSide.Left);}}/* 如果對象是角色,設置被點擊的對象為該角色 */public void SetClickRole(RoleController role) {clickRole = role;}void OnMouseDown() {// 如果鼠標點擊的對象是船,那么移動船只if (gameObject.name == "Boat") {SingleObject.getInstance().GetMainController().MoveBoat();} else {// 如果鼠標點擊的對象是角色,那么移動對象SingleObject.getInstance().GetMainController().MoveRole(clickRole);}} }這樣一來,在實現模塊分離和降低耦合性的同時,也保證了游戲功能的一致性。游戲功能和效果和之前沒有任何區別。
游戲截圖:
正在進行游戲:
游戲失敗:
游戲成功:
總結
以上是生活随笔為你收集整理的用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Unity3D实现简单的牧师与魔鬼游戏
- 下一篇: 软件测试作业1:正确理解原型方法对软件生