I am using an old version of openGL with the opengl32 and GLu32 library. I am creating a 2D game that is very very simple. I am using win32 to manage the window and key inputs etc. Everything at the moment is inside the main as I do not want to complicate things at this moment, plus my c++ skills are very rusty. So far I have an actor(player) square that I can move, and a platform for that character to interact with. Am I right in thinking that in order to add gravity I should impliment collision resolution/detection first? My actor is denoted by:
//actor
glPushMatrix();
glTranslatef(XActor, YActor, 0.0);
glColor3f(0.678, 1.000, 0.184);
glBegin(GL_POLYGON);
glVertex2f(-19, -20);
glVertex2f(-19, -17.75);
glVertex2f(-16.75, -17.75);
glVertex2f(-16.75, -20);
glEnd();
glPopMatrix();
float xMovingMin = -19 + XActor;
float xMovingMax = -16.75 + XActor;
float yMovingMin = -20 + YActor;
float yMovingMax = -17.75 + YActor;
//test for overlap
if (xMovingMin < xStaticMax &&
xMovingMax > xStaticMin &&
yMovingMin < yStaticMax &&
yMovingMax > yStaticMin)
{
glColor3f(1.0, 1.0, 0.0); //AABBs are colliding
}
else
glColor3f(1.0, 0.0, 1.0); //AABBs are not colliding
glLineWidth(3.0);
glBegin(GL_LINE_LOOP);
glVertex2f(xMovingMin, yMovingMin);
glVertex2f(xMovingMax, yMovingMin);
glVertex2f(xMovingMax, yMovingMax);
glVertex2f(xMovingMin, yMovingMax);
glEnd();
glLineWidth(1.0);
The code above creates a polygon and then checks if the coordinates overlap with the platform. The Line loop code simply draws a box around my object which changes colour when I detect the platform. The platform is denoted by:
//Platform 1
glPushMatrix();
glBegin(GL_POLYGON);
glColor3f(0.686, 0.933, 0.933);
glVertex2f(-14.0, -17.5);
glVertex2f(-14.0, -17.0);
glVertex2f(-4.0, -17.0);
glVertex2f(-4.0, -17.5);
glEnd();
glPopMatrix();
//extents of the static square - it isn't transformed
float xStaticMin = -14.0;
float xStaticMax = -4.0;
float yStaticMin = -17.5;
float yStaticMax = -17.0;
The first problem I have is that when I add a second platform, say:
//platform 2
glPushMatrix();
glBegin(GL_POLYGON);
glColor3f(0.686, 0.933, 0.933);
glVertex2f(-20, -12.5);
glVertex2f(-20, -12.0);
glVertex2f(-10, -12.0);
glVertex2f(-10, -12.5);
glEnd();
glPopMatrix();
I do not know how to factor in this platform with the first collision detection conditions. I thought of maybe adding in a ‘XstaticMin2’ and so on to the original ‘&’ conditions but that did not work. I think I tried creating a new set of ‘&’ conditions, copying and pasting the first collision detection but swapping out the coordinates for the new plaform but I don’t think that worked either. I am also stuck on how to impliment collision resolution too, which is what i’m mainly asking for help with. Once I can do collision resolution for one platform I am sure I can figure out the rest! I am trying to keep it as basic and primative as possible. The addition of gravity would also be helpful if someone could tell me how to impliment such a thing(I know it is just a constant downward velocity but again my programming skills are inept.
My second and final problem is getting the scene/camera to move with my character and making sure my character cannot go off screen(i.e detecting the screen paramaters) For the movement of the scene I read somewhere that the translation used to translate my player (glTranslatef(XActor, YActor, 0.0); can be place on top of the model view matrix. I am quite sure how to impliment that but if it is correct I would appreciate being shown. I have also placed my transformation above all my objects so that everything moves with my player, giving the illusion of a camera but instead it moves everything with my player so platforms follow my character around instead of staying where they are. So far my display is coded such as:
void reshape(int width, int height) // Resize the OpenGL window
{
screenWidth = width; screenHeight = height; // to ensure the mouse coordinates match
// we will use these values to set the coordinate system
glViewport(0, 0, width, height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
gluOrtho2D(-20, 20, -20, 20); // set the coordinate system for the window
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}
void init()
{
glClearColor(0.970, 0.970, 1.000, 0.0); //sets the clear colour to yellow
//glClear(GL_COLOR_BUFFER_BIT) in the display function
//will clear the buffer to this colour.
}
The input keys that move the player are denoted by:
void processKeys()
{
if (keys[VK_LEFT])
{
XActor -= 0.005f;
}
if (keys[VK_RIGHT])
{
XActor += 0.005f;
}
if (keys[VK_UP])
{
YActor += 0.005f;
}
if (keys[VK_DOWN])
{
YActor -= 0.005f;
}
}
A final note is that I am also unsure on how to rescale the window without the aspect ration distorting. I think this is a simple fix but I am unsure.
I completing this game without the use of external physics libraries, so any external libraries are not helpful, however I am open to changing to the freeGlut toolkit if nescessary.
Thankyou in advance to anyone that offers help.