简体   繁体   English

列表中具有多个矩形的XNA碰撞

[英]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. 在我看来,您永远不会碰到冲突,因为每次游戏更新(每秒30次)时,您都在创建一个新的矩形,这不好。 So you'll have to get moving rectangles, increment their x's and y's as it's moving, and then check the Intersection. 因此,您必须获取移动的矩形,在移动时增加其x和y,然后检查相交。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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