/// <summary> /// Builds a road character /// Uses a passed in type, ctor + reflection /// to get this working on both XNA and Silver /// This BUILDS a character /// It creates a Road Character with a behavior and animation /// It does NOT create the navigation path /// </summary> /// <param name="character"></param> /// <param name="row"></param> /// <param name="column"></param> /// <param name="roadDirection"></param> /// <param name="squarePosition"></param> /// <param name="boardSize"></param> /// <param name="reachHalfSquare"></param> /// <returns></returns> private IRoadCharacter BuildCharacter(int row, int column, CardinalPoint roadDirection, float squarePosition, int boardSize, bool reachHalfSquare) { object[] args = (mCanvas == null) ? new object[6] : new object[7]; args[0] = row; args[1] = column; args[2] = roadDirection; // used for FRB layering args[3] = mGopherLayer; // not used args[4] = boardSize; // not used args[5] = reachHalfSquare; if (mCanvas != null) { args[6] = mCanvas; } ConstructorInfo[] info = mControllerType.GetConstructors(); object obj = info[0].Invoke(args); IRoadCharacter character = obj as IRoadCharacter; return(character); }
public override void Activate(object eventData) { CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; parent.AnimController.StartAnimation(RoadAnimationNames.kWinDance, MirrorMode.None); }
public override void Update(float dt) { CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; Vec2 direction = mTarget - new Vec2(parent.X, parent.Y); Debug.WriteLine("elapsed time" + dt); float distance = direction.Length(); if (distance < 0.01) { // at target Debug.WriteLine("At Target, Raise Event"); controller.HandleEvent((int)CharacterController.CharacterEvents.To_GetTarget, null); } else { direction.Normalize(); Debug.WriteLine("mSpeed*dt :" + mSpeed * dt); direction *= Convert.ToSingle(Math.Min(mSpeed * dt, distance)); parent.X += direction.X; parent.Y += direction.Y; //Debug.WriteLine("Parent posn {0} {1}", parent.X, parent.Y); } }
public override void Deactivate() { CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; parent.Y += 4; parent.X -= 2; }
public override void Activate(object eventData) { Debug.WriteLine("Lost State"); CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; parent.AnimController.StartAnimation(RoadAnimationNames.kIdle, MirrorMode.None); }
public override void Activate(object eventData) { Debug.WriteLine("Walk State"); Vec2 target = eventData as Vec2; #if (WINDOWS_PHONE && !SILVERLIGHT) float speed = (Parent as CharacterController).WalkSpeed; if (speed > 0) { mSpeed = speed; } ; #endif if (target == null) { Debug.WriteLine("No event data"); } else { mTarget = target; CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; Vec2 direction = mTarget - new Vec2(parent.X, parent.Y); Debug.WriteLine("direction length " + direction.Length()); if (direction.Length() < 0.01) { // at target controller.HandleEvent((int)CharacterController.CharacterEvents.To_GetTarget, null); } else { direction.Normalize(); ///* if (direction.X > 0.99f) { parent.AnimController.PlayAnimation(RoadAnimationNames.kWalkRight, MirrorMode.None); } else if (direction.X < -0.99f) { parent.AnimController.PlayAnimation(RoadAnimationNames.kWalkRight, MirrorMode.Horizontal); } else if (direction.Y > 0.99f) { parent.AnimController.PlayAnimation(RoadAnimationNames.kWalkBack, MirrorMode.None); } else if (direction.Y < -0.99f) { parent.AnimController.PlayAnimation(RoadAnimationNames.kWalkForward, MirrorMode.None); } //*/ } } }
public override void Update(float dt) { CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; // when parent anim is done, transition to GetTarget if (parent.AnimController.IsLastFrame) { controller.HandleEvent((int)CharacterController.CharacterEvents.To_GetTarget, null); } }
public override void Activate(object eventData) { CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; Debug.WriteLine("Spawn Out State"); // adding simple offsets to shift character to proper position so that // animation lines up with holes. parent.Y -= 4; parent.X += 2; parent.AnimController.StartAnimation(RoadAnimationNames.kSpawnOut, MirrorMode.None); }
public override void Activate(object eventData) { Debug.WriteLine("Spawn In State"); CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; #if (WINDOWS_PHONE && !SILVERLIGHT) parent.Visibility = true; controller.mDead = false; #endif parent.AnimController.StartAnimation(RoadAnimationNames.kSpawnIn, MirrorMode.None); }
// notify parent public override void Activate(object eventData) { Debug.WriteLine("Dead State"); CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; controller.Dead = true; #if (WINDOWS_PHONE && !SILVERLIGHT) parent.Visibility = false; parent.IsFed = false; #endif // maybe disable parent anim }
/// <summary> /// /// </summary> /// <param name="eventData"></param> public override void Activate(object eventData) { Debug.WriteLine("Idle State"); if (eventData == null) { mDuration = 2.0f; } else { mDuration = (eventData as Vec2).X; } //Parent is initialized as the CharacterController by the function InitializeStateMachine() //((this.Parent as CharacterController).Parent as IRoadCharacter).AnimController.StartAnimation(RoadAnimationNames.kIdle, MirrorMode.None); CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; parent.AnimController.StartAnimation(RoadAnimationNames.kIdle, MirrorMode.None); }
public override void Update(float dt) { CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; // when parent anim is done, transition to GetTarget if (parent.AnimController.IsLastFrame) { controller.HandleEvent((int)CharacterController.CharacterEvents.To_Dead, null); #if (WINDOWS_PHONE && !SILVERLIGHT) if (parent.CardinalDirection == CardinalPoint.N) { AnimationManager.Instance.CountAliveCharactersPlayer1--; } else { AnimationManager.Instance.CountAliveCharactersPlayer2--; } #endif } }
public override void Activate(object eventData) { CharacterController controller = (this.Parent as CharacterController); IRoadCharacter parent = controller.Parent as IRoadCharacter; Vec2 direction = controller.GetNextTarget(); Debug.WriteLine("GetwalkTarget State"); // no more targets, spawn out if (direction == null) { if (!parent.IsFed && parent.TargetFood > -1) { if (parent.CardinalDirection == CardinalPoint.E) { parent.StartFeeding = true; controller.HandleEvent((int)CharacterController.CharacterEvents.To_EatFlower, null); } else if (parent.CardinalDirection == CardinalPoint.N) { parent.StartFeeding = true; controller.HandleEvent((int)CharacterController.CharacterEvents.To_EatCarrot, null); } else { controller.HandleEvent((int)CharacterController.CharacterEvents.To_SpawnOut, null); } } else { controller.HandleEvent((int)CharacterController.CharacterEvents.To_SpawnOut, null); } } else { Debug.WriteLine("Position" + parent.X + " " + parent.Y + " Target" + direction.X + " " + direction.Y); controller.HandleEvent((int)CharacterController.CharacterEvents.To_Walk, direction); } }
protected void InitCharacter(int playerIndex) { Debug.WriteLine("\nSpawn boundary character"); List <IRoadCharacter> playerList = (playerIndex == 0) ? mPlayer1Characters : mPlayer2Characters; CardinalPoint direction; if (playerIndex == 0) { direction = CardinalPoint.N; } else { direction = CardinalPoint.E; } IRoadCharacter character = BuildCharacter( 0, 0, direction, 0, mBoardController.Size, false); playerList.Add(character); }
/// <summary> /// Handles spawn generation of new road chars, given the location of a domino /// </summary> /// <param name="domino">spawn in on this domino</param> protected void SpawnBoundaryCharacter(int playerIndex, bool spawnLower) { int targetFood = -1; CardinalPoint direction; Debug.WriteLine("\nSpawn boundary character player index" + playerIndex); List <IRoadCharacter> playerList = (playerIndex == 0) ? mPlayer1Characters : mPlayer2Characters; Queue <Vec2> path = new Queue <Vec2>(); if (playerIndex == 0) { if (spawnLower) { direction = CardinalPoint.N; } else { direction = CardinalPoint.S; } #if (WINDOWS_PHONE && !SILVERLIGHT) mCountAliveCharactersPlayer1++; #endif } else { if (spawnLower) { direction = CardinalPoint.E; } else { direction = CardinalPoint.W; } #if (WINDOWS_PHONE && !SILVERLIGHT) mCountAliveCharactersPlayer2++; #endif } // first build a path BuildCharacterPath(path, mPathBehaviors[playerIndex], playerIndex, spawnLower, ref targetFood); IRoadCharacter character = null; #if !(WINDOWS_PHONE && !SILVERLIGHT) character = BuildCharacter( 0, 0, direction, 0, mBoardController.Size, false); #else foreach (IRoadCharacter poolCharacter in playerList) { if (poolCharacter.IsDead()) { character = poolCharacter; break; } } if (mPathBehaviors[playerIndex] > 0) { character.BehaviorController.WalkSpeed = 30f; } #endif character.TargetFood = targetFood; if (path.Count != 0) { character.X = path.Peek().X; character.Y = path.Peek().Y; character.BehaviorController.SetNavigationPath(path); #if (WINDOWS_PHONE && !SILVERLIGHT) character.BehaviorController.HandleEvent((int)CharacterController.CharacterEvents.To_SpawnIn, null); #else playerList.Add(character); #endif } else { Debug.WriteLine("Path should not be null"); } }
// unary predicate static bool CharacterIsDead(IRoadCharacter character) { return(character.IsDead()); }