public ShockBall(Vector2 position, Vector2 size, float directionAngle, Animation movingAnimation, Animation blowAnimation, IMapObject master, ISound blowSound) : base(position, size, directionAngle) { this.movingAnimation = movingAnimation; this.blowAnimation = blowAnimation; this.master = master; this.blowSound = blowSound; state = ShockBallState.Moving; movingAnimation.Reset(); blowAnimation.Reset(); }
public override void OnWorldUpdate(Scene scene, float elapsedMilliseconds) { base.OnWorldUpdate(scene, elapsedMilliseconds); if (state == ShockBallState.Blow && CurrentAnimation.IsOver) { scene.RemoveObject(this); return; } if (state == ShockBallState.Blow) { return; } var xRayUnit = MathF.Cos(DirectionAngle); var yRayUnit = MathF.Sin(DirectionAngle); var dx = xRayUnit * MoveSpeed * elapsedMilliseconds; var dy = yRayUnit * MoveSpeed * elapsedMilliseconds; var newPosition = Position + new Vector2(dx, dy); var testX = (int)newPosition.X; var testY = (int)newPosition.Y; var hit = !scene.Map.InBound(testY, testX) || scene.Map.At(testY, testX).Type != MapCellType.Empty; foreach (var obj in scene.Objects.Append(scene.Player)) { if (obj is Bullet || obj is Arrow || obj == master) { continue; } if (!CanDamage(obj)) { continue; } obj.OnShoot(scene, Damage); hit = true; } if (hit) { state = ShockBallState.Blow; blowSound.Play(0); return; } Position = newPosition; }