Hey all I'm having some serious trouble with this small game I'm writing. I seem to get no effect on using the gluLookAt.
My goal is to have the camera following the arrow drawn by the Player Class. However I can move the arrow fine, but the camera stays stationary to it and the floor below. (I just threw it in there for debugging) I'll include the necessary code.
WinMain:
Game Engine Class(not much of an engine yet, but working on it)Code:#define WIN32_LEAN_AND_MEAN #define WIN32_EXTRA_LEAN #include <windows.h> #include "Graphics Class.h" #include "Game Engine.h" bool exiting = false; long windowWidth = 800; long windowHeight = 600; long windowBits = 32; bool fullscreen = false; HDC hDC; GameEngine MainEngine; Graphics GraphicsEng(windowWidth, windowHeight); void SetupPixelFormat(HDC hDC) { int pixelFormat; PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size 1, // version PFD_SUPPORT_OPENGL | // OpenGL window PFD_DRAW_TO_WINDOW | // render to window PFD_DOUBLEBUFFER, // support double-buffering PFD_TYPE_RGBA, // color type 32, // prefered color depth 0, 0, 0, 0, 0, 0, // color bits (ignored) 0, // no alpha buffer 0, // alpha bits (ignored) 0, // no accumulation buffer 0, 0, 0, 0, // accum bits (ignored) 16, // depth buffer 0, // no stencil buffer 0, // no auxiliary buffers PFD_MAIN_PLANE, // main layer 0, // reserved 0, 0, 0, // no layer, visible, damage masks }; pixelFormat = ChoosePixelFormat(hDC, &pfd); SetPixelFormat(hDC, pixelFormat, &pfd); } LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HDC hDC; static HGLRC hRC; int height, width; // dispatch messages switch (uMsg) { case WM_CREATE: // window creation hDC = GetDC(hWnd); SetupPixelFormat(hDC); //SetupPalette(); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); MainEngine.hDC = hDC; break; case WM_DESTROY: // window destroy case WM_QUIT: case WM_CLOSE: // windows is closing // deselect rendering context and delete it wglMakeCurrent(hDC, NULL); wglDeleteContext(hRC); // send WM_QUIT to message queue PostQuitMessage(0); break; case WM_SIZE: height = HIWORD(lParam); // retrieve width and height width = LOWORD(lParam); // Resize Window Here GraphicsEng.SetProjection(width, height); break; case WM_ACTIVATEAPP: // activate app break; case WM_PAINT: // paint PAINTSTRUCT ps; BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; case WM_LBUTTONDOWN: // left mouse button break; case WM_RBUTTONDOWN: // right mouse button break; case WM_MOUSEMOVE: // mouse movement break; case WM_LBUTTONUP: // left button release break; case WM_RBUTTONUP: // right button release break; case WM_KEYUP: MainEngine.Keys[wParam] = FALSE; break; case WM_KEYDOWN: MainEngine.Keys[wParam] = TRUE; break; default: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WNDCLASSEX windowClass; // window class HWND hwnd; // window handle MSG msg; // message DWORD dwExStyle; // Window Extended Style DWORD dwStyle; // Window Style RECT windowRect; windowRect.left=(long)0; // Set Left Value To 0 windowRect.right=(long)windowWidth; // Set Right Value To Requested Width windowRect.top=(long)0; // Set Top Value To 0 windowRect.bottom=(long)windowHeight; // Set Bottom Value To Requested Height // fill out the window class structure windowClass.cbSize = sizeof(WNDCLASSEX); windowClass.style = CS_HREDRAW | CS_VREDRAW; windowClass.lpfnWndProc = MainWindowProc; windowClass.cbClsExtra = 0; windowClass.cbWndExtra = 0; windowClass.hInstance = hInstance; windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // default icon windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // default arrow windowClass.hbrBackground = NULL; // don't need background windowClass.lpszMenuName = NULL; // no menu windowClass.lpszClassName = "GLClass"; windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // windows logo small icon // register the windows class if (!RegisterClassEx(&windowClass)) return 0; if (fullscreen) // fullscreen? { DEVMODE dmScreenSettings; // device mode memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); dmScreenSettings.dmSize = sizeof(dmScreenSettings); dmScreenSettings.dmPelsWidth = windowWidth; // screen width dmScreenSettings.dmPelsHeight = windowHeight; // screen height dmScreenSettings.dmBitsPerPel = windowBits; // bits per pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { // setting display mode failed, switch to windowed MessageBox(NULL, "Display mode failed", NULL, MB_OK); fullscreen = FALSE; } } if (fullscreen) // Are We Still In Fullscreen Mode? { dwExStyle=WS_EX_APPWINDOW; // Window Extended Style dwStyle=WS_POPUP; // Windows Style ShowCursor(FALSE); // Hide Mouse Pointer } else { dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style } AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size // class registered, so now create our window hwnd = CreateWindowEx(NULL, // extended style "GLClass", // class name "BOGLGP - Chapter 2 - OpenGL Application", // app name dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, // x,y coordinate windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, // width, height NULL, // handle to parent NULL, // handle to menu hInstance, // application instance NULL); // no extra params hDC = GetDC(hwnd); // check if window creation failed (hwnd would equal NULL) if (!hwnd) return 0; ShowWindow(hwnd, SW_SHOW); // display the window UpdateWindow(hwnd); // update the window // Pre-Gl Processes here GraphicsEng.Init(); MainEngine.Init(); while (!exiting) { // Gl Rendering Goes Here MainEngine.PlayGame(); while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { if (!GetMessage (&msg, NULL, 0, 0)) { exiting = true; break; } TranslateMessage (&msg); DispatchMessage (&msg); } } if (fullscreen) { ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop ShowCursor(TRUE); // Show Mouse Pointer } return (int)msg.wParam; }
The Player and Camera Classes:Code:/** Game Engine .cpp */ #include "Game Engine.h" #include <gl/gl.h> #include <cmath> #include <windows.h> #define piover180 .0174 void GameEngine::HandleKeys() { if (Keys[VK_UP]) { Players[0]->Move( -(float)sin(Players[0]->XAngle * piover180) * .15f, 0.0f, -(float)cos(Players[0]->XAngle * piover180) * .15f); } if (Keys[VK_DOWN]) { Players[0]->Move( (float)sin(Players[0]->XAngle * piover180) * .15f, 0.0f, (float)cos(Players[0]->XAngle * piover180) * .15f); } if (Keys[VK_LEFT]) { Players[0]->SetFaceAngle(Players[0]->XAngle + 2.0f, 0.0f); } if (Keys[VK_RIGHT]) { Players[0]->SetFaceAngle(Players[0]->XAngle - 2.0f, 0.0f); } if (Keys[VK_ESCAPE]) { PostQuitMessage(0); } if (Keys[VK_SPACE]) { } } void GameEngine::Init() { MainCamera = new Camera(); MainCamera->pPlayer = Players[0]; } void GameEngine::PlayGame() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); MainCamera->pPlayer = Players[0]; HandleKeys(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(.5f, .7f, .23f); glBegin(GL_QUADS); glVertex3f(-20.0f, -3.0f, 20.0f); glVertex3f(-20.0f, -3.0f, -20.0f); glVertex3f(20.0f, -3.0f, -20.0f); glVertex3f(20.0f, -3.0f, 20.0f); glEnd(); Players[0]->DrawArrow(); SwapBuffers(hDC); }
Code:/** CPP Implementation for Player.h */ #include "Player.h" #include <gl/gl.h> void Player::PositionAt(float x, float y, float z) { X = x; Y = y; Z = z; } void Player::Move(float xinc, float yinc, float zinc) { X += xinc; Y += yinc; Z += zinc; } void Player::SetFaceAngle(float xAngle, float yAngle) { XAngle = xAngle; YAngle = yAngle; } void Player::DrawArrow() { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(X, Y, Z); glRotatef(XAngle, 0.0f, 1.0f, 0.0f); glRotatef(YAngle, 0.0f, 1.0f, 0.0f); glPushMatrix(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(.321f, .741f, .176f, .75f); glBegin(GL_TRIANGLES); //Top Part of Arrow glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f -.5f, 0.0f, 0.0f + .5f); glVertex3f(0.0f + .5f, 0.0f, 0.0f + .5f); //Lower Part of Arrow glVertex3f(0.0f, 0.0f - .3f, 0.0f); glVertex3f(0.0f -.5f, 0.0f - .3f, 0.0f + .5f); glVertex3f(0.0f + .5f, 0.0f - .3f, 0.0f + .5f); glEnd(); glBegin(GL_QUADS); //Sides of the Triangle Portion glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f -.5f, 0.0f, 0.0f + .5f); glVertex3f(0.0f -.5f, 0.0f - .3f, 0.0f + .5f); glVertex3f(0.0f, 0.0f - .3f, 0.0f); //2nd Side glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f + .5f, 0.0f, 0.0f + .5f); glVertex3f(0.0f + .5f, 0.0f - .3f, 0.0f + .5f); glVertex3f(0.0f, 0.0f - .3f, 0.0f); //3rd Side glVertex3f(0.0f + .5f, 0.0f, 0.0f + .5f); glVertex3f(0.0f -.5f, 0.0f, 0.0f + .5f); glVertex3f(0.0f -.5f, 0.0f - .3f, 0.0f + .5f); glVertex3f(0.0f + .5f, 0.0f - .3f, 0.0f + .5f); glEnd(); glBegin(GL_QUADS); //Quadrilateral end glVertex3f(0.0f - .2f, 0.0f, 0.0f + .5f); glVertex3f(0.0f - .2f, 0.0f, 0.0f + 1.2f); glVertex3f(0.0f + .2f, 0.0f, 0.0f + 1.2f); glVertex3f(0.0f + .2f, 0.0f, 0.0f + .5f); //Lower Quad glVertex3f(0.0f - .2f, 0.0f - .3f, 0.0f + .5f); glVertex3f(0.0f - .2f, 0.0f - .3f, 0.0f + 1.2f); glVertex3f(0.0f + .2f, 0.0f - .3f, 0.0f + 1.2f); glVertex3f(0.0f + .2f, 0.0f - .3f, 0.0f + .5f); //Left Side glVertex3f(0.0f - .2f, 0.0f, 0.0f + .5f); glVertex3f(0.0f - .2f, 0.0f, 0.0f + 1.2f); glVertex3f(0.0f - .2f, 0.0f - .3f, 0.0f + 1.2f); glVertex3f(0.0f - .2f, 0.0f - .3f, 0.0f + .5f); //Right Side glVertex3f(0.0f + .2f, 0.0f, 0.0f + 1.2f); glVertex3f(0.0f + .2f, 0.0f, 0.0f + .5f); glVertex3f(0.0f + .2f, 0.0f - .3f, 0.0f + .5f); glVertex3f(0.0f + .2f, 0.0f - .3f, 0.0f + 1.2f); //Back Side glVertex3f(0.0f - .2f, 0.0f - .3f, 0.0f + 1.2f); glVertex3f(0.0f + .2f, 0.0f - .3f, 0.0f + 1.2f); glVertex3f(0.0f + .2f, 0.0f, 0.0f + 1.2f); glVertex3f(0.0f - .2f, 0.0f, 0.0f + 1.2f); glEnd(); glColor3f(.458f, .925f, .176f); glLineWidth(7.0f); glBegin(GL_LINES); //Lines for Increased coolness glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f -.45f, 0.0f, 0.0f + .45f); glVertex3f(0.0f -.45f, 0.0f, 0.0f + .45f); glVertex3f(0.0f + .45f, 0.0f, 0.0f + .45f); glVertex3f(0.0f + .45f, 0.0f, 0.0f + .45f); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0f - .1f, 0.0f, 0.0f + .6f); glVertex3f(0.0f - .1f, 0.0f, 0.0f + 1.1f); glVertex3f(0.0f + .1f, 0.0f, 0.0f + .6f); glVertex3f(0.0f + .1f, 0.0f, 0.0f + 1.1f); glEnd(); glPopMatrix(); }Please offer any suggestions.Code:/** Camera Class */ #include <gl/glu.h> #include "Camera.h" #include <windows.h> void Camera::Update() { //MessageBox(NULL, "CALLED", "DFGDL", MB_OK); gluLookAt(pPlayer->X, pPlayer->Y + 1.0f, pPlayer->Z + 2.0f, pPlayer->X, pPlayer->Y + 1.0f, pPlayer->Z, pPlayer->X, pPlayer->Y + 5.0f, pPlayer->Z + 2.0f); // Place Camera behind Player's updating position, and Aim the Camera towards the player. }



LinkBack URL
About LinkBacks


