简体   繁体   中英

XNA Collisions with multiple rectangles in list

I'm making a remake of one really old game.. There are lines (worms) and you can control them with arrow keys.. Every player has got one line.. And the problem is, when I try to make collision with current position of my Rectangle with one of the previous Rectangles in list it's not working.. It would be awesome if you can help me.. THANK YOU VERY MUCH..

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Texture2D dotTexture;
    Rectangle dotRectangle;
    Vector2 dotCenter;
    Vector2 dotPosition;
    float dotRotation;
    Vector2 dotVelocity;
    float dotSpeed = 1.5f;

    bool smrt1 = false;

    Texture2D previousDotTexture;
    List<Vector2> previousDotsList = new List<Vector2>();
    List<Rectangle> previousRecsList = new List<Rectangle>();

    Random random = new Random();

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        graphics.PreferredBackBufferHeight = 800;
        graphics.PreferredBackBufferWidth = 800;
    }

    protected override void Initialize()
    {            
        base.Initialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);

        dotTexture = Content.Load<Texture2D>("dot2");
        dotPosition = new Vector2(random.Next(200, 600),random.Next(200, 600));

        previousDotTexture = Content.Load<Texture2D>("dot1");

    }

    protected override void UnloadContent()
    {

    }

    protected override void Update(GameTime gameTime)
    {
        if (Keyboard.GetState().IsKeyDown(Keys.Escape))
            this.Exit();

        if (Keyboard.GetState().IsKeyDown(Keys.Left))
            dotRotation += 0.1f;

        if (Keyboard.GetState().IsKeyDown(Keys.Right))
            dotRotation -= 0.1f;

        if (Keyboard.GetState().IsKeyDown(Keys.Space) && smrt1==true)
        {
            Thread.Sleep(500);
            dotPosition = new Vector2(random.Next(200, 600), random.Next(200, 600));
            previousDotsList.Clear();
            dotSpeed = 1.5f;
            smrt1 = false;
        }

        dotRectangle = new Rectangle((int)dotPosition.X, (int)dotPosition.Y, dotTexture.Width, dotTexture.Height);
        dotPosition = dotVelocity + dotPosition;
        dotCenter = new Vector2(dotRectangle.Width / 2, dotRectangle.Height / 2);

        dotVelocity.X = (float)Math.Sin(dotRotation) * dotSpeed;
        dotVelocity.Y = (float)Math.Cos(dotRotation) * dotSpeed;


        Vector2 previousDotsPos = dotPosition;
        Rectangle previousDotsRecs = new Rectangle((int)dotCenter.X, (int)dotCenter.Y, 2, 2);
        previousDotsList.Add(previousDotsPos);
        previousRecsList.Add(previousDotsRecs);

        CheckCollision();

        base.Update(gameTime);
    }

    private void CheckCollision()
    {
        foreach (Rectangle previousDotsRecs in previousRecsList)
        {
            if (dotRectangle.Intersects(previousDotsRecs))
            {
                smrt1 = true;
                dotSpeed = 0f;
            }
        }
    }


    private void DrawDots()
    {
        foreach (Vector2 previousDotsPos in previousDotsList)
            spriteBatch.Draw(previousDotTexture, previousDotsPos, Color.White);
    }

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

        spriteBatch.Begin();

        DrawDots();
        spriteBatch.Draw(dotTexture, dotPosition, null, Color.White, dotRotation, dotCenter, 1f, SpriteEffects.None, 0);

        spriteBatch.End();

        base.Draw(gameTime);
    }
}

You won't ever get a collision in my opinion, because everytime the game updates (30 times per second) you're creating a new rectangle, and that's not good. So you'll have to get moving rectangles, increment their x's and y's as it's moving, and then check the Intersection.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM