Esempio n. 1
0
        public void Update(Level level, GamePadState newPad, Mortimer player, float mx, float my, bool isChangingX, bool isChangingY)
        {
            Tile[,] tiles = level.tiles;
            bool hitATileWallX = false;
            bool hitATileWallY = false;

            for (int i = 0; i < tiles.GetLength(0); i++)
            {
                for (int j = 0; j < tiles.GetLength(1); j++)
                {
                    Rectangle leftRect   = new Rectangle((int)(rectangle.X), (int)(rectangle.Y + 5), 5, rectangle.Height - 10);
                    Rectangle rightRect  = new Rectangle((int)(rectangle.X + rectangle.Width - 5), (int)(rectangle.Y + 5), 5, rectangle.Height - 10);
                    Rectangle topRect    = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y), rectangle.Width - 10, 5);
                    Rectangle bottomRect = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y + rectangle.Height - 5), rectangle.Width - 10, 5);
                    Rectangle tileRect   = new Rectangle((int)(tiles[i, j].x), (int)(tiles[i, j].y), Tile.TILE_SIZE, Tile.TILE_SIZE);
                    if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(leftRect) || tileRect.Intersects(rightRect)))
                    {
                        hitATileWallX = true;
                    }
                    if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(topRect) || tileRect.Intersects(bottomRect)))
                    {
                        hitATileWallY = true;
                    }
                }
            }


            if (hitATileWallX)
            {
                speed.X *= -1;
            }
            if (hitATileWallY)
            {
                speed.Y *= -1;
            }

            if (switchDirectionTime == 0)
            {
                switchDirectionTime = rand.Next(30, 400);
                int x = rand.Next(1, 101);
                int y = rand.Next(1, 101);
                if (x > 50)
                {
                    speed.X *= -1;
                }
                if (y > 50)
                {
                    speed.Y *= -1;
                }

                speed.X = (speed.X / Math.Abs(speed.X)) * ((int)(rand.NextDouble() * 3) + 1);
                speed.Y = (speed.Y / Math.Abs(speed.Y)) * ((int)(rand.NextDouble() * 3) + 1);
            }
            else
            {
                switchDirectionTime--;
            }

            fireTimer++;
            if (fireTimer % 10 == 0)
            {
                double multiplier = fireTimer / 600.0 * 3;
                bulletHeading = (float)(bulletHeading + rand.NextDouble() * multiplier) % 360;
                bullets.Add(new Bullet(new Rectangle(rectangle.X + 64, rectangle.Y + 64, 16, 16), bulletTex, 3, bulletHeading));
            }

            // if (rectangle.Right >= screenW)
            //     speed.X *= -1;
            // else if (rectangle.Left <= 0)
            //     speed.X *= -1; ;
            //
            // if (rectangle.Y >= screenH - rectangle.Height)
            //     speed.Y *= -1;
            // else if (rectangle.Y <= 0)
            //     speed.Y *= -1;

            rectangle.X += (int)speed.X;
            rectangle.Y += (int)speed.Y;
            for (var i = 0; i < bullets.Count; i++)
            {
                // bullets[i].Update();
                // bullets[i].relationalBulletUpdate(mx, my, isChangingX, isChangingY);
                if (bullets[i].rectangle.Intersects(player.rect))
                {
                    bullets[i] = null;
                }
            }
            while (bullets.Contains(null))
            {
                bullets.Remove(null);
            }

            for (int i = bullets.Count - 1; i >= 0; i--)
            {
                bool collided = false;
                for (int x = 0; x < tiles.GetLength(0) & !collided; x++)
                {
                    for (int y = 0; y < tiles.GetLength(1) && !collided; y++)
                    {
                        Rectangle tileRect = new Rectangle((int)(tiles[x, y].x), (int)(tiles[x, y].y), Tile.TILE_SIZE, Tile.TILE_SIZE);
                        if (tiles[x, y].tileState == TileState.IMPASSABLE && tileRect.Intersects(bullets[i].rectangle))
                        {
                            collided = true;
                        }
                    }
                }

                if (collided)
                {
                    bullets[i] = null;
                }
                else
                {
                    bullets[i].Update();
                    bullets[i].relationalBulletUpdate(mx, my, isChangingX, isChangingY);
                }
            }
            while (bullets.Contains(null))
            {
                bullets.Remove(null);
            }

            if (catTimer == 420)
            {
                catTimer = 0;
                for (int i = 0; i < 4; i++)
                {
                    level.enemies.Add(new Cat(level.game,
                                              new Vector2(rectangle.X + rand.Next(-60, 60), rectangle.Y + rand.Next(-60, 60))));
                }
            }

            catTimer++;
        }
Esempio n. 2
0
        public void Update(Level level, GamePadState newPad, Mortimer player, double mx, double my, bool isChangingX, bool isChangingY)
        {
            Tile[,] tiles = level.tiles;
            bool hitATileWallX = false;
            bool hitATileWallY = false;

            for (int i = 0; i < tiles.GetLength(0); i++)
            {
                for (int j = 0; j < tiles.GetLength(1); j++)
                {
                    Rectangle leftRect   = new Rectangle((int)(rectangle.X), (int)(rectangle.Y + 5), 5, rectangle.Height - 10);
                    Rectangle rightRect  = new Rectangle((int)(rectangle.X + rectangle.Width - 5), (int)(rectangle.Y + 5), 5, rectangle.Height - 10);
                    Rectangle topRect    = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y), rectangle.Width - 10, 5);
                    Rectangle bottomRect = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y + rectangle.Height - 5), rectangle.Width - 10, 5);
                    Rectangle tileRect   = new Rectangle((int)(tiles[i, j].x), (int)(tiles[i, j].y), Tile.TILE_SIZE, Tile.TILE_SIZE);
                    if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(leftRect) || tileRect.Intersects(rightRect)))
                    {
                        hitATileWallX = true;
                    }
                    if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(topRect) || tileRect.Intersects(bottomRect)))
                    {
                        hitATileWallY = true;
                    }
                }
            }


            if (hitATileWallX)
            {
                speed.X *= -1;
            }
            if (hitATileWallY)
            {
                speed.Y *= -1;
            }

            if (switchDirectionTime == 0)
            {
                switchDirectionTime = rand.Next(30, 400);
                int x = rand.Next(1, 101);
                int y = rand.Next(1, 101);
                if (x > 50)
                {
                    speed.X *= -1;
                }
                if (y > 50)
                {
                    speed.Y *= -1;
                }

                speed.X = (speed.X / Math.Abs(speed.X)) * ((int)(rand.NextDouble() * 3) + 1);
                speed.Y = (speed.Y / Math.Abs(speed.Y)) * ((int)(rand.NextDouble() * 3) + 1);
            }
            else
            {
                switchDirectionTime--;
            }

            if (fireTimer <= 0 && isOnScreen())
            {
                float angle = (float)Math.Atan2(rectangle.Y - level.player.rect.Y, level.player.rect.X - rectangle.X);
                bullets.Add(new Bullet(new Rectangle(rectangle.X + rectangle.Width / 2, rectangle.Y + rectangle.Height / 2, 8, 8), bulletTex, 4, angle));
                fireTimer = 120;
            }

            for (int i = 0; i < bullets.Count; i++)
            {
                bullets[i].Update();
                bullets[i].relationalBulletUpdate((float)mx, (float)my, isChangingX, isChangingY);
            }
            while (bullets.Contains(null))
            {
                bullets.Remove(null);
            }

            fireTimer--;

            // if (rectangle.Right >= screenW)
            //     speed.X *= -1;
            // else if (rectangle.Left <= 0)
            //     speed.X *= -1; ;
            //
            // if (rectangle.Y >= screenH - rectangle.Height)
            //     speed.Y *= -1;
            // else if (rectangle.Y <= 0)
            //     speed.Y *= -1;

            rectangle.X += (int)speed.X;
            rectangle.Y += (int)speed.Y;
        }