Skip to main content
GameDev.net gamedev.net
🔒 Locked

Simple collision detection

Started by bamboon Jun 24, 2010 at 3:58 AM 1 replies 650+ views
Original Post
bamboon
bamboon
Im 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.
Ive 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 Ive set up to detect collisions dosent 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 ?

#include
#include
#include
#include
#ifdef __APPLE__
#include
#else
#include
#endif

#include


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<
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++;
}
//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;
}
Burnhard
Burnhard
What's this?

double coldect(double t2xm, double t1xm, double t1ym, double t2ym);

It should be:

coldect(t1xm, t1ym, t2xm, t2ym);

Also, coldect itself should take references, otherwise the variable you want to change won't actually get modified outside of the coldect function (they're created on the stack).

double coldect(double& t1xm, double& t1ym, double& t2xm, double& t2ym)
{
...
}

I don't know if that will make it work, but it's a start.
jeroenb
jeroenb
As Burnhard suggested, you should pass the parameters by reference to the coldect function.

Currently a copy of your values are used in that function and those copies are modified. Alas, after the function returns (you should also return a value or make it a void method) the changes to those local variables are lost.
Crafter 2D: the open source 2D game framework ?Github: https://github.com/crafter2d/crafter2d
Twitter: [twitter]crafter_2d[/twitter]

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.