public Monster(int monsterMaxHealth, AbilityType abilityType) { Velocity = new Vector(GetRandomVDelta() * 40, GetRandomVDelta() * 40); Size = new Size(Width, Height); Id = _id++; Health = MaxHealth = GetMonsterMaxHealth(monsterMaxHealth, abilityType); Speed = MaxSpeed = GetMaxSpeed(abilityType); Generation = 1; CreateAbilities(); AbilityType = abilityType; Ability = AbilitiesDictionary[AbilityType]; SetOnDeathAbilities(); SetOnHitAbilities(); SetMovementTypes(); SetMonsterSize(); }
private void MoveTank(IGameTank gameTank, TankUpdate tankUpdate, Tank tank) { var gameState = _game.GameState; if (tankUpdate.MovementTarget != null) { gameTank.MovementTarget = tankUpdate.MovementTarget; var V = new Vector(tankUpdate.MovementTarget.X - tank.X, tankUpdate.MovementTarget.Y - tank.Y); var angle = Math.Atan2(V.Y, V.X); var speed = Math.Min(tank.Speed, Math.Sqrt(V.X * V.X + V.Y * V.Y)); var xMovement = speed * Math.Cos(angle); var yMovement = speed * Math.Sin(angle); if (_game.IsTankInBounds(tank, tank.X + xMovement, tank.Y, gameState)) { ((Location)tank.Location).X += xMovement; } else { V.X /= 2; } if (_game.IsTankInBounds(tank, tank.X, tank.Y + yMovement, gameState)) { ((Location)tank.Location).Y += yMovement; } else { V.Y /= 2; } } }
private Vector GeneratePull(IEnumerable<IEntity> targets) { var pull = new Vector(); foreach (var target in targets) { var xComponent = target.Center.X - Center.X; var yComponent = target.Center.Y - Center.Y; var distanceSquared = xComponent * xComponent + yComponent * yComponent; var angle = Math.Atan2(yComponent, xComponent); var magnitude = _gravityConstant / distanceSquared; if (target is IGravityEntity) { magnitude *= ((GravityEntity)target).Strength * 1000 / Health; } pull += new Vector(Math.Cos(angle) * magnitude, Math.Sin(angle) * magnitude); } return pull; }
private void DoActualMovement(Vector pull, IGameState gameState) { if (Velocity.Total > 200) { Velocity.Total = 200; } var randomComponent = new Vector(GetRandomVDelta(), GetRandomVDelta()); pull += randomComponent; Velocity += pull; var angle = Math.Atan2(Velocity.Y, Velocity.X); var speed = Math.Min(Speed, Math.Sqrt(Velocity.X * Velocity.X + Velocity.Y * Velocity.Y)); var xMovement = speed * Math.Cos(angle); var yMovement = speed * Math.Sin(angle); if (CanMove(X + xMovement, Y, gameState)) { ((Location)Location).X += xMovement; } else { Velocity.X /= 2; } if (CanMove(X, Y + yMovement, gameState)) { ((Location)Location).Y += yMovement; } else { Velocity.Y /= 2; } }