public override void Update(GameTime gameTime, TeeEngine engine) { Hero player = (Hero)engine.GetEntity("Player"); Vector2 target; if (CoinState == State.Spawning) { target = SpawnTarget; float distance = Vector2.Distance(Pos, SpawnTarget); if (distance < 2.5) { CoinState = State.Active; Drawables.SetGroupProperty("Body", "Offset", Vector2.Zero); } } else { target = player.Pos; } if (IsOnScreen) { float COIN_MOVE_SPEED = 5000; float TERMINAL_VELOCITY = 5; // Find the distance between the player and this coin. float distanceSquared = Vector2.DistanceSquared(Pos, target); float speed = COIN_MOVE_SPEED / distanceSquared; // Mangitude of velocity. speed = Math.Min(speed, TERMINAL_VELOCITY); if (speed > 0.5) { // Calculate the angle between the player and the coin. double angle = Math.Atan2( target.Y - this.Pos.Y, target.X - this.Pos.X ); this.Pos.X += (float)(Math.Cos(angle) * speed); // x component. this.Pos.Y += (float)(Math.Sin(angle) * speed); // y component. // Check to see if coin can be considered collected. if (Entity.IntersectsWith(this, "Shadow", player, "Shadow", gameTime)) { CoinSound.Play(0.05f, 0.0f, 0.0f); player.Gold += this.CoinValue; engine.RemoveEntity(this); } } } }
public override void Update(GameTime gameTime, TeeEngine engine) { // Get the Hero player for interaction purposes. Hero player = (Hero)engine.GetEntity("Player"); Vector2 prevPos = Pos; // Check if this Bat has died. if (HP <= 0) { this.Opacity -= 0.02f; this.Drawables.ResetState(CurrentDrawableState, gameTime); if (this.Opacity < 0) engine.RemoveEntity(this); } else { // ATTACKING LOGIC. if (_attackStance == AttackStance.Attacking) { this.Pos.X -= (float) (Math.Cos(_attackAngle) * _attackSpeed); this.Pos.Y -= (float) (Math.Sin(_attackAngle) * _attackSpeed); this._attackHeight.Y += 30.0f / ATTACK_COUNTER_LIMIT; this.Drawables.SetGroupProperty("Body", "Offset", _attackHeight); if (Entity.IntersectsWith(this, "Shadow", player, "Shadow", gameTime)) player.HP -= 3; if (_attackCounter++ == ATTACK_COUNTER_LIMIT) _attackStance = AttackStance.NotAttacking; } // ATTACK PREPERATION LOGIC. else if (_attackStance == AttackStance.Preparing) { _attackHeight.Y -= 2; if (_attackHeight.Y < -40) { _attackHeight.Y = -40; _attackAngle = Math.Atan2( this.Pos.Y - player.Pos.Y, this.Pos.X - player.Pos.X ); _attackStance = AttackStance.Attacking; _attackCounter = 0; } Drawables.SetGroupProperty("Body", "Offset", _attackHeight); } // NON-ATTACKING LOGIC. PATROL AND APPROACH. else if (_attackStance == AttackStance.NotAttacking) { double distance = Vector2.Distance(player.Pos, this.Pos); if (distance < AGRO_DISTANCE) { // Move towards the player for an attack move. double angle = Math.Atan2( player.Pos.Y - this.Pos.Y, player.Pos.X - this.Pos.X ); // Approach Function. double moveValue; if (distance < ATTACK_DISTANCE) { _attackStance = AttackStance.Preparing; moveValue = 0; } else moveValue = _moveSpeed; Pos.X += (float)(Math.Cos(angle) * moveValue); Pos.Y += (float)(Math.Sin(angle) * moveValue); } else { // Perform a standard patrol action. Pos.X += (float)(Math.Cos(gameTime.TotalGameTime.TotalSeconds - _randomModifier * 90) * 2); } } // Determine the animation based on the change in position. if (Math.Abs(prevPos.X - Pos.X) > Math.Abs(prevPos.Y - Pos.Y)) { if (prevPos.X < Pos.X) this.CurrentDrawableState = "Right"; if (prevPos.X > Pos.X) this.CurrentDrawableState = "Left"; } else { if (prevPos.Y < Pos.Y) this.CurrentDrawableState = "Down"; if (prevPos.Y > Pos.Y) this.CurrentDrawableState = "Up"; } } }
public override void Update(GameTime gameTime, TeeEngine engine) { if (this.HP > 0) { if (_hitColor != Color.White) { _hitPercentage += 0.06f; _hitColor = ColorExtensions.Transition(Color.Red, Color.White, _hitPercentage, false); Drawables.SetGroupProperty("Body", "Color", _hitColor); } AggressiveBatAI(gameTime, engine); base.Update(gameTime, engine); } else { this.Opacity -= 0.02f; this.Drawables.ResetState(CurrentDrawableState, gameTime); if (this.Opacity < 0) engine.RemoveEntity(this); } }
public override void Update(GameTime gameTime, TeeEngine engine) { if (Drawables.IsStateFinished("standard", gameTime)) engine.RemoveEntity(this); if(Owner != null) this.Pos = CalculatePosition(); }
public override void Update(GameTime gameTime, TeeEngine engine) { if (IsOnScreen) { float COIN_MOVE_SPEED = 5000; float TERMINAL_VELOCITY = 5; Hero player = (Hero)engine.GetEntity("Player"); // Find the distance between the player and this coin. float distanceSquared = Vector2.DistanceSquared(Pos, player.Pos); float speed = COIN_MOVE_SPEED / distanceSquared; // Mangitude of velocity. speed = Math.Min(speed, TERMINAL_VELOCITY); if (speed > 0.5) { // Calculate the angle between the player and the coin. double angle = Math.Atan2( player.Pos.Y - this.Pos.Y, player.Pos.X - this.Pos.X ); this.Pos.X += (float)(Math.Cos(angle) * speed); // x component. this.Pos.Y += (float)(Math.Sin(angle) * speed); // y component. // Check to see if coin can be considered collected. if (Entity.IntersectsWith(this, "Shadow", player, "Shadow", gameTime)) { Random random = new Random(); _coinSfx[random.Next(_coinSfx.Length)].Play(0.5f, 0.0f, 0.0f); player.Coins += this.CoinValue; engine.RemoveEntity(this); } } } base.Update(gameTime, engine); }