Last active
August 22, 2020 22:11
-
-
Save CaptainHandyman/af6d2554a67dc0977b36e01f960c681c to your computer and use it in GitHub Desktop.
SDL2 + OpenGL - Collision detection script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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