Пересечение двух прямоугольников - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь увидеть, пересекаются ли два прямоугольника двух отдельных объектов. К сожалению, это не работает. Вот код:

Игрок

class Player
{
    public static Texture2D texture;

    public int xPos = 320;
    public int yPos = 530;
    public Rectangle rectangle;

    public void Draw(SpriteBatch spriteBatch)
    {
        rectangle = new Rectangle(xPos, yPos, 75, 59);
        spriteBatch.Draw(texture, rectangle, Color.White);
    }

    public void Update(GameTime gameTime)
    {
        KeyboardState keyboard = Keyboard.GetState();

        if (keyboard.IsKeyDown(Keys.Left))
        {
            xPos -= 3;
        }
        if (keyboard.IsKeyDown(Keys.Right))
        {
            xPos += 3;
        }
    }
}

Asteriod

public class Asteroid : gameObject
{
    int xPos = 0;
    int yPos = -10;

    public override void Draw(SpriteBatch spriteBatch)
    {
        rectangle = new Rectangle(xPos, yPos, 32, 32);
        spriteBatch.Draw(texture, rectangle,Color.White);
    }

    public override void Update(GameTime gameTime)
    {
        yPos++;
        rectangle = new Rectangle(xPos, yPos, 32, 32);    
    }

    public Asteroid(int value)
    {
        xPos = value;
    }
}

геймобжекты

public abstract class gameObject
{
    public static Texture2D texture;
    public Rectangle rectangle;

    public abstract void Draw(SpriteBatch spriteBatch);
    public abstract void Update(GameTime gameTime);
}

Игра

public class Game1 : Microsoft.Xna.Framework.Game
{        
    List<gameObject> objectList = new List<gameObject>();
    Random rand = new Random(1);
    Asteroid asteroid;

    int asteroidCount = 0;
    Player player = new Player();

    protected override void Update(GameTime gameTime)
    {
        scorevalue++;

        player.Update(gameTime);

        if (rand.Next(0, 8) == 2 && asteroidCount < 50)
        {
            for (int i = 0; i < 5; i++)
            {
                asteroid = new Asteroid(rand.Next(32,screenWidth));
                objectList.Add(asteroid);
                asteroidCount++; 
            }
        }

        foreach (Asteroid asteroid in objectList)
        {
            asteroid.Update(gameTime);
        }

        for (int i = 0; i < objectList.Count(); i++)
        {
            if (objectList[i].rectangle.Intersects(player.rectangle))
            {
                objectList.Remove(asteroid);
            }
        }

        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        // TODO: Add your update logic here

        base.Update(gameTime);
    }


    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here
         spriteBatch.Begin();
         spriteBatch.DrawString(font, "Score: " + scorevalue, new Vector2(5, 5), Color.White);
         foreach (Asteroid asteroid in objectList)
         {
             asteroid.Draw(spriteBatch);
         }
         player.Draw(spriteBatch);
         spriteBatch.End();

         base.Draw(gameTime);
    }
}

Вся помощь очень ценится. Когда я пытаюсь перебрать и проверить пересечения, это не работает. Спасибо.

Ответы [ 2 ]

1 голос
/ 22 января 2012

Вы пробовали это?

Rectangle rect = Rectangle.Intersect(rectangle1, rectangle2);
if (rect.IsEmpty)
{

}
0 голосов
/ 22 января 2012

Похоже, вы забыли обновить rectangle в своем классе игрока.

public void Update(GameTime gameTime)
{
    KeyboardState keyboard = Keyboard.GetState();

    if (keyboard.IsKeyDown(Keys.Left))
    {
        xPos -= 3;
    }
    if (keyboard.IsKeyDown(Keys.Right))
    {
        xPos += 3;
    }

    rectangle.X = xPos;
}
...