Part of the Khronos Group

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 3 of 3

Thread: OpenGL 2.0 C++ 2D game

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Junior Member Newbie
    Join Date
    Jul 2017

    Question OpenGL 2.0 C++ 2D game

    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:

    Code cpp:
    glTranslatef(XActor, YActor, 0.0);
    glColor3f(0.678, 1.000, 0.184);
    glVertex2f(-19, -20);
    glVertex2f(-19, -17.75);
    glVertex2f(-16.75, -17.75);
    glVertex2f(-16.75, -20);
    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
    glColor3f(1.0, 0.0, 1.0); //AABBs are not colliding
    glVertex2f(xMovingMin, yMovingMin);
    glVertex2f(xMovingMax, yMovingMin);
    glVertex2f(xMovingMax, yMovingMax);
    glVertex2f(xMovingMin, yMovingMax);

    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:

    Code cpp:
    //Platform 1
    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);
    //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:

    Code cpp:
    //platform 2
    glColor3f(0.686, 0.933, 0.933);
    glVertex2f(-20, -12.5);
    glVertex2f(-20, -12.0);
    glVertex2f(-10, -12.0);
    glVertex2f(-10, -12.5);

    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:

    Code cpp:
    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:

    Code cpp:
    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.
    Last edited by Dark Photon; 07-28-2017 at 06:55 PM.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts