Simple collision detection
I’m trying to have a cube, only moving in 2 dimensions for now, to be able to detect a collision with another cube and respond by baking off a step.
I’ve managed to do this with my manual controls but now I want to have the cubes move by themselves by controlling the translation variable at each update.
My problem is that the function I’ve set up to detect collisions dose’nt seem to be affecting my translation variable , in this case t1ym, from my output I can see that there equal and should be responding to my if condition but its not.
Does anyone see the problem here ?
Code:
#include <windows.h>
#include <iomanip>
#include <vector>
#include <iostream>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
using namespace std;
static int slices = 16;
static int stacks = 16;
//used to build objects
static double x1=-1.0,x2=1.0,x3=1.0,x4=-1.0;
double y1=-2,y2=-2,y3=0,y4=0;
//varible used to translate my objects
static double t1ym=0; //y axis movement
static double t2ym=0;
static double t1xm=0; //x axis movement
static double t2xm=0;
/* GLUT callback Handlers */
//update
void update(int value)
{
double coldect(double t2xm, double t1xm, double t1ym, double t2ym);
cout<<"t1ym t2ym t1xm t2zm \n";
cout<<t1ym<<" "<<t2ym<<" "<<t1xm<<" "<<t2xm<<"\n";
glutPostRedisplay();
glutTimerFunc(3000, update, 0);
t1ym--;
}
//colision function
static double coldect(double t2xm, double t1xm, double t1ym, double t2ym)
{
t1ym--;
//top of red colides with other cube
if(t1ym==t2ym-4&&t1xm==t2xm or t1ym==t2ym-4&&t1xm==t2xm+1 or t1ym==t2ym-4&&t1xm==t2xm-1)
{
cout<<"ii";
t1ym--;
t1ym--;
}
//bottom of red colides with other cube
if(t1ym==t2ym&&t1xm==t2xm or t1ym==t2ym&&t1xm==t2xm+1 or t1ym==t2ym&&t1xm==t2xm-1)
{
cout<<"hh"<<"\n"<<t1ym;
t1ym++;
t1ym++;
}
//right of red
if(t1xm==t2xm-2&&t1ym==t2ym-2 or t1xm==t2xm-2&&t1ym==t2ym-3 or t1xm==t2xm-2&&t1ym==t2ym-1)
{
cout<<"ii";
t1xm--;
t1xm--;
}
//left of red
if(t1xm==t2xm+2&&t1ym==t2ym-2 or t1xm==t2xm+2&&t1ym==t2ym-3 or t1xm==t2xm+2&&t1ym==t2ym-1)
{
t1xm++;
t1xm++;
}
}
static void resize(int width, int height)
{
const float ar = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}
static void display(void)
{
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(1,0,0);
glPushMatrix();
glTranslated(t1xm,t1ym,0);
//create cube 1 1
glBegin(GL_QUADS);
glVertex3d(x1,y1,-10);
glVertex3d(x2,y2,-10);
glVertex3d(x3,y3,-10);
glVertex3d(x4,y4,-10);
glEnd();
glPopMatrix();
glColor3d(0,1,0);
glPushMatrix();
glTranslated(t2xm,t2ym,0);
//create cube 2 2
glBegin(GL_QUADS);
glVertex3d(x1,-4,-10);
glVertex3d(x2,-4,-10);
glVertex3d(x3,-2,-10);
glVertex3d(x4,-2,-10);
glEnd();
glPopMatrix();
glutSwapBuffers();
}
//create manual controls
static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 27 :
case 'q':
exit(0);
break;
case '+':
slices++;
stacks++;
break;
case '-':
if (slices>3 && stacks>3)
{
slices--;
stacks--;
}
break;
case 's':
if(t1ym==t2ym-4&&t1xm==t2xm or t1ym==t2ym-4&&t1xm==t2xm+1 or t1ym==t2ym-4&&t1xm==t2xm-1)
{
t1ym--;
t1ym--;
}
t1ym++;
break;
case 'd':
if(t1ym==t2ym&&t1xm==t2xm or t1ym==t2ym&&t1xm==t2xm+1 or t1ym==t2ym&&t1xm==t2xm-1)
{
t1ym++;
t1ym++;
}
t1ym--;
break;
case 'w':
if(t1xm==t2xm-2&&t1ym==t2ym-2 or t1xm==t2xm-2&&t1ym==t2ym-3 or t1xm==t2xm-2&&t1ym==t2ym-1)
{
t1xm--;
t1xm--;
}
t1xm++;
break;
case 'e':
if(t1xm==t2xm+2&&t1ym==t2ym-2 or t1xm==t2xm+2&&t1ym==t2ym-3 or t1xm==t2xm+2&&t1ym==t2ym-1)
{
t1xm++;
t1xm++;
}
t1xm--;
break;
}
glutPostRedisplay();
}
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
int main(int argc, char *argv[])
{
glutTimerFunc(1000,update,0);
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutKeyboardFunc(key);
//declare my colision detec function
coldect(t1ym,t1xm,t2ym,t2xm);
glClearColor(1,1,1,1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}