Sign in to follow this  
shawnre

[XNA] Accounting for those few extra pixels

Recommended Posts

Hello all, I am still working on a 2-d side scroller, tile based game. I have worked out some kinks between sprite collisions and tiles. However, I am still having a slight problem. Currently I take my sprites position, value of the leftthumbsticks x and y multiplied by the sprites speed (which is 3 for now), and assign to temporary position variables. I use the temp variables to look up the Upper Left, Lower Left, Upper Right, and Lower Right cell(tile) values that the sprite may be moving into to check for collision with other objects(world based, like walls, doors, floors). The issue I am having is accounting for the fact that I have a speed value of 3. Let's say I am moving to the right, my X value for the sprite could be a value of 3. If the current position of the sprite, plus the 3 pixel move, indicates a cell that is not -1 the sprite will not move. If you are 3 pixels away, releasing the thumbstick and pressing right again eventually moves you directly against the other object, but it does so in a jerk kind of move. In other words, the next update kind of jerks the sprite to the right to account for the 1-3 pixels that actually still exist (it looks really stupid on screen I must say). My question is how to account for the speed of a sprite to handle a collision that may be about to happen, but still has a few pixels before it happens, to account for the jerk into place that I am seeing? Thanks for any help!

Share this post


Link to post
Share on other sites
I'm not 100% sure what you're doing, but hopefully I understand enough.

You'd typically do all the moves before displaying. You can detect collisions then, and correct the positions as necessary, reverting to the previous position or moving back a little, depending on your desired effect. Making this look good would be a matter of tweaking.

Share this post


Link to post
Share on other sites
It's hard to tell from your question, but I'm assuming what you're doing is something like this:

If Sprite Position < Limit
Move Sprite At Speed of Control Stick Offset
Else
Move Sprite Back To Limit

But if your speed is, say, 20, and your only 5 pixels away from the limit, while you're still technically not at the limit, and can still move, moving at your normal speed will result in moving past the limit, and in the next frame you will be moved back because you are at the limit. This is easily fixed by accounting for the movement speed. In this case we'll say that SpriteX/SpriteY/SpriteWidth/SpriteHeight is the bounding box of the sprite, RectX/RectY/RectWidth/RectHeight is the box you're colliding with, and SpeedX/SpeedY is your movement speed on both axes.

C/C++/C#
//If the sprite is moving left
if (speedx < 0) {
//If the sprite is further away from the box than it's movement speed
if (spritex =< rectx - speedx) {
spritex = spritex + speedx;
} else {
spritex = rectx - spritewidth;
}
//If the sprite is moving right
} else if (speedx > 0) {
//If the sprite is further away from the box than it's movement speed
if (spritex => rectx + rectwidth - speedx) {
spritex = spritex + speedx;
} else {
spritex = rectx + rectwidth;
}
}
//If the sprite is moving up
if (speedy < 0) {
//If the sprite is further away from the box than it's movement speed
if (spritey =< recty - speedy) {
spritey = spritey + speedy;
} else {
spritey = recty - spriteheight;
}
//If the sprite is moving down
} else if (speedx > 0) {
//If the sprite is further away from the box than it's movement speed
if (spritey => recty + rectheight - speedy) {
spritey = spritey + speedy;
} else {
spritey = recty + rectheight;
}
}


Visual Basic
'If the sprite is moving left
If Speed.X < 0 Then
'If the sprite is further away from the box than it's movement speed
If Sprite.X =< Rect.X - Speed.X Then
Sprite.X = Sprite.X + Speed.X
Else
Sprite.X = Rect.X - Sprite.Width
End If
'If the sprite is moving right
ElseIf Speed.X > 0 Then
'If the sprite is further away from the box than it's movement speed
If Sprite.X => Rect.X Rect.Width - Speed.X Then
Sprite.X = Sprite.X + Speed.X
Else
Sprite.X = Rect.X + Rect.Width
End If
End If
'If the sprite is moving up
If Speed.Y < 0 Then
'If the sprite is further away from the box than it's movement speed
If Sprite.Y =< Rect.Y - Speed.Y Then
Sprite.Y = Sprite.Y + Speed.Y
Else
Sprite.Y = Rect.Y - Sprite.Height
End If
'If the sprite is moving down
ElseIf Speed.X > 0 Then
'If the sprite is further away from the box than it's movement speed
If Sprite.Y => Rect.Y Rect.Height - Speed.Y Then
Sprite.Y = Sprite.Y + Speed.Y
Else
Sprite.Y = Rect.Y + Rect.Height
End If
End If

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this