魔鬼牧师游戏--简单工厂的改进
来源:互联网 发布:淘宝客服快捷短语 编辑:程序博客网 时间:2024/04/29 00:07
code
Basecode.cs
using UnityEngine;using System.Collections;using Com.Mygame;namespace Com.Mygame { public enum WinOrLose {Win,Lose,Gaming}; public interface ImyAction { void DevilGoOnBoat(); void DevilGoOffBoat (); void PriestGoOnBoat(); void PriestGoOffBoat(); void BoatGo (); bool IQueryGameStatus (); } public class GameSceneController:System.Object, ImyAction { private static GameSceneController _instance; private BaseCode _base_code; private GenGameObjects _gen_game_object; public WinOrLose wl = WinOrLose.Gaming; public static GameSceneController GetInstance(){ if (null == _instance) { _instance = new GameSceneController (); } return _instance; } public BaseCode getBaseCode(){ return _base_code; } internal void setBaseCode(BaseCode bc){ if (null == _base_code) { _base_code = bc; } } public GenGameObjects getGenGameObject(){ return _gen_game_object; } internal void setGenGameObject(GenGameObjects g){ if (_gen_game_object == null){ _gen_game_object = g; } } public void DevilGoOnBoat(){ _gen_game_object.DevilGoOnBoat (); } public void DevilGoOffBoat (){ _gen_game_object.DevilGoOffBoat (); } public void PriestGoOnBoat(){ _gen_game_object.PriestGoOnBoat (); } public void PriestGoOffBoat(){ _gen_game_object.PriestGoOffBoat (); } public void BoatGo (){ _gen_game_object.BoatGo (); } public bool IQueryGameStatus (){ return _gen_game_object.IQueryGameStatus (); } } // action factory public class ActionManager :System.Object { private static ActionManager _instance; public static ActionManager GetInstance(){ if (_instance == null) { _instance = new ActionManager(); } return _instance; } public U3dAction ApplyMoveGameObjectTo(GameObject obj,Vector3 target,int speed,IU3dActionCompleted com) { MoveGameObjectTo ac = obj.AddComponent<MoveGameObjectTo> (); ac.setting (obj,target,speed,com); return ac; } public U3dAction ApplyMoveToLocal(GameObject obj,Vector3 targetlocal,int speed,IU3dActionCompleted com){ MoveToLocalPosition ac = obj.AddComponent<MoveToLocalPosition> (); ac.setting (obj,targetlocal,speed,com); return ac; } } //? public class U3dActionException : System.Exception {} public interface IU3dActionCompleted { void OnActionCompleted (U3dAction action); } public class U3dAction : MonoBehaviour { public void Free(){} } public class U3dActionman : U3dAction {} public class MoveGameObjectTo : U3dActionman { public GameObject obj; public Vector3 target; public int speed; private IU3dActionCompleted monitor = null; public void setting(GameObject obj,Vector3 target,int speed,IU3dActionCompleted monitor){ this.obj = obj; this.target = target; this.speed = speed; this.monitor = monitor; } void Update(){ float step = speed * Time.deltaTime; transform.position = Vector3.MoveTowards (transform.position,target,step); if(transform.position == target){ if (monitor != null) { monitor.OnActionCompleted (this); } Destroy (this); // destory when action done! } } } public class MoveToLocalPosition : U3dActionman { public GameObject obj; public Vector3 targetlocal; public int speed; private IU3dActionCompleted monitor = null; public void setting(GameObject obj,Vector3 targetlocal,int speed,IU3dActionCompleted monitor){ this.obj = obj; this.targetlocal = targetlocal; this.speed = speed; this.monitor = monitor; } void Update(){ float step = speed * Time.deltaTime; transform.localPosition = Vector3.MoveTowards (transform.localPosition,targetlocal,step); if(transform.localPosition == targetlocal){ if(monitor != null){ monitor.OnActionCompleted (this); } Destroy (this); } } }}public class BaseCode : MonoBehaviour { public string gameName; public string gameRule; // Use this for initialization void Start () { this.transform.position = new Vector3 (0.0f,5.0f,-12.0f); GameSceneController mygame = GameSceneController.GetInstance (); mygame.setBaseCode (this); } // Update is called once per frame void Update () { }}
GenGameObject.cs
using UnityEngine;using System.Collections;using System.Collections.Generic;using Com.Mygame;public class GenGameObjects : MonoBehaviour , IU3dActionCompleted{ GameSceneController mygame; //boat public int moving = 0; int state = 0; GameObject Boat; Vector3 boatscale = new Vector3(4.0f,0.3f,2.0f); //boat's size; Vector3 boatStartpos = new Vector3(-6.0f,0.0f,0.0f); Vector3 boatEndpos = new Vector3(6.0f,0.0f,0.0f); // sits on the boat Vector3 boatsit1 = new Vector3 (-0.25f,3.45f,0.0f); // localposition is care with the scale Vector3 boatsit2 = new Vector3 (0.25f,3.45f,0.0f); // others about boats int boatspeed = 4; int boatnumber = 0; int Ifboatsit1have = 0; int Ifboatsit2have = 0; //river //Devils List<GameObject> devils = new List<GameObject>(); Vector3[] devilStartpos = new Vector3[3]{ new Vector3(-10f,1.15f,-3f), new Vector3(-10f,1.15f,-2f), new Vector3(-10f,1.15f,-1f) }; Vector3[] devilEndpos = new Vector3[3]{ new Vector3(10f,1.15f,-3f), new Vector3(10f,1.15f,-2f), new Vector3(10f,1.15f,-1f) }; Vector3[] devilScale = new Vector3[3]{ new Vector3(), new Vector3(), new Vector3() }; int[] DevilsState = new int[3]{0,0,0}; // 0-startside 1-endside 2-onboat int[] Devilssite = new int[3]{0,0,0}; //0表示 nosite 1-1site 2-2site int devilStartside = 3; int devilEndside = 0; //Priest List<GameObject> priests = new List<GameObject>(); Vector3[] priestStartpos = new Vector3[3]{ new Vector3(-10f,1.15f,1f), new Vector3(-10f,1.15f,2f), new Vector3(-10f,1.15f,3f) }; Vector3[] prisetEndpos = new Vector3[3]{ new Vector3(10f,1.15f,1f), new Vector3(10f,1.15f,2f), new Vector3(10f,1.15f,3f) }; Vector3[] priestScale = new Vector3[3]{ new Vector3(), new Vector3(), new Vector3() }; int[] PriestState = new int[3]{0,0,0}; // 0-startside 1-endside 2-onboat int[] Priestsite = new int[3]{0,0,0}; int priestStartside = 3; int priestEndside = 0; // startside GameObject startside; Vector3 startsidepos = new Vector3 (-10.0f,0.0f,0.0f); Vector3 startsidescale = new Vector3(4f,0.3f,8f); // endside GameObject endside; Vector3 endsidepos = new Vector3 (10.0f,0.0f,0.0f); Vector3 endsidescale = new Vector3(4f,0.3f,8f); // Use this for initialization void Start () { mygame = GameSceneController.GetInstance (); mygame.setGenGameObject (this); InsAll (); } // Update is called once per frame void Update () { float step = boatspeed * Time.deltaTime; if(state == 2){ //Boat.transform.position = Vector3.MoveTowards (Boat.transform.position,boatEndpos,boatspeed); if(Boat.transform.position == boatEndpos) state = 1; } else if (state == 3){ //Boat.transform.position = Vector3.MoveTowards (Boat.transform.position,boatStartpos,boatspeed); if(Boat.transform.position == boatStartpos) state = 0; } } // ins all gameobjects void InsAll(){ //sides startside = GameObject.CreatePrimitive(PrimitiveType.Cube); startside.transform.localScale = startsidescale; startside.transform.position = startsidepos; startside.GetComponent<Renderer> ().material.color = Color.green; endside = GameObject.CreatePrimitive (PrimitiveType.Cube); endside.transform.localScale = endsidescale; endside.transform.position = endsidepos; endside.GetComponent<Renderer> ().material.color = Color.green; //boat Boat = GameObject.CreatePrimitive(PrimitiveType.Cube); Boat.transform.position = boatStartpos; Boat.transform.localScale = boatscale; Boat.GetComponent<Renderer> ().material.color = Color.grey; //devils and Priests for(int i = 0;i<3;i++){ GameObject devil = GameObject.CreatePrimitive (PrimitiveType.Cylinder); devil.GetComponent<Renderer> ().material.color = Color.red; devil.transform.position = devilStartpos [i]; devils.Add (devil); GameObject priest = GameObject.CreatePrimitive (PrimitiveType.Cylinder); priest.transform.position = priestStartpos [i]; priests.Add (priest); } //light !!cool GameObject light = new GameObject("The light"); Light lightComp = light.AddComponent<Light> (); lightComp.type = LightType.Directional; light.transform.position = new Vector3 (); Quaternion Q; Q = Quaternion.Euler (20.0f,0.0f,0.0f); light.transform.rotation = Q; } public void DevilGoOnBoat(){ // must write by public ,or the interface can not use it if (!IQueryGameStatus ()) return; if (state == 0) { //startside if (boatnumber != 2) { for (int i = 0; i < 3; i++) { if (DevilsState [i] == 0) { DevilsState [i] = 2;//mean now this devil's state is on boat devils [i].transform.parent = Boat.transform; if (Ifboatsit1have == 0 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this); Devilssite [i] = 1; Ifboatsit1have = 1; } else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit2,4,this); Devilssite [i] = 2; Ifboatsit2have = 1; } else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) { ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this); Devilssite [i] = 1; Ifboatsit1have = 1; } devilStartside--; boatnumber++; break; } } } } else if (state == 1) { // endside if (boatnumber != 2) { for (int i = 0; i < 3; i++) { if (DevilsState [i] == 1) { DevilsState [i] = 2;//mean now this devil's state is on boat devils [i].transform.parent = Boat.transform; if (Ifboatsit1have == 0 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this); Devilssite [i] = 1; Ifboatsit1have = 1; } else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit2,4,this); Devilssite [i] = 2; Ifboatsit2have = 1; } else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) { ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this); Devilssite [i] = 1; Ifboatsit1have = 1; } devilEndside--; boatnumber++; break; } } } } } public void DevilGoOffBoat(){ if (!IQueryGameStatus ()) return; if (state == 0) { // startside for (int i = 0; i < 3; i++) { if(DevilsState[i] == 2){ devils [i].transform.parent = null; //devils[i].transform.position = devilStartpos[i]; ActionManager.GetInstance ().ApplyMoveGameObjectTo (devils[i],devilStartpos[i],6,this); DevilsState[i] = 0; if (Devilssite [i] == 1) Ifboatsit1have = 0; else if (Devilssite [i] == 2) Ifboatsit2have = 0; Devilssite [i] = 0; devilStartside++; boatnumber--; break; } } } else if (state == 1) { // endside for (int i = 0; i < 3; i++) { if(DevilsState[i] == 2){ devils [i].transform.parent = null; ActionManager.GetInstance ().ApplyMoveGameObjectTo (devils[i],devilEndpos[i],6,this); DevilsState[i] = 1; if (Devilssite [i] == 1) Ifboatsit1have = 0; else if (Devilssite [i] == 2) Ifboatsit2have = 0; Devilssite [i] = 0; devilEndside++; boatnumber--; break; } } } } public void PriestGoOnBoat(){ if (!IQueryGameStatus ()) return; if (state == 0) { //startside if (boatnumber != 2) { for (int i = 0; i < 3; i++) { if (PriestState [i] == 0) { PriestState [i] = 2;//mean now this devil's state is on boat priests [i].transform.parent = Boat.transform; if (Ifboatsit1have == 0 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this); Priestsite [i] = 1; Ifboatsit1have = 1; } else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit2,4,this); Priestsite [i] = 2; Ifboatsit2have = 1; } else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) { ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this); Priestsite [i] = 1; Ifboatsit1have = 1; } priestStartside--; boatnumber++; break; } } } } else if (state == 1) { // endside if (boatnumber != 2) { for (int i = 0; i < 3; i++) { if (PriestState [i] == 1) { PriestState [i] = 2;//mean now this devil's state is on boat priests [i].transform.parent = Boat.transform; if (Ifboatsit1have == 0 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this); Priestsite [i] = 1; Ifboatsit1have = 1; } else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) { ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit2,4,this); Priestsite [i] = 2; Ifboatsit2have = 1; } else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) { ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this); Priestsite [i] = 1; Ifboatsit1have = 1; } priestEndside--; boatnumber++; break; } } } } } public void PriestGoOffBoat(){ if (!IQueryGameStatus ()) return; if (state == 0) { // startside for (int i = 0; i < 3; i++) { if(PriestState[i] == 2){ priests [i].transform.parent = null; //priests[i].transform.position = priestStartpos[i]; ActionManager.GetInstance ().ApplyMoveGameObjectTo (priests[i],priestStartpos[i],6,this); PriestState[i] = 0; if (Priestsite [i] == 1) Ifboatsit1have = 0; else if (Priestsite [i] == 2) Ifboatsit2have = 0; Priestsite [i] = 0; priestStartside++; boatnumber--; break; } } } else if (state == 1) { // endside for (int i = 0; i < 3; i++) { if(PriestState[i] == 2){ priests [i].transform.parent = null; ActionManager.GetInstance ().ApplyMoveGameObjectTo (priests[i],prisetEndpos[i],6,this); PriestState[i] = 1; if (Priestsite [i] == 1) Ifboatsit1have = 0; else if (Priestsite [i] == 2) Ifboatsit2have = 0; Priestsite [i] = 0; priestEndside++; boatnumber--; break; } } } } public void BoatGo(){ if (!IQueryGameStatus ()) return; if(boatnumber != 0){ check (); if (state == 0) { // from startpos to endpos,move ActionManager.GetInstance().ApplyMoveGameObjectTo(Boat,boatEndpos,boatspeed,this); state = 2; } else if (state == 1){ ActionManager.GetInstance().ApplyMoveGameObjectTo(Boat,boatStartpos,boatspeed,this); state = 3; // form endpos to startpos,move } } } public bool IQueryGameStatus(){ if (moving == 1) { return false; } else { moving = 1; return true; } } public void check(){ //lose check print(devilStartside); print (devilEndside); print (priestStartside); print (priestEndside); if (state == 0) { if ((devilStartside > priestStartside && priestStartside!=0) || ((3 - devilStartside) > (3 - priestStartside) && (3-priestStartside)!=0)) { mygame.wl = WinOrLose.Lose; return; } } else if (state == 1) { if ((devilEndside > priestEndside && priestEndside!=0 ) || ((3 - devilEndside) > (3 - priestEndside) && (3-priestEndside)!=0)) { mygame.wl = WinOrLose.Lose; return; } } //win check if(devilStartside == 0 && priestStartside == 0) mygame.wl = WinOrLose.Win; } public void OnActionCompleted(U3dAction action){ moving = 0; }}
Actions.cs
using UnityEngine;using System.Collections;using Com.Mygame;public class Actions : MonoBehaviour { GameSceneController mygame; ImyAction actions; float BottonW = Screen.width/4; float BottonH = Screen.height/16; float firstBx = Screen.width/4; float firstBy = Screen.height/8; float blank = 5; private string str = "点击重置!"; // Use this for initialization void Start () { mygame = GameSceneController.GetInstance(); actions = GameSceneController.GetInstance () as ImyAction; } void OnGUI(){ if(GUI.Button(new Rect(firstBx,firstBy,BottonW,BottonH), "魔鬼上船")){ actions.DevilGoOnBoat (); } if(GUI.Button(new Rect(firstBx+BottonW+blank,firstBy,BottonW,BottonH), "魔鬼下船")){ actions.DevilGoOffBoat (); } if(GUI.Button(new Rect(firstBx,firstBy+BottonH+blank,BottonW,BottonH), "牧师上船")){ actions.PriestGoOnBoat (); } if(GUI.Button(new Rect(firstBx+BottonW+blank,firstBy+BottonH+blank,BottonW,BottonH), "牧师下船")){ actions.PriestGoOffBoat (); } if(GUI.Button(new Rect(firstBx,firstBy+(BottonH+blank)*2,BottonW*2+blank,BottonH*2), "开船!")){ actions.BoatGo (); if (mygame.wl == WinOrLose.Gaming) str = "点击重置!"; else if (mygame.wl == WinOrLose.Lose) str = "输了...重来!"; else if (mygame.wl == WinOrLose.Win) str = "赢了!再来!"; } if(GUI.Button(new Rect(Screen.width-BottonW/2,firstBy,BottonW/2,BottonH),str)){ Application.LoadLevel (Application.loadedLevelName); mygame.wl = WinOrLose.Gaming; } //GUI.Label (new Rect (firstBx,firstBy-BottonH,BottonW*2,BottonH), str); }}
0 0
- 魔鬼牧师游戏--简单工厂的改进
- Unity3D学习笔记(4)-牧师与魔鬼游戏改进
- Unity3D学习笔记(四)牧师和魔鬼游戏改进
- 牧师和魔鬼游戏制作
- Unity3D笔记(三)牧师和魔鬼的游戏
- Unity3D学习笔记(5)—— 牧师和魔鬼游戏改进
- Unity3d学习笔记(3)--牧师与魔鬼游戏
- Unity3D学习(5)——牧师与魔鬼游戏
- 魔鬼与牧师小游戏
- 牧师与魔鬼优化
- 简单工厂模式的改进
- Unity3D学习笔记(4)—— 牧师和魔鬼游戏
- Unity 3D游戏开发学习笔记(2) 牧师与魔鬼
- Unity3D学习(3)之基于鼠标点击的3D版牧师与魔鬼
- Unity3D学习(4)之分离动作管理器的3D版牧师与魔鬼
- 牧师与魔鬼(动作分离版)
- iOS开发之-猜数游戏的简单改进
- 牧师与恶魔过河游戏
- CentOS 安装ElasticSearch2.x
- xcode storyboard 中如何复制一个控件
- js 监视 iframe 或 frameset 的内容变动
- Java开发工具中Compile、Make和Build的区别
- 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 快速排序(代码填空)
- 魔鬼牧师游戏--简单工厂的改进
- 自定义布局
- Hello,faker!
- iOS-时间戳转化成时间
- halcon小例:ORC识别
- MySQL中的共享锁与排他锁
- iOS中的滤镜
- Device Tree(三):代码分析
- 分享两遍不错的文章,有关快速排序,用JS写的,有需要的朋友可以参考一下