2
\$\begingroup\$

So I've made my collision boxes visual (Draw method) and I saw that there were some problems with the boxes and I fixed them (x, y, length, width). They are now big enough.

This is the collision box inside my constructor for my TileSprite class:

public TileSprite(Texture2D collisionImage, Texture2D textureImage, Vector2 position, Point frameSize, Point currentFrame)
    : base (collisionImage, textureImage, position, frameSize, currentFrame)
{
    // Collision box (Rectangle)
    bCollisionRect = new Rectangle((int)position.X, (int)position.Y, frameSize.X * 2, frameSize.Y * 2);
}

And this is the collision box for my PlayerMovement class. This collision box is written in the update method so it updates when the player moves:

collisionRect = new Rectangle((int)position.X + 4, (int)position.Y + 14, frameSize.X + 10, frameSize.Y + 20);

TileSprite and PlayerMovement have an abstract class in common, named Sprite.I have all my virtual methods for the sprites in Sprite and this is my Collision method:

public virtual void Collision (GameTime gameTime)
{
    // collisionRect is from PlayerMovement and bCollisionRect from TileSprite
    if(collisionRect.Intersects(bCollisionRect))
    {
        Console.WriteLine("collision");
    }
}

But my problem is, that there is no console output when the two collision boxes intersect. (Yes, I call the collision method.)

\$\endgroup\$
3
\$\begingroup\$

Instead of updating your object's Rectangle variable each frame, you should instead create a read-only Property for it:

public Rectangle Rectangle
{
    get { 
        return new Rectangle((int)position.X, (int)position.Y, frameSize.X * 2, frameSize.Y * 2); 
    }
}

Your player update method should look like:

public void Update(TileSprite[] TilesToCheck)
{
    //Move player
    ...

    //Check for collision
    Collision(TilesToCheck);
}

And then your Player's Collision function:

public virtual void Collision (TileSprite[] TilesToCheck)
{
    for (int i = 0; i < TilesToCheck.Length; i++)
    {
        if(Rectangle.Intersects(TilesToCheck[i].Rectangle))
        {
            Console.WriteLine("collision");
        }
    }
}
| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ Thanks Jon! I will try this as soon as possible and will give you the feedback. One question though: my GraphicsDevice is still returning null (in my previous question). I updated the question a bit, could you maybe look at it again? \$\endgroup\$ – Jelle Nov 8 '15 at 14:47
  • \$\begingroup\$ I managed to do this by changing one line of code but I will update my code with your code! (and I will delete the DrawableGameComponent) \$\endgroup\$ – Jelle Nov 8 '15 at 22:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.