PDA

View Full Version : Problem with OGL output



Krons
06-02-2010, 05:23 PM
I am currently in the process of creating a Pong clone which i plan on building onto to a point at which it becomes a rpg (buy bigger paddels, spells and what not. My issue is that i am unable to get 2 quads to show at the same time. I have tried everything i could think of including rewriting what little code i have atm from scratch. here is my code:


#include <windows.h>
#include <gl/gl.h>
#include "main.h"

static float f = 0.5;

void PongStart()
{
GAME.P1X = 0;
GAME.P1Y = 0;
GAME.CPUY = 0;
GAME.CPUX = 15;
GAME.Bx = (640/2);
GAME.By = (480/2);
GAME.rot = 4;
}

void DrawScene()
{
glBegin(GL_QUADS);
glVertex2f(GAME.P1X + f, GAME.P1Y + f);
glVertex2f(GAME.P1X + f, GAME.P1Y + f + 150);
glVertex2f(GAME.P1X + f + 15, GAME.P1Y+f+150);
glVertex2f(GAME.P1X + f + 15, GAME.P1Y+f);
glColor3f(0.0, 0.0, 1.0);
glEnd();
glBegin(GL_QUADS);
glVertex2f(GAME.CPUX + f, GAME.CPUY + f);
glVertex2f(GAME.CPUX + f, GAME.CPUY + f + 150);
glVertex2f(GAME.CPUX + f + 15, GAME.CPUY+f+150);
glVertex2f(GAME.CPUX+f+15, GAME.CPUY+f);
glColor3f(1.0, 0.0, 0.0);
glEnd();
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
WNDCLASS wc;
HWND hWnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL bQuit = FALSE;
float theta = 0.0f;

wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "PONG";
RegisterClass (&amp;wc);

hWnd = CreateWindow (
"PONG", "Pong Game",
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0, 0, 640, 480,
NULL, NULL, hInstance, NULL);

EnableOpenGL (hWnd, &amp;hDC, &amp;hRC);

glMatrixMode(GL_PROJECTION);
glOrtho(0, 640, 480, 0, 0, 1);
glDisable(GL_DEPTH_TEST);
glEnable(GL_LINE_SMOOTH | GL_POINT_SMOOTH);
while (!bQuit)
{
if (PeekMessage (&amp;msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage (&amp;msg);
DispatchMessage (&amp;msg);
}
}
else
{
glClearColor (1.0f, 1.0f, 1.0f, 0.0f);
glClear (GL_COLOR_BUFFER_BIT);

glPushMatrix ();
DrawScene();
glPopMatrix ();
SwapBuffers (hDC);
theta += 1.0f;
Sleep (1);
}
}

DisableOpenGL (hWnd, hDC, hRC);

DestroyWindow (hWnd);

return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{

switch (message)
{
case WM_CREATE:
return 0;
case WM_CLOSE:
PostQuitMessage (0);
return 0;

case WM_DESTROY:
return 0;

case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
return 0;
}
return 0;

default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
}

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;

*hDC = GetDC (hWnd);

ZeroMemory (&amp;pfd, sizeof (pfd));
pfd.nSize = sizeof (pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat (*hDC, &amp;pfd);
SetPixelFormat (*hDC, iFormat, &amp;pfd);

*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );

}

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
wglMakeCurrent (NULL, NULL);
wglDeleteContext (hRC);
ReleaseDC (hWnd, hDC);
}

Krons
06-02-2010, 05:24 PM
if it helps, im compiling using Mingw32 (Dev-C++)

Dan Bartlett
06-02-2010, 06:08 PM
One thing I notice is that you don't switch back to the modelview matrix before drawing your scene. It should perhaps look more like:



...
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // just in case this bit of code gets moved somewhere the projection matrix <> Identity matrix (eg. a resize event)
glOrtho(0, 640, 480, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); // if desired, might be done elsewhere
...

Krons
06-03-2010, 01:21 AM
placing this extra coding (thank you anyway) within my initialization causes the same thing to happen(no changes) and placing it within the loop causes an oddly shaped something(lots and lots of side(couldnt be bothered counting))

also i just relised i type in syntax XD

Krons
06-26-2010, 09:01 PM
well i found my problem
for future ref to me and others, i will write it here:

First: OGL uses floating point numbers whereas i was using integers so technically, when i was writing that i wanted the rects an say 100 px from left, it was actually 100 screens away(100*640(way out off viewing range XD))