Jump to content
  • Advertisement


This topic is now archived and is closed to further replies.


2-D Collision detection!

This topic is 6173 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I know this might have already been made, but I really need it bad. I started, about a month ago, a game called OpenSS (Open-Side-Scroller), and I''m pretty much started. I''m at a point where I need one important thing : Collision detection! I''m not looking for a complex one, since OpenSS will be used for old-skool side scrollers, just like SMB3 on the Nes. So, all the physics are "done", it jumps (but doesn''t lands), accelerates on the X-Axis, but there''s NO collision detection! The way the game works is like this : There''s a bg layer (will be EZ to do) There''s a tile grid (where the brick blocks, ? Blocks, floor and the like) are located There''s a "sprite layer", where all sprites (char, allies (pals over the net), enemies, etc) will go So I first get the tiles in which the char is, and then I need to check if there''s a collision. I want to look at my code, here it is : (da sprite struct starts here) struct SPRITE_STRUCT { int SizeX; int SizeY; int TileTL; /* [-V989] In the next four lines, the vars are used to check if there is a collision */ int TileTR; /* [-V989] TL is for Top left, BR if for bottom right, and so on... */ int TileBL; int TileBR; int XDirection; int YDirection; int AnimFrame; int MaxFrames; /* [-V989] Will be something like "GetMaxFrames()" */ CHAR SubType; /* [-V989] ex Fire Mario, Super Mario, etc */ FLOAT fPosX; FLOAT fPosY; FLOAT fVelX; FLOAT fVelY; }; (da physics start here) VOID UpdateSprite( SPRITE_STRUCT* pSprite, FLOAT fTimeDelta ) { /* [-V989] Since, for the X axis, right is positive and left is negative... Hard to explain =:0( , but just try to think about it... */ pSprite->XDirection = KeyRight-KeyLeft; pSprite->YDirection = KeyDown-KeyUp; /* [-V989] Calculate the X momentum */ float MaxSpeed = 200; float AccelSpeed = 1; float BrakeSpeed = 6; float SlowDownSpeed = 3; float daifrule; /* [-V989] It uses an simple math rule, -*- and +*+ always give +, while the others give - */ if(pSprite->fVelX!=0) daifrule = pSprite->XDirection * pSprite->fVelX; else daifrule = pSprite->XDirection * pSprite->fVelX+1; /* [-V989] "fVelX+1" is there to make sure it''s not the velocity who makes the result a 0 */ if((KeyRight || KeyLeft)) { if(daifrule<0) /* [-V989] if they are not in the same way, it will result as a - */ pSprite->fVelX+=(pSprite->XDirection * (BrakeSpeed * (fTimeDelta * 100))); if(daifrule>0) /* [-V989] if they are in the same way, it will be a + */ pSprite->fVelX+=(pSprite->XDirection * (AccelSpeed * (fTimeDelta * 100))); } if(!KeyRight && !KeyLeft) /* [-V989] No key is pressed, slow down... */ { if(pSprite->fVelX > 0) pSprite->fVelX-=SlowDownSpeed * (fTimeDelta * 100); else if(pSprite->fVelX < 0) pSprite->fVelX+=SlowDownSpeed * fTimeDelta * 100; } /* [-V989] Make sure they are in a certain speed range */ if(pSprite->fVelX < 1 && pSprite->fVelX > 0) pSprite->fVelX = 0; if(pSprite->fVelX > -1 && pSprite->fVelX < 0) pSprite->fVelX = 0; if(pSprite->fVelX > MaxSpeed) pSprite->fVelX = MaxSpeed; if(pSprite->fVelX < -MaxSpeed) pSprite->fVelX = -MaxSpeed; /* [-V989] Calculate the Y momentum. It only uses basic physics, and might be made better someday, if needed... */ const int InitSpeed = 200; const float GravAccel = -9.8; /* [-V989] The earth is 9.8 , the moon is 1.6 */ if(KeyUp && pSprite->fVelY == 0) pSprite->fVelY = -InitSpeed; else if(KeyUp && pSprite->fVelY < 0) pSprite->fVelY -= ((GravAccel * fTimeDelta * 100) / 2); else if ((!KeyUp && pSprite->fVelY < 0) || (pSprite->fVelY > 0)) pSprite->fVelY -= (GravAccel * fTimeDelta * 100); /* [-V989] Temporary Debugging-related function, to reset the important vars that are being made...*/ if(KeySpace) { pSprite->fVelY = 0; pSprite->fVelX = 0; pSprite->fPosX = 320; pSprite->fPosY = 240; } /* [-V989] Basic Collision detection */ /* [-V989] Check if the sprite is within the screen boundaries */ if(pSprite->fPosY > SCREEN_HEIGHT - (int) TileDiam) { pSprite->fPosY = SCREEN_HEIGHT - (int) TileDiam; pSprite->fVelY = 0; KeyUp = 0; } /* [-V989] Check if the sprite is overlapping a tile, and if it is, then get "out" of the tile */ (physics code will be here) /* [-V989] Update the sprite(s) position(s) after checking if they are not overlapping a OBJ */ int checkall=1; if(checkall) pSprite->fPosX += pSprite->fVelX * fTimeDelta; if(checkall) pSprite->fPosY += pSprite->fVelY * fTimeDelta; /* [-V989] Will be used for the anims, might be implemented soon... */ // pSprite->MaxFrames=2; /* [-V989] "=2" will be replaced by something like "=GetMaxFrames(state,...) */ // Animcntr+=fTimeDelta; // if(Animcntr>1.000) Animcntr-=1.000; // for(int i = 1; i < pSprite->MaxFrames; i++) // { // if((Animcntr/i)>(1/pSprite->MaxFrames)) pSprite->AnimFrame = i; // } } (end of my code bits!) Sorry if it''s a long read, but I put it here so that you can see how it works... If you need help to read my code, just ask me, and I will explain it the best I can! =:0) - ViNcE989, founder and coder of OpenSS

Share this post

Link to post
Share on other sites

Programming a sprite library myself.

I built the collision detection algos around
this article by John Amato:


It explains everything from rectangular detection to
Sprite on Sprite pixel level detection.

I however used BOOL bitmasks, and even the pixel level
detectors are fairly quick.


Share this post

Link to post
Share on other sites

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!