/** * this is the updated fucntion for the state */ public override void Excute(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); if (PlayerScript.BallInReceivingRange() || !PlayerScript.GetTeam().InControl()) { PlayerScript.ChangeState(CallingObject, ChaseBall.Instance()); return; } Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive"); if (Arr.AtTarget) { //PlayerScript.ChangeState(CallingObject, Wait.Instance()); //PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive); // PlayerScript.GetSteeringController().TurnOff(Behaviour.Pursue); PlayerScript.TrackBall(); if (PlayerScript.IsClosestTeamMemberToBall()) { PlayerScript.ChangeState(CallingObject, ChaseBall.Instance()); } } }
// 대기중인 플레이어의 목표 지점을 최신화 public void UpdateTargetsOfWaitingPlayers() { foreach (var item in players) { PlayerBase pb = item.GetComponent <PlayerBase>(); if (pb.Role() != "GoalKeeper") { FieldPlayer fp = item.GetComponent <FieldPlayer>(); if (fp.GetFSM() == null) { Debug.LogError("No FSM"); } // 본래의 위치로 돌아가게 한다. if (fp.GetFSM().IsInstate(Wait.instance) || fp.GetFSM().IsInstate(ReturnToHomeRegion.instance)) { if (fp.Team().teamColor == TeamColor.Blue) { fp.Steering().SetTarget((fp.Team().initialRegion[fp.Id() - 6])); } else { fp.Steering().SetTarget((fp.Team().initialRegion[fp.Id() - 1])); } } } } }
/** * this will execute when the state is entered */ public override void Enter(GameObject CallingObject) { //Set as recieving and controlling player FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetTeam().SetControllingPlayer(PlayerScript); PlayerScript.GetTeam().RecievingPlayer = PlayerScript; //TODO - maybe add more to this if statement //If player is close if (!PlayerScript.IsOppenentWithinRadius()) { PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive); } else { PlayerScript.GetSteeringController().TurnOn(Behaviour.Pursue); Steer2D.Pursue Pur = (Steer2D.Pursue)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Pursue"); Pur.TargetAgent = PlayerScript.Ball; } if (PlayerScript.DebugOn) { Debug.Log("Entering recieve ball state"); } }
private void Discharge(FieldPlayer pReceiver, Telegram_CH4 msg = null) { if (msg == null || !pReceiver.HandleMessage(msg)) { Debug.Log("Empty Msg Detected"); } }
public void UpdateTargetsOfWaitingPlayers() { foreach (var item in players) { PlayerBase pb = item.GetComponent <PlayerBase>(); if (pb.Role() != "GoalKeeper") { FieldPlayer fp = item.GetComponent <FieldPlayer>(); if (fp.GetFSM() == null) { Debug.Log("No FSM"); } if (fp.GetFSM().IsInstate(Wait.instance) || fp.GetFSM().IsInstate(ReturnToHomeRegion.instance)) { //Debug.Log("원래는 fp.steering().settarget(~~)\n https://github.com/wangchen/Programming-Game-AI-by-Example-src/blob/master/Buckland_Chapter4-SimpleSoccer/SoccerTeam.cpp"); if (fp.Team().teamColor == TeamColor.Blue) { fp.Steering().SetTarget((fp.Team().initialRegion[fp.ID() - 6])); } else { fp.Steering().SetTarget((fp.Team().initialRegion[fp.ID() - 1])); } // fp.gameObject.GetComponent<PlayerBase>().Steering().SetTarget(fp.HomeRegion()); } } } }
/** * this is the updated fucntion for the state */ public override void Excute(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); if (PlayerScript.BallInKickingRange()) { PlayerScript.ChangeState(CallingObject, KickBall.Instance()); return; } if (PlayerScript.IsClosestTeamMemberToBall()) { Steer2D.Seek S = (Steer2D.Seek)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Seek"); if (S) { S.TargetPoint = PlayerScript.Ball.transform.position; } return; } PlayerScript.ChangeState(CallingObject, ReturnToHomeRegion.Instance()); }
public override void OnStart() { //Debug.Log("IsCanshot Start"); rightDoor = CreatGrid.Instance.GetPosByXY(Define.m_rightDoor); leftDoor = CreatGrid.Instance.GetPosByXY(Define.m_leftDoor); v_Player = this.GetComponent <FieldPlayer>(); v_Ball = CreatGrid.Instance.m_Ball; }
/** * this will execute when the state is exited */ public override void Exit(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); if (PlayerScript.DebugOn) { Debug.Log("Exiting KickBall State"); } }
/** * this will execute when the state is exited */ public override void Exit(GameObject CallingObject) { //Empty FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); if (PlayerScript.DebugOn) { Debug.Log("Exiting Player Dribble State"); } }
/** * this will execute when the state is exited */ public override void Exit(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive); if (PlayerScript.DebugOn) { Debug.Log("Exiting Player Return to home state"); } }
/** * this will execute when the state is entered */ public override void Enter(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetTeam().SetControllingPlayer(PlayerScript); if (PlayerScript.DebugOn) { Debug.Log("Entering Player Dribble State"); } }
/** * this will execute when the state is entered */ public override void Enter(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetSteeringController().TurnOn(Behaviour.Seek); if (PlayerScript.DebugOn) { Debug.Log("Entering Player Chase Ball State"); } }
static void Main(string[] args) { FieldPlayer fieldPlayer = new FieldPlayer(); Forward forward = new Forward(); MidFielder midfielder = new MidFielder(); // Link decorators forward.AssignPlayer(fieldPlayer); midfielder.AssignPlayer(forward); midfielder.passBall(); }
/** * this will execute when the state is entered */ public override void Enter(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); if (PlayerScript.DebugOn) { Debug.Log("Entering Wait State"); } PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive); //Empty }
public void RequestPass(FieldPlayer requester) { float randFloat = Random.Range(0f, 1f); if (randFloat > .5f) { return; } if (IsPassSafeFromAllOpponents(ControllingPlayer().transform.position, requester.transform.position, requester.gameObject, Prm.instance.MaxPassingForce)) { MessageDispatcher_CH4.instance.DispatchMessage(0f, ControllingPlayer().GetComponent <FieldPlayer>().ID(), requester.ID(), SoccerMessages.Msg_PassToMe, requester.transform); } }
/** * this will execute when the state is exited */ public override void Exit(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetTeam().SupportingPlayer = null; PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive); if (PlayerScript.DebugOn) { Debug.Log("Exiting Support Attacker State"); } }
/** * this will execute when the state is exited */ public override void Exit(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive); PlayerScript.GetSteeringController().TurnOff(Behaviour.Pursue); PlayerScript.GetTeam().RecievingPlayer = null; if (PlayerScript.DebugOn) { Debug.Log("Exiting Receive ball state"); } }
/** * this will execute when the state is entered */ public override void Enter(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive); Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive"); Arr.TargetPoint = PlayerScript.HomePosition; if (PlayerScript.DebugOn) { Debug.Log("Entering Player Return to home state"); } }
/** * this will execute when the state is entered */ public override void Enter(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive); Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive"); Arr.TargetPoint = PlayerScript.GetTeam().GetSupportSpot(); if (PlayerScript.DebugOn) { Debug.Log("Entering Support Attacker State"); } }
/** * this will execute when the state is entered */ public override void Enter(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.GetTeam().SetControllingPlayer(PlayerScript); if (!PlayerScript.IsReadyForNextKick()) { PlayerScript.ChangeState(CallingObject, ChaseBall.Instance()); } if (PlayerScript.DebugOn) { Debug.Log("Entering Kick Ball State"); } }
// 패스 요청 public void RequestPass(FieldPlayer requester) { // 패스 요청 빈도 const float requestFrequency = 0.7f; float randFloat = UnityEngine.Random.Range(0f, 1f); if (randFloat > requestFrequency) { return; } // 가로챔 당할 걱정 없을 경우 패스 if (IsPassSafeFromAllOpponents(ControllingPlayer().transform.position, requester.transform.position, requester.gameObject, Prm.instance.MaxPassingForce)) { MessageDispatcher_CH4.instance.DispatchMessage(0f, ControllingPlayer().GetComponent <FieldPlayer>().Id(), requester.Id(), SoccerMessages.Msg_PassToMe, requester.transform); } }
/** * this is the updated fucntion for the state */ public override void Excute(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); if (!PlayerScript.GetTeam().InControl()) { PlayerScript.ChangeState(CallingObject, ReturnToHomeRegion.Instance()); return; } Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive"); if (Arr.TargetPoint != PlayerScript.GetTeam().GetSupportSpot()) { PlayerScript.GetSteeringController().TurnOn(Behaviour.Arrive); Arr.TargetPoint = PlayerScript.GetTeam().GetSupportSpot(); } Vector2 ShootingTarget = new Vector2(); if (PlayerScript.GetTeam().CanShoot(CallingObject.transform.position, out ShootingTarget, PlayerScript.MaxShootingForce)) //TODO ?Need Confidence here? { PlayerScript.GetTeam().RequestPass(CallingObject); } if (Arr.AtTarget) { //PlayerScript.GetSteeringController().TurnOff(Behaviour.Arrive); PlayerScript.TrackBall(); if (!PlayerScript.IsThreatened()) { PlayerScript.GetTeam().RequestPass(CallingObject); } } //If closest to ball and not in goalkeepers hands... Chase the ball if (PlayerScript.IsClosestTeamMemberToBall() && (!PlayerScript.GetTeam().GetPitch().GoalKeeperHasBall())) { PlayerScript.ChangeState(CallingObject, ChaseBall.Instance()); return; } }
/** * this is the updated fucntion for the state */ public override void Excute(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); if (PlayerScript.GetTeam().GetPitch().GetGameInPlay()) { //If closest to ball and not in goalkeepers hands... Chase the ball if (PlayerScript.IsClosestTeamMemberToBall() && (!PlayerScript.GetTeam().GetPitch().GoalKeeperHasBall())) { PlayerScript.ChangeState(CallingObject, ChaseBall.Instance()); return; } } Steer2D.Arrive Arr = (Steer2D.Arrive)PlayerScript.GetSteeringController().GetBehaviourByTypeName("Steer2D.Arrive"); if (Arr.AtTarget) { PlayerScript.ChangeState(CallingObject, Wait.Instance()); } }
/** * this is the updated fucntion for the state */ public override void Excute(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); float dot = Vector3.Dot(CallingObject.transform.right, (PlayerScript.OpponentsGoal.transform.position - CallingObject.transform.position).normalized); if (dot > 0.7f) //Facing the goal { //Dribble towards goal Vector2 Target = PlayerScript.transform.position + (CallingObject.transform.right * PlayerScript.DribbleForce); PlayerScript.Ball.GetComponent <Football>().AddForce(CallingObject.transform.right * PlayerScript.DribbleForce, Target, "Dribbling Towards Goal"); } else { //Kick to your prefered turn dir //Debug.Log("Turning With Ball"); Vector2 Target = PlayerScript.transform.position + (CallingObject.transform.right * PlayerScript.DribbleForce); PlayerScript.Ball.GetComponent <Football>().AddForce(CallingObject.transform.up * PlayerScript.TurningForce * PlayerScript.PreferedTurnDir, Target, "Turning With Ball"); } PlayerScript.ChangeState(CallingObject, ChaseBall.Instance()); }
/** * this is the updated fucntion for the state */ public override void Excute(GameObject CallingObject) { FieldPlayer PlayerScript = CallingObject.GetComponent <FieldPlayer>(); PlayerScript.TrackBall(); if (PlayerScript.GetTeam().GetPitch().GetGameInPlay()) { //If closest to ball and not in goalkeepers hands... Chase the ball if (PlayerScript.IsClosestTeamMemberToBall() && (!PlayerScript.GetTeam().GetPitch().GoalKeeperHasBall())) { PlayerScript.ChangeState(CallingObject, ChaseBall.Instance()); return; } } if (PlayerScript.GetTeam().InControl() && (PlayerScript.GetTeam().ControllingPlayer != PlayerScript && PlayerScript.AheadOfAttacker())) { PlayerScript.GetTeam().RequestPass(CallingObject); return; } }
static void Decorator() { //'-- Step 1: //'Create few players (concrete components) //'Create few field Players var owen = new FieldPlayer("Owen"); var beck = new FieldPlayer("Beckham"); //'Create a goal keeper var khan = new GoalKeeper("Khan"); //'-- Step 2: //'Just make them pass the ball //'(during a warm up session ;)) System.Console.WriteLine(); System.Console.WriteLine(" > Warm up Session... "); owen.PassBall(); beck.PassBall(); khan.PassBall(); //'-- Step 3: Create and assign the responsibilities //'(when the match starts) System.Console.WriteLine(); System.Console.WriteLine(" > Match is starting.. "); //'Set owen as our first forward var forward1 = new Forward(); forward1.AssignPlayer(owen); //'Set Beckham as our midfielder var midfielder1 = new MidFielder(); midfielder1.AssignPlayer(beck); //'Now, use these players to do actions //'specific to their roles //'Owen can pass the ball forward1.PassBall(); //'And owen can shoot as well forward1.ShootGoal(); //'Beckham can pass ball midfielder1.PassBall(); //'Beckham can dribble too midfielder1.Dribble(); //' [ Arrange the above operations to some meaningfull sequence, like //' "Beckham dribbled and passed the ball to owen and owen shooted the //' goal ;) - just for some fun ]" //'-- Step 4: Now, changing responsibilities //'(during a substitution) //'Assume that owen got injured, and we need a new player //'to play as our forward1 System.Console.WriteLine(); System.Console.WriteLine(" > OOps, Owen " + "got injured. " + "Jerrard replaced Owen.. "); //'Create a new player var jerrard = new FieldPlayer("Jerrard"); //'Ask Jerrard to play in position of owen forward1.AssignPlayer(jerrard); forward1.ShootGoal(); //'-- Step 5: Adding multiple responsibilities //'(When a player need to handle multiple roles) //'We already have Beckham as our midfielder. //'Let us ask him to play as an additional forward var onemoreForward = new Forward(); onemoreForward.AssignPlayer(beck); System.Console.WriteLine(); System.Console.WriteLine(" > Beckham has " + "multiple responsibilities.. "); //'Now Beckham can shoot onemoreForward.ShootGoal(); //'And use his earlier responsibility to dribble too midfielder1.Dribble(); //'According to our design, you can attach the responsibility of //'a forward to a goal keeper too, but when you actually //'play football, remember that it is dangerous ;) //'Wait for key press }
public void RemoveEntity(FieldPlayer pEntity) { m_EntityMap.Remove(pEntity.ID()); }
public override void OnStart() { v_Player = GetComponent <FieldPlayer>(); v_Ball = v_Player.GetBall().GetComponent <Ball>(); }
public override void OnStart() { v_Player = this.GetComponent <FieldPlayer>(); }
protected void DrawField() { int b = 1; int bx2 = b * 2; for (int x = 0; x < game.gameParameters.FieldWidth; x++) { for (int y = 0; y < game.gameParameters.FieldHeight; y++) { Tile t = game.field[x, y]; Rectangle r = new Rectangle(); switch (t.terrainType) { case TerrainType.Field: r = new Rectangle(0 + b, 0 + b, 64 - bx2, 64 - bx2); break; case TerrainType.Water: r = new Rectangle(64 + b, 0 + b, 64 - bx2, 64 - bx2); break; case TerrainType.Swamp: r = new Rectangle(256 + b, 0 + b, 64 - bx2, 64 - bx2); break; case TerrainType.Hole: r = new Rectangle(128 + b, 0 + b, 64 - bx2, 64 - bx2); break; case TerrainType.Home: r = new Rectangle(0 + b, 0 + b, 64 - bx2, 64 - bx2); break; default: throw new Exception(); } spriteBatch.Draw(atlasTexture, new Rectangle(x * a + bias.X, y * a + bias.Y, a, a), r, Color.White); if (t.terrainType == TerrainType.Home) { spriteBatch.Draw(atlasTexture, new Rectangle(x * a + bias.X, y * a + bias.Y, a, a), new Rectangle(320 + b, 64 + b, 64 - bx2, 64 - bx2), playersColors[t.intParam - 1]); } foreach (var pair in t.walls) { if (pair.Value != BorderType.Empty) { switch (pair.Value) { case BorderType.BreakableWall: r = new Rectangle(256, 64, 64, 64); break; case BorderType.UnbreakableWall: r = new Rectangle(0, 64, 64, 64); break; case BorderType.Grate: r = new Rectangle(64, 64, 64, 64); break; default: throw new Exception(); } float f = 0; switch (pair.Key) { case Direction.Up: f = 0; break; case Direction.Right: f = MathHelper.PiOver2; break; case Direction.Down: f = MathHelper.PiOver2 * 2; break; case Direction.Left: f = MathHelper.PiOver2 * 3; break; default: throw new Exception(); } spriteBatch.Draw( texture: atlasTexture, destinationRectangle: new Rectangle(x * a + a / 2 + bias.X, y * a + a / 2 + bias.Y, a, a), sourceRectangle: r, color: Color.White, rotation: f, origin: new Vector2(32, 32), effects: SpriteEffects.None, layerDepth: 0); } } foreach (var s in t.stuff) { switch (s.type) { case StuffType.Treasure: r = new Rectangle(128 + b, 64 + b, 64 - bx2, 64 - bx2); break; default: throw new Exception(); } spriteBatch.Draw(atlasTexture, new Rectangle(x * a + bias.X, y * a + bias.Y, a, a), r, Color.White); } } } for (int i = 0; i < game.field.players.Length; i++) { FieldPlayer p = game.field.players[i]; spriteBatch.Draw(atlasTexture, new Rectangle(p.X * a + bias.X, p.Y * a + bias.Y, a, a), new Rectangle(192 + b, 64 + b, 64 - bx2, 64 - bx2), playersColors[i]); } }