Пример #1
0
        /// <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);
        }
Пример #2
0
            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);
            }
Пример #3
0
            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);
                }
            }
Пример #4
0
            public override void Deactivate()
            {
                CharacterController controller = (this.Parent as CharacterController);
                IRoadCharacter      parent     = controller.Parent as IRoadCharacter;

                parent.Y += 4;
                parent.X -= 2;
            }
Пример #5
0
            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);
            }
Пример #6
0
            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);
                        }
                        //*/
                    }
                }
            }
Пример #7
0
            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);
                }
            }
Пример #8
0
            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);
            }
Пример #9
0
            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);
            }
Пример #10
0
            // 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
            }
Пример #11
0
            /// <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);
            }
Пример #12
0
            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
                }
            }
Пример #13
0
            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);
                }
            }
Пример #14
0
        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);
        }
Пример #15
0
        /// <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");
            }
        }
Пример #16
0
 // unary predicate
 static bool CharacterIsDead(IRoadCharacter character)
 {
     return(character.IsDead());
 }