//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; } } }
//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); }
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); }