Skip to content

Instantly share code, notes, and snippets.

@CaptainHandyman
Last active August 22, 2020 22:11
Show Gist options
  • Save CaptainHandyman/af6d2554a67dc0977b36e01f960c681c to your computer and use it in GitHub Desktop.
Save CaptainHandyman/af6d2554a67dc0977b36e01f960c681c to your computer and use it in GitHub Desktop.
SDL2 + OpenGL - Collision detection script
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
float MOVEMENT_SPEED=0.08;
const Uint8 *key=SDL_GetKeyboardState(NULL);
SDL_Window *window;
SDL_Event event;
SDL_GLContext glContext;
struct WindowData{
int WIDTH=800, HEIGHT=800;
int POS_X=SDL_WINDOWPOS_CENTERED, POS_Y=SDL_WINDOWPOS_CENTERED;
const char *TITLE="TEST";
int FLAG=SDL_WINDOW_OPENGL;
SDL_Color FILLCOLOR={0, 0, 0, 1};
} WindowData;
struct CharacterData{
int WIDTH=100, HEIGHT=100;
float POS_X=WindowData.WIDTH/2-WIDTH/2, POS_Y=WindowData.HEIGHT/2-HEIGHT/2;
SDL_Color FILLCOLOR={255, 0, 0, 255};
} CharacterData;
struct ObjectData{
int WIDTH=100, HEIGHT=100;
float POS_X=100, POS_Y=100;
SDL_Color FILLCOLOR={0, 0, 255, 255};
} ObjectData;
bool getCollisionX(float x, float y){
if(CharacterData.POS_X>=ObjectData.POS_X-(CharacterData.WIDTH-x)&&
CharacterData.POS_X<=ObjectData.POS_X+(ObjectData.WIDTH-y))
return true;
else
return false;
}
bool getCollisionY(float x, float y){
if(CharacterData.POS_Y>=ObjectData.POS_Y-(CharacterData.HEIGHT-x)&&
CharacterData.POS_Y<=ObjectData.POS_Y+(ObjectData.HEIGHT-y))
return true;
else
return false;
}
bool collisionWasDetected(float x, float y, float _x, float _y){
if(getCollisionY(_x, _y)&&getCollisionX(x, y))
return true;
else
return false;
}
void controller(){
if(key[SDL_SCANCODE_D]){
if(collisionWasDetected(0, ObjectData.WIDTH, 0.5, 0.5)){
MOVEMENT_SPEED=0.04;
if(ObjectData.POS_X<=WindowData.WIDTH-ObjectData.WIDTH)
ObjectData.POS_X+=0.04;
}
else
MOVEMENT_SPEED=0.08;
if(!collisionWasDetected(0, ObjectData.WIDTH, 0.5, 0.5)){
if(CharacterData.POS_X<=WindowData.WIDTH-CharacterData.WIDTH)
CharacterData.POS_X+=MOVEMENT_SPEED;
}
else{
if(CharacterData.POS_X<=WindowData.WIDTH-(CharacterData.WIDTH+ObjectData.WIDTH))
CharacterData.POS_X+=MOVEMENT_SPEED;
}
}
if(key[SDL_SCANCODE_A]){
if(collisionWasDetected(ObjectData.WIDTH, 0, 0.5, 0.5)){
MOVEMENT_SPEED=0.04;
if(ObjectData.POS_X>=0)
ObjectData.POS_X-=0.04;
}
else
MOVEMENT_SPEED=0.08;
if(!collisionWasDetected(ObjectData.WIDTH, 0, 0.5, 0.5)){
if(CharacterData.POS_X>=0)
CharacterData.POS_X-=MOVEMENT_SPEED;
}
else{
if(CharacterData.POS_X>=ObjectData.WIDTH)
CharacterData.POS_X-=MOVEMENT_SPEED;
}
}
if(key[SDL_SCANCODE_W]){
if(collisionWasDetected(0.5, 0.5, ObjectData.HEIGHT, 0)){
MOVEMENT_SPEED=0.04;
if(ObjectData.POS_Y>=0)
ObjectData.POS_Y-=0.04;
}
else
MOVEMENT_SPEED=0.08;
if(!collisionWasDetected(0.5, 0.5, ObjectData.HEIGHT, 0)){
if(CharacterData.POS_Y>=0)
CharacterData.POS_Y-=MOVEMENT_SPEED;
}
else{
if(CharacterData.POS_Y>=ObjectData.HEIGHT)
CharacterData.POS_Y-=MOVEMENT_SPEED;
}
}
if(key[SDL_SCANCODE_S]){
if(collisionWasDetected(0.5, 0.5, 0, ObjectData.HEIGHT)){
MOVEMENT_SPEED=0.04;
if(ObjectData.POS_Y<=WindowData.HEIGHT-ObjectData.HEIGHT)
ObjectData.POS_Y+=0.04;
}
else
MOVEMENT_SPEED=0.08;
if(!collisionWasDetected(0.5, 0.5, 0, ObjectData.HEIGHT)){
if(CharacterData.POS_Y<=WindowData.HEIGHT-CharacterData.HEIGHT)
CharacterData.POS_Y+=MOVEMENT_SPEED;
}
else{
if(CharacterData.POS_Y<=WindowData.HEIGHT-(CharacterData.HEIGHT+ObjectData.HEIGHT))
CharacterData.POS_Y+=MOVEMENT_SPEED;
}
}
}
int main(){
window=SDL_CreateWindow(WindowData.TITLE, WindowData.POS_X, WindowData.POS_Y, WindowData.WIDTH, WindowData.HEIGHT, WindowData.FLAG);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
glContext=SDL_GL_CreateContext(window);
SDL_GL_SetSwapInterval(SDL_FALSE);
while(window!=NULL){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
window=NULL;
break;
}
}
glClearColor(WindowData.FILLCOLOR.r,
WindowData.FILLCOLOR.g,
WindowData.FILLCOLOR.b,
WindowData.FILLCOLOR.a);
glClear(GL_COLOR_BUFFER_BIT);
controller();
glViewport(0, 0, WindowData.WIDTH, WindowData.HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, WindowData.WIDTH, WindowData.HEIGHT, 0, -10, 10);
glPushMatrix();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTranslatef(CharacterData.POS_X, CharacterData.POS_Y, 0);
glBegin(GL_QUADS);
glColor4ub(CharacterData.FILLCOLOR.r, CharacterData.FILLCOLOR.g,
CharacterData.FILLCOLOR.b, CharacterData.FILLCOLOR.a);
glVertex2f(0, 0);
glVertex2f(CharacterData.WIDTH, 0);
glVertex2f(CharacterData.WIDTH, CharacterData.HEIGHT);
glVertex2f(0, CharacterData.HEIGHT);
glEnd();
glDisable(GL_BLEND);
glPopMatrix();
glPushMatrix();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTranslatef(ObjectData.POS_X, ObjectData.POS_Y, 0);
glBegin(GL_QUADS);
glColor4ub(ObjectData.FILLCOLOR.r, ObjectData.FILLCOLOR.g,
ObjectData.FILLCOLOR.b, ObjectData.FILLCOLOR.a);
glVertex2f(0, 0);
glVertex2f(ObjectData.WIDTH, 0);
glVertex2f(ObjectData.WIDTH, ObjectData.HEIGHT);
glVertex2f(0, ObjectData.HEIGHT);
glEnd();
glDisable(GL_BLEND);
glPopMatrix();
if(key[SDL_SCANCODE_ESCAPE])
window=NULL;
SDL_GL_SwapWindow(window);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment