#include #ifndef Player_H #define Player_H struct Loc2d { float X; float Y; }; struct color { float R; float G; float B; }; struct Corner2d { Loc2d XY; color RGB; }; //Holds triangle data struct TriangleData { float Angle; Loc2d DisXY; Corner2d A; Corner2d B; Corner2d C; void Draw() { glRotatef ( Angle, A.XY.X + B.XY.X + C.XY.X , A.XY.Y + B.XY.Y + C.XY.X , 0.0f); glBegin (GL_TRIANGLES); glColor3f (A.RGB.R , A.RGB.G, A.RGB.B); glVertex2f ( A.XY.X + DisXY.X, A.XY.Y + DisXY.Y); glColor3f (B.RGB.R , B.RGB.G, B.RGB.B); glVertex2f ( B.XY.X + DisXY.X, B.XY.Y + DisXY.Y); glColor3f (C.RGB.R , C.RGB.G, C.RGB.B); glVertex2f ( C.XY.X + DisXY.X, C.XY.Y + DisXY.Y); glEnd (); } }; struct SpaceShip { TriangleData Triangle; int TurningSpeed; float MovingSpeed; void Move() { if ( GetAsyncKeyState(VK_UP)) { Triangle.DisXY.X += MovingSpeed * sin( Triangle.Angle/(180/M_PI)); Triangle.DisXY.Y += MovingSpeed * cos( Triangle.Angle/(180/M_PI)); } if ( GetAsyncKeyState(VK_DOWN)) { Triangle.DisXY.X -= MovingSpeed * sin( Triangle.Angle/(180/M_PI)); Triangle.DisXY.Y -= MovingSpeed * cos( Triangle.Angle/(180/M_PI)); } if ( GetAsyncKeyState(VK_LEFT)) { Triangle.Angle += TurningSpeed; } if ( GetAsyncKeyState(VK_RIGHT)) { Triangle.Angle -= TurningSpeed; } } }; #endif /************* MAIN.cpp *************/ #include #include #include #include "Player.h" /************************** * Function Declarations * **************************/ 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); void EnableSDL (); /************************** * WinMain * **************************/ 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; /* register window class */ 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 = "GLSample"; RegisterClass (&wc); /* create main window */ hWnd = CreateWindow ("GLSample","MirFly",WS_CAPTION|WS_POPUPWINDOW|WS_VISIBLE,64,64,600,600,NULL,NULL,hInstance,NULL); /* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC); /*Declaring Moving object*/ SpaceShip Player; Player.Triangle.Angle = 0; Player.Triangle.DisXY.X = 0; Player.Triangle.DisXY.Y = 0; Player.Triangle.A.RGB.R = 0.9f; Player.Triangle.A.RGB.G = 0.0f; Player.Triangle.A.RGB.B = 0.0f; Player.Triangle.B.RGB.R = 0.1f; Player.Triangle.B.RGB.G = 0.0f; Player.Triangle.B.RGB.B = 0.0f; Player.Triangle.C.RGB.R = 0.1f; Player.Triangle.C.RGB.G = 0.0f; Player.Triangle.C.RGB.B = 0.0f; Player.Triangle.A.XY.X = 0.0f; Player.Triangle.A.XY.Y = 0.0433f; Player.Triangle.B.XY.X = 0.05f; Player.Triangle.B.XY.Y = -0.04375f; Player.Triangle.C.XY.X = -0.05f; Player.Triangle.C.XY.Y = -0.04375f; Player.TurningSpeed = 3; Player.MovingSpeed = 0.01f; /* program main loop */ while (!bQuit) { /* check for messages */ if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; } else { TranslateMessage (&msg); DispatchMessage (&msg); } } else { Player.Move(); /* OpenGL animation code goes here */ glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); Player.Triangle.Draw(); glPopMatrix (); SwapBuffers (hDC); Sleep (1); } } /* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC); /* destroy the window explicitly */ DestroyWindow (hWnd); return msg.wParam; } /******************** * Window Procedure * ********************/ 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); } } //Enables OpenGL void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat; /* get the device context (DC) */ *hDC = GetDC (hWnd); /* set the pixel format for the DC */ ZeroMemory (&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, &pfd); SetPixelFormat (*hDC, iFormat, &pfd); /* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); } //Disables OpenGL void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }