//Execute entity's action
        public void Update(GameTime gameTime)
        {
            lastAttackTime += gameTime.ElapsedGameTime.Milliseconds;
            timeSinceAstar += gameTime.ElapsedGameTime.Milliseconds;

            #region Animations
            if (animState == AnimationState.Idle)
            {
                animationPlayer = animationPlayerwalk;
                animationPlayer.ResetClip();
            }
            else if (animState == AnimationState.Walking)
            {
                animationPlayer = animationPlayerwalk;
            }
            else if(animState == AnimationState.Attacking)//animation for attacking
            {
                animationPlayer = animationPlayerattack;
            }
            else if (animState == AnimationState.Hurt)//animation when hurt
            {
                animationPlayer = animationPlayerhurt;

                ElapsedDamagedTime += gameTime.ElapsedGameTime.Milliseconds;
                if (ElapsedDamagedTime < DAMAGE_ANIM_LENGTH)
                {
                    if (animationPlayer.currentKeyframe < animationPlayer.CurrentClip.Keyframes.Count() - 1)
                    {
                        animationPlayer.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
                    }
                    else
                        animationPlayer.ResetClip();
                    return;
                }
                ElapsedDamagedTime = 0;
                animState = AnimationState.Idle;
            }
            else if (animState == AnimationState.Dying)//animation for dying
            {
                animationPlayer = animationPlayerdie;
                ElapsedDeathTime += gameTime.ElapsedGameTime.Milliseconds;
                if (ElapsedDeathTime < DEATH_ANIM_LENGTH)
                {
                    if (animationPlayer.currentKeyframe < animationPlayer.CurrentClip.Keyframes.Count() - 1)
                    {
                        animationPlayer.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
                    }
                    return;
                }
                else
                {
                    Dead = true;
                    return;
                }
            }
            else//if just standing
            {
                animationPlayer = animationPlayerwalk;
                animationPlayer.ResetClip();
            }
            animationPlayer.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
            #endregion

            PosState = EvaluateBehaviour();

            switch (PosState)
            {
                case EntityPositionState.KineticArrive:
                    {
                        KinematicArrive();
                        animState = AnimationState.Walking;
                        Position += Velocity;
                        break;
                    }
                case EntityPositionState.KineticFlee:
                    {
                        if ((Target.Position - this.Position).Length() < FleeRadius)
                        {
                            KinematicFlee();
                            animState = AnimationState.Walking;
                            Position += Velocity;
                        }
                        break;
                    }
                case EntityPositionState.SteeringArrive:
                    {
                        //if (onPath)
                        //{
                        //    // see if we can get to second node in path
                        //    if (path.Count > 1 && astarGetter(Position, path[1].position).Equals(Vector3.Zero))
                        //    {
                        //        GroundTarget = path[1].position;
                        //        path.RemoveAt(0);
                        //    }
                        //    else if (path.Count > 0)
                        //    {
                        //        if (!astarGetter(Position, GroundTarget).Equals(Vector3.Zero))
                        //            GroundTarget = path[0].position;
                        //        else
                        //            onPath = false;
                        //    }
                        //}
                        //else if (!onPath) // try to get path
                        //{
                        //    if (timeSinceAstar > MIN_PATHFINDING_IDLE)
                        //    {
                        //        path = GetAStarPath(GroundTarget);
                        //        if (path != null)
                        //            onPath = true;
                        //        timeSinceAstar = 0;
                        //    }
                        //}
                        SteeringArrive(creep);
                        animState = AnimationState.Walking;
                        Position += Velocity;
                        break;
                    }
                case EntityPositionState.SteeringFlee:
                    {
                        if ((Target.Position - this.Position).Length() < FleeRadius)
                        {
                            SteeringFlee(creep);
                            animState = AnimationState.Walking;
                            Position += Velocity;
                            onPath = false;
                        }
                        break;
                    }
                case EntityPositionState.SteeringWander:
                    {
                        SteeringWander();
                        animState = AnimationState.Walking;
                        Position += Velocity;
                        onPath = false;
                        break;
                    }
                case EntityPositionState.Attack:
                    {
                        animState = AnimationState.Attacking;
                        if (lastAttackTime > MeleeAttack.Speed)
                        {
                            Attack(MeleeAttack);
                            lastAttackTime = 0;
                        }
                        onPath = false;
                        break;
                    }
                case EntityPositionState.RangedAttack:
                    {
                        animState = AnimationState.Attacking;
                        if (lastAttackTime > RangedAttack.Speed)
                        {
                            Attack(RangedAttack);
                            lastAttackTime = 0;
                        }
                        onPath = false;
                        break;
                    }
                default:
                    {
                        animState = AnimationState.Idle;
                        break;
                    }
            }
        }
Пример #2
0
        //Execute entity's action
        public void Update(GameTime gameTime)
        {
            lastAttackTime += gameTime.ElapsedGameTime.Milliseconds;
            timeSinceAstar += gameTime.ElapsedGameTime.Milliseconds;

            #region Animations
            if (animState == AnimationState.Idle)
            {
                animationPlayer = animationPlayerwalk;
                animationPlayer.ResetClip();
            }
            else if (animState == AnimationState.Walking)
            {
                animationPlayer = animationPlayerwalk;
            }
            else if (animState == AnimationState.Attacking)//animation for attacking
            {
                animationPlayer = animationPlayerattack;
            }
            else if (animState == AnimationState.Hurt)//animation when hurt
            {
                animationPlayer = animationPlayerhurt;

                ElapsedDamagedTime += gameTime.ElapsedGameTime.Milliseconds;
                if (ElapsedDamagedTime < DAMAGE_ANIM_LENGTH)
                {
                    if (animationPlayer.currentKeyframe < animationPlayer.CurrentClip.Keyframes.Count() - 1)
                    {
                        animationPlayer.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
                    }
                    else
                    {
                        animationPlayer.ResetClip();
                    }
                    return;
                }
                ElapsedDamagedTime = 0;
                animState          = AnimationState.Idle;
            }
            else if (animState == AnimationState.Dying)//animation for dying
            {
                animationPlayer   = animationPlayerdie;
                ElapsedDeathTime += gameTime.ElapsedGameTime.Milliseconds;
                if (ElapsedDeathTime < DEATH_ANIM_LENGTH)
                {
                    if (animationPlayer.currentKeyframe < animationPlayer.CurrentClip.Keyframes.Count() - 1)
                    {
                        animationPlayer.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
                    }
                    return;
                }
                else
                {
                    Dead = true;
                    return;
                }
            }
            else//if just standing
            {
                animationPlayer = animationPlayerwalk;
                animationPlayer.ResetClip();
            }
            animationPlayer.Update(gameTime.ElapsedGameTime, true, Matrix.Identity);
            #endregion

            PosState = EvaluateBehaviour();

            switch (PosState)
            {
            case EntityPositionState.KineticArrive:
            {
                KinematicArrive();
                animState = AnimationState.Walking;
                Position += Velocity;
                break;
            }

            case EntityPositionState.KineticFlee:
            {
                if ((Target.Position - this.Position).Length() < FleeRadius)
                {
                    KinematicFlee();
                    animState = AnimationState.Walking;
                    Position += Velocity;
                }
                break;
            }

            case EntityPositionState.SteeringArrive:
            {
                //if (onPath)
                //{
                //    // see if we can get to second node in path
                //    if (path.Count > 1 && astarGetter(Position, path[1].position).Equals(Vector3.Zero))
                //    {
                //        GroundTarget = path[1].position;
                //        path.RemoveAt(0);
                //    }
                //    else if (path.Count > 0)
                //    {
                //        if (!astarGetter(Position, GroundTarget).Equals(Vector3.Zero))
                //            GroundTarget = path[0].position;
                //        else
                //            onPath = false;
                //    }
                //}
                //else if (!onPath) // try to get path
                //{
                //    if (timeSinceAstar > MIN_PATHFINDING_IDLE)
                //    {
                //        path = GetAStarPath(GroundTarget);
                //        if (path != null)
                //            onPath = true;
                //        timeSinceAstar = 0;
                //    }
                //}
                SteeringArrive(creep);
                animState = AnimationState.Walking;
                Position += Velocity;
                break;
            }

            case EntityPositionState.SteeringFlee:
            {
                if ((Target.Position - this.Position).Length() < FleeRadius)
                {
                    SteeringFlee(creep);
                    animState = AnimationState.Walking;
                    Position += Velocity;
                    onPath    = false;
                }
                break;
            }

            case EntityPositionState.SteeringWander:
            {
                SteeringWander();
                animState = AnimationState.Walking;
                Position += Velocity;
                onPath    = false;
                break;
            }

            case EntityPositionState.Attack:
            {
                animState = AnimationState.Attacking;
                if (lastAttackTime > MeleeAttack.Speed)
                {
                    Attack(MeleeAttack);
                    lastAttackTime = 0;
                }
                onPath = false;
                break;
            }

            case EntityPositionState.RangedAttack:
            {
                animState = AnimationState.Attacking;
                if (lastAttackTime > RangedAttack.Speed)
                {
                    Attack(RangedAttack);
                    lastAttackTime = 0;
                }
                onPath = false;
                break;
            }

            default:
            {
                animState = AnimationState.Idle;
                break;
            }
            }
        }
        public Zombie(int health, int maxHealth, ZombieType type, ref Model modelwalk, ref Model modelatt, ref Model modelhurt, ref Model modeldie, Action<Entity, Entity> attackFunction, Func<Vector3, Vector3, PathFinding.Node> astarGetter)
            : base()
        {
            this.astarGetter = astarGetter;
            this.model = modelwalk;
            this.HealthPoints = health;
            this.MaxHealth = maxHealth;

            this.MaxVelocity = 0.04f;
            this.MaxAcceleration = 0.04f;
            if (type == ZombieType.Boss)
            {
                this.MaxVelocity *= 2;
                this.MaxAcceleration *= 2;
                this.modelRadius *= 2;
            }
            ArriveRadius = 1;
            FleeRadius = 30;
            TimeToTarget = 0.070f;
            RotationTimeToTarget = 0.00025f;
            InterpolationSpeed = 10;
            TargetRotation = 0.02f;
            SlowRotationThreshold = (float)Math.PI;
            SlowRadiusThreshold = (float)Math.PI * 3;
            MaxRotationSpeed = (float)Math.PI / 12;
            MaxRotationAcceleration = (float)Math.PI;

            PosState = EntityPositionState.SteeringWander;
            OrState = EntityOrientationState.Face;
            BehaviouralState = BehaviourState.Wander;

            zombieType = type;
            MeleeAttack = new Weapon(WeaponType.ZombieHands);
            RangedAttack = new Weapon(WeaponType.Vomit);
            if (type == ZombieType.Boss)
            {
                MeleeAttack.FirePower *= 2;
                RangedAttack.FirePower *= 2;
            }
            this.AttackFunction = attackFunction;
            lastAttackTime = 0;

            // Look up our custom skinning information. for walking
            skinningDatawalk = (SkinningData)modelwalk.Tag;

            if (skinningDatawalk == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerwalk = new AnimationPlayer(skinningDatawalk);
            clipwalk = skinningDatawalk.AnimationClips["Take 001"];
            animationPlayerwalk.StartClip(clipwalk);

            // Look up our custom skinning information. for dying
            skinningDatadie = (SkinningData)modeldie.Tag;

            if (skinningDatadie == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerdie = new AnimationPlayer(skinningDatadie);
            clipdie = skinningDatadie.AnimationClips["Take 001"];
            animationPlayerdie.StartClip(clipdie);

            // Look up our custom skinning information. for attacking
            skinningDataattack = (SkinningData)modelatt.Tag;

            if (skinningDataattack == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerattack = new AnimationPlayer(skinningDataattack);
            clipattack = skinningDataattack.AnimationClips["Take 001"];
            animationPlayerattack.StartClip(clipattack);

            // Look up our custom skinning information. for hurting
            skinningDatahurt = (SkinningData)modelhurt.Tag;

            if (skinningDatahurt == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerhurt = new AnimationPlayer(skinningDatahurt);
            cliphurt = skinningDatahurt.AnimationClips["Take 001"];
            animationPlayerhurt.StartClip(cliphurt);
        }
Пример #4
0
        public Zombie(int health, int maxHealth, ZombieType type, ref Model modelwalk, ref Model modelatt, ref Model modelhurt, ref Model modeldie, Action <Entity, Entity> attackFunction, Func <Vector3, Vector3, PathFinding.Node> astarGetter)
            : base()
        {
            this.astarGetter  = astarGetter;
            this.model        = modelwalk;
            this.HealthPoints = health;
            this.MaxHealth    = maxHealth;

            this.MaxVelocity     = 0.04f;
            this.MaxAcceleration = 0.04f;
            if (type == ZombieType.Boss)
            {
                this.MaxVelocity     *= 2;
                this.MaxAcceleration *= 2;
                this.modelRadius     *= 2;
            }
            ArriveRadius            = 1;
            FleeRadius              = 30;
            TimeToTarget            = 0.070f;
            RotationTimeToTarget    = 0.00025f;
            InterpolationSpeed      = 10;
            TargetRotation          = 0.02f;
            SlowRotationThreshold   = (float)Math.PI;
            SlowRadiusThreshold     = (float)Math.PI * 3;
            MaxRotationSpeed        = (float)Math.PI / 12;
            MaxRotationAcceleration = (float)Math.PI;

            PosState         = EntityPositionState.SteeringWander;
            OrState          = EntityOrientationState.Face;
            BehaviouralState = BehaviourState.Wander;

            zombieType   = type;
            MeleeAttack  = new Weapon(WeaponType.ZombieHands);
            RangedAttack = new Weapon(WeaponType.Vomit);
            if (type == ZombieType.Boss)
            {
                MeleeAttack.FirePower  *= 2;
                RangedAttack.FirePower *= 2;
            }
            this.AttackFunction = attackFunction;
            lastAttackTime      = 0;

            // Look up our custom skinning information. for walking
            skinningDatawalk = (SkinningData)modelwalk.Tag;

            if (skinningDatawalk == null)
            {
                throw new InvalidOperationException
                          ("This model does not contain a SkinningData tag.");
            }

            // Create an animation player, and start decoding an animation clip.
            animationPlayerwalk = new AnimationPlayer(skinningDatawalk);
            clipwalk            = skinningDatawalk.AnimationClips["Take 001"];
            animationPlayerwalk.StartClip(clipwalk);


            // Look up our custom skinning information. for dying
            skinningDatadie = (SkinningData)modeldie.Tag;

            if (skinningDatadie == null)
            {
                throw new InvalidOperationException
                          ("This model does not contain a SkinningData tag.");
            }

            // Create an animation player, and start decoding an animation clip.
            animationPlayerdie = new AnimationPlayer(skinningDatadie);
            clipdie            = skinningDatadie.AnimationClips["Take 001"];
            animationPlayerdie.StartClip(clipdie);


            // Look up our custom skinning information. for attacking
            skinningDataattack = (SkinningData)modelatt.Tag;

            if (skinningDataattack == null)
            {
                throw new InvalidOperationException
                          ("This model does not contain a SkinningData tag.");
            }

            // Create an animation player, and start decoding an animation clip.
            animationPlayerattack = new AnimationPlayer(skinningDataattack);
            clipattack            = skinningDataattack.AnimationClips["Take 001"];
            animationPlayerattack.StartClip(clipattack);

            // Look up our custom skinning information. for hurting
            skinningDatahurt = (SkinningData)modelhurt.Tag;

            if (skinningDatahurt == null)
            {
                throw new InvalidOperationException
                          ("This model does not contain a SkinningData tag.");
            }

            // Create an animation player, and start decoding an animation clip.
            animationPlayerhurt = new AnimationPlayer(skinningDatahurt);
            cliphurt            = skinningDatahurt.AnimationClips["Take 001"];
            animationPlayerhurt.StartClip(cliphurt);
        }