简体   繁体   中英

XNA 4.0 2d collision detection

I have this program with a small tank and a black square. The tank is supposed to respond to user input and stop when it touches the tank. However, after the window appears(containing both the box and the tank) i have no user input. When i press one of the arrow keys, the tank doesn't move at all.

So here are just a few of the more important examples from my code.

public class TopDownShooter : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    private Texture2D tank, blackSquare;
    private KeyboardState state;
    private float angle1 = 0;
    private float angle2 = 0;
    private float xLocation, yLocation;
    Vector2 location1 = new Vector2(900, 400), origin1;
    Vector2 location2 = new Vector2(400, 400), origin2;
    Rectangle playerRectangle, obstacleRectangle;



    /// <summary>
    /// Allows the game to run logic such as updating the world,
    /// checking for collisions, gathering input, and playing audio.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (Keyboard.GetState().IsKeyDown(Keys.Escape))
            this.Exit();
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();
        playerRectangle = Move(playerRectangle);

        base.Update(gameTime);
    }


    private Boolean IsNotCollision(Rectangle rectangle1, Rectangle rectangle2)
    {
        if (rectangle1.Intersects(rectangle2)) return true;
        else return false;
    }


    /// <summary>
    /// Sets the velocity of the targeted object based on user keyboard input
    /// </summary>
    private Rectangle Move(Rectangle rectangle)
    {
        state = Keyboard.GetState();
        xLocation = rectangle.X;
        yLocation = rectangle.Y;

        if (IsNotCollision(obstacleRectangle, playerRectangle))
        {
            if (state.IsKeyDown(Keys.Left)) rectangle.X += -4;
            if (state.IsKeyDown(Keys.Right)) rectangle.X += 4;
            if (state.IsKeyDown(Keys.Up)) rectangle.Y += -4;
            if (state.IsKeyDown(Keys.Down)) rectangle.Y += 4;
        }
        return rectangle;
    }



    /// <summary>
    /// This is called when the game should draw itself.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();

        playerRectangle = new Rectangle(0, 0, tank.Width, tank.Height);
        origin1 = new Vector2(tank.Width / 2, tank.Height);
        obstacleRectangle = new Rectangle(0, 0, blackSquare.Width, blackSquare.Height);
        origin2 = new Vector2(blackSquare.Width / 2, blackSquare.Height);

        spriteBatch.Draw(tank, location1, playerRectangle, Color.White, angle1, origin1, 1.0f, SpriteEffects.None, 1);
        spriteBatch.Draw(blackSquare, location2, obstacleRectangle, Color.White, angle2, origin2, 1.0f, SpriteEffects.None, 1); 

        spriteBatch.End();

        base.Draw(gameTime);
    }

EDIT:

Actually.. you don't ever seem to update location1 ...

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