Exemplo n.º 1
0
        public static Sprite CreateItem(string key, TeamType team, string region, Vector2 location, ContentManager content, GraphicsDevice graphics)
        {
            Sprite item = null;

            switch (key)
            {
            case ("baseBarrel"):
                item = new BaseBarrel(team, region, location, content, graphics);
                break;

            case ("baseChest"):
                item = new BaseChest(team, region, location, content, graphics);
                break;

            case ("pistolShot"):
                item = new PistolShot(team, region, location, content, graphics);
                break;

            case ("arrow"):
                item = new Arrow(team, region, location, content, graphics);
                break;

            case ("rustyHarpoon"):
                item = new RustyHarpoon(team, region, location, content, graphics);
                break;

            case ("baseCannonBall"):
                item = new BaseCannonBall(team, region, location, content, graphics);
                break;
            }
            return(item);
        }
Exemplo n.º 2
0
        public void Update(KeyboardState kstate, GameTime gameTime, Camera camera)
        {
            timeSinceLastShot     += gameTime.ElapsedGameTime.Milliseconds;
            timeSinceLastExpClean += gameTime.ElapsedGameTime.Milliseconds;

            if (showHealthBar)
            {
                timeShowingHealthBar += gameTime.ElapsedGameTime.Milliseconds;
            }
            if (timeShowingHealthBar > millisecondsToShowHealthBar)
            {
                showHealthBar        = false;
                timeShowingHealthBar = 0;
            }

            foreach (var shot in Shots)
            {
                shot.Update(gameTime);
            }

            if (timeSinceLastExpClean > millisecondsExplosionLasts)
            {
                // remove exploded shots
                for (int i = 0; i < Shots.Count; i++)
                {
                    if (Shots[i].exploded || Shots[i].outOfRange)
                    {
                        Shots.RemoveAt(i);
                    }
                }
                timeSinceLastExpClean = 0;
            }

            if (timeSinceLastShot > millisecondsNewShot && Shots.Count < maxShotsMoving && health > 0)
            {
                Vector2?shotDirection = AIUtility.ChooseTargetVector(teamType, range, GetBoundingBox(), inInteriorId);
                if (shotDirection != null)
                {
                    BaseCannonBall cannonShot = new BaseCannonBall(teamType, regionKey, location, _content, _graphics);
                    cannonShot.SetFireAtDirection(shotDirection.Value, RandomEvents.rand.Next(10, 25), RandomEvents.rand.Next(-100, 100)); // 3rd param is aim offset
                    cannonShot.moving = true;
                    Shots.Add(cannonShot);
                }
                timeSinceLastShot = 0;
            }

            SpatialBounding.SetQuad(GetBase());
        }
Exemplo n.º 3
0
        public void UpdateAIMountShot(GameTime gameTime, Vector2?target)
        {
            timeSinceLastExpClean += gameTime.ElapsedGameTime.Milliseconds;
            // clean shots
            foreach (var shot in Shots)
            {
                shot.Update(gameTime);
            }
            if (timeSinceLastExpClean > millisecondsExplosionLasts)
            {
                // remove exploded shots
                for (int i = 0; i < Shots.Count; i++)
                {
                    if (Shots[i].exploded || Shots[i].outOfRange)
                    {
                        Shots.RemoveAt(i);
                    }
                }
                timeSinceLastExpClean = 0;
            }

            if (target != null)
            {
                Vector2 targetV = target.Value;

                float percentReloaded = timeSinceLastShot / millisecondsNewShot;
                startAimLine = GetBoundingBox().Center.ToVector2();

                aiming = true;
                Vector2 reloadSpot = new Vector2(((1 - percentReloaded) * startAimLine.X + (percentReloaded * targetV.X)), ((1 - percentReloaded) * startAimLine.Y + (percentReloaded * targetV.Y)));

                var lineDistanceFull   = PhysicsUtility.VectorMagnitude(targetV.X, startAimLine.X, targetV.Y, startAimLine.Y);
                var lineDistanceReload = PhysicsUtility.VectorMagnitude(reloadSpot.X, startAimLine.X, reloadSpot.Y, startAimLine.Y);

                // max range
                float   disRatio = shotRange / lineDistanceFull;
                Vector2 maxPos   = new Vector2(((1 - disRatio) * startAimLine.X + (disRatio * targetV.X)), ((1 - disRatio) * startAimLine.Y + (disRatio * targetV.Y)));

                // shot offset from mount
                float shotOffsetRatio = 30 / lineDistanceFull;
                shotOffsetPos = new Vector2(((1 - shotOffsetRatio) * startAimLine.X + (shotOffsetRatio * targetV.X)), ((1 - shotOffsetRatio) * startAimLine.Y + (shotOffsetRatio * targetV.Y)));

                // restrict aiming by shotRange
                if (lineDistanceFull > shotRange)
                {
                    endAimLineFull = maxPos;
                }
                else
                {
                    endAimLineFull = targetV;
                }

                if (lineDistanceReload > lineDistanceFull || lineDistanceReload > shotRange)
                {
                    endAimLineReload = endAimLineFull;
                }
                else
                {
                    endAimLineReload = reloadSpot;
                }

                edgeFull   = endAimLineFull - startAimLine;
                edgeReload = endAimLineReload - startAimLine;
                // rotate the mount
                float angleFull = (float)Math.Atan2(edgeFull.Y, edgeFull.X);
                rotation = angleFull + ((float)Math.PI / 2);


                timeSinceLastShot += gameTime.ElapsedGameTime.Milliseconds;
                if (timeSinceLastShot > millisecondsNewShot)
                {
                    // TODO: just cannon balls for now. Cannon is hard coded to BaseShip animatedSprite AI for now
                    animateShot = true;
                    BaseCannonBall cannonShot = new BaseCannonBall(teamType, regionKey, shotOffsetPos, _content, _graphics);
                    cannonShot.SetFireAtDirection(targetV, RandomEvents.rand.Next(10, 25), RandomEvents.rand.Next(-shotWander, shotWander)); // 3rd param is aim offset for cannon ai
                    cannonShot.moving = true;
                    Shots.Add(cannonShot);
                    timeSinceLastShot = 0;
                }

                if (animateShot)
                {
                    msAnimateShot += gameTime.ElapsedGameTime.Milliseconds;
                    if (msAnimateShot > 70)
                    {
                        currColumnFrame++;
                        msAnimateShot = 0;
                    }
                    if (currColumnFrame >= nColumns)
                    {
                        currColumnFrame = 0;
                        animateShot     = false;
                    }
                }
            }
        }