示例#1
0
 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;
                }
            }
        }
示例#3
0
        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;
        }
示例#4
0
        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;
            }
        }