void keyPressed(KeySym key) { switch (key) { case XK_Escape: done = True; break; case XK_F1: killGLWindow(); GLWin.fs = !GLWin.fs; createGLWindow("NeHe's Texture Mapping Tutorial", 640, 480, 24, GLWin.fs); break; case XK_Left: rotz -= 0.8f; /* rotate left */ break; case XK_Right: rotz += 0.8f; /* rotate left */ break; case XK_Up: divs++; /* Update the patch */ mybezier.dlBPatch = genBezier(mybezier, divs); keys[XK_Up%256] = False; break; case XK_Down: divs--; /* Update the patch */ mybezier.dlBPatch = genBezier(mybezier, divs); keys[XK_Down%256] = False; break; case XK_space: showCPoints = !showCPoints; keys[XK_space%256] = False; break; } }
bool OpenGLGame::update() { if ( !isActive() ) // 程序激活的么? { return true; } if ( isKeyPressed( VK_ESCAPE ) ) // ESC 按下了么? { return false; // ESC 发出退出信号 } // 不是退出的时候,刷新屏幕 drawGLScene(); // 绘制场景 ::SwapBuffers( m_hDC ); // 交换缓存 (双缓存) processKeyEvent(); if ( isKeyPressed( VK_F1 ) ) // F1键按下了么? { onKeyReleased( VK_F1 ); // 若是,使对应的Key数组中的值为 FALSE killGLWindow(); // 销毁当前的窗口 m_bFullScreen = !m_bFullScreen; // 切换 全屏 / 窗口 模式 // 重建 OpenGL 窗口 if ( !createGLWindow() ) { return false; // 如果窗口未能创建,程序退出 } } return true; }
void keyPressed(KeySym key) { switch (key) { case XK_Escape: done = True; break; case XK_F1: killGLWindow(); GLWin.fs = !GLWin.fs; createGLWindow("NeHe's Blending Tutorial", 1920, 1280, 24, GLWin.fs); break; case XK_f: filter += 1; if (filter > 2) filter = 0; break; case XK_l: light = !light; if (!light) glDisable(GL_LIGHTING); else glEnable(GL_LIGHTING); break; case XK_b: blend = !blend; if (blend) { glEnable(GL_BLEND); /* turn blending on */ glDisable(GL_DEPTH_TEST); /* turn depth testing off */ } else { glDisable(GL_BLEND); /* turn blending off */ glEnable(GL_DEPTH_TEST); /* turn depth testing on */ } break; case XK_Page_Up: z -= 0.02f; break; case XK_Page_Down: z += 0.02f; break; case XK_Up: speedX -= 0.01f; break; case XK_Down: speedX += 0.01f; break; case XK_Right: speedY += 0.01f; break; case XK_Left: speedY -= 0.01f; break; } }
int main(void) { createGLWindow("NeHe's Lesson 36",640,480,24,False); /* Create our window*/ run(); /* Start Event-Loop */ killGLWindow(); /* shutdown window */ return 0; }
int main(void) { createGLWindow("Nehe's Lesson 34", 1920, 1280,24,False); /* Create our window*/ LoadRawFile("Data/Terrain.raw", MAP_SIZE * MAP_SIZE, g_HeightMap); /* Load raw data */ run(); /* Start Event-Loop */ killGLWindow(); /* shutdown window */ return 0; }
int main() { windowProcess = (LRESULT CALLBACK)windowProcessN; WNDCLASS window = createGLWindow((LPCWSTR)L"Moon Walk Demo", 1280, 800, false); onResize(1280, 800); glEnable(GL_DEPTH_TEST); MSG msg; bool done = false; initExtendedGL(); current_state = new main_game(); current_state->initialize(); int version = 0; printf("%s\n", glGetString(GL_VERSION)); while(!done) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) { done = true; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } current_state->updateLogic(); // Draw graphics here. { // Set color and depth clear value glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.f, 0.f, 0.f, 0.f); current_state->updateGraphics(); } current_state->updateSound(); updateWindow(); } killGLWindow(); return 0; }
void keyPressed(KeySym key) { switch (key) { case XK_Escape: done = True; break; case XK_F1: killGLWindow(); GLWin.fs = !GLWin.fs; createGLWindow("NeHe's Rotation Tutorial", 1920, 1280, 24, GLWin.fs); break; } }
int main(void) { createGLWindow("Piotr Cieslak & NeHe's Morphing Points Tutorial",640,480,24,False); /* Create our window*/ Initialize(); /* Init Opengl*/ run(); /* Start Event-Loop */ Deinitialize(); /* Release memory */ killGLWindow(); /* shutdown window */ return 0; }
int main(void) { createGLWindow("NeHe's Lesson 37",640,480,24,False); Initialize(); run(); Deinitialize(); killGLWindow(); return 0; }
void keyPressed(KeySym key) { switch (key) { case XK_Escape: done = True; break; case XK_F1: killGLWindow(); GLWin.fs = !GLWin.fs; createGLWindow((char*)"NeHe's Textures, Lighting & Keyboard Tutorial", 640, 480, 24, GLWin.fs); break; case XK_f: filter += 1; if (filter > 2) filter = 0; break; case XK_l: light = !light; if (!light) glDisable(GL_LIGHTING); else glEnable(GL_LIGHTING); break; case XK_Page_Up: z -= 0.02f; break; case XK_Page_Down: z += 0.02f; break; case XK_Up: speedX -= 0.01f; break; case XK_Down: speedX += 0.01f; break; case XK_Right: speedY += 0.01f; break; case XK_Left: speedY -= 0.01f; break; } }
void keyAction() { if (keys[keyCodes[0]]) done = True; if (keys[keyCodes[1]]) { killGLWindow(); GLWin.fs = !GLWin.fs; createGLWindow("NeHe's Particle Engine", 1920, 1280, 24, GLWin.fs); keys[keyCodes[1]] = False; } if (keys[keyCodes[7]] && slowdown > 1.0f) slowdown -= 0.01f; if (keys[keyCodes[8]] && slowdown < 4.0f) slowdown += 0.01f; if (keys[keyCodes[9]]) zoom += 0.1f; if (keys[keyCodes[10]]) zoom -= 0.1f; if (keys[keyCodes[11]]) { rainbow = !rainbow; keys[keyCodes[11]] = False; } if ((keys[keyCodes[12]]) || (rainbow && delay > 25)) { if (keys[keyCodes[12]]) rainbow = False; delay = 0; color++; if (color > 11) color = 0; keys[keyCodes[12]] = False; } if ((keys[keyCodes[13]]) && (ySpeed < 200.0f)) ySpeed += 1.0f; if ((keys[keyCodes[14]]) && (ySpeed > -200.0f)) ySpeed -= 1.0f; if ((keys[keyCodes[15]]) && (xSpeed < 200.0f)) xSpeed += 1.0f; if ((keys[keyCodes[16]]) && (xSpeed > -200.0f)) xSpeed -= 1.0f; delay++; }
BOOL OpenGLGame::createGLWindow() { GLuint PixelFormat; // 保存查找匹配的结果 WNDCLASS wc; // 窗口类结构 DWORD dwExStyle; // 扩展窗口风格 DWORD dwStyle; // 窗口风格 RECT WindowRect; // 取得矩形的左上角和右下角的坐标值 WindowRect.left = ( long )0; // 将Left 设为 0 WindowRect.right = ( long )m_nWidth; // 将Right 设为要求的宽度 WindowRect.top = ( long )0; // 将Top 设为 0 WindowRect.bottom = ( long )m_nHeight; // 将Bottom 设为要求的高度 m_hInstance = GetModuleHandle( NULL ); // 取得我们窗口的实例 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移动时重画,并为窗口取得DC wc.lpfnWndProc = ( WNDPROC ) &OpenGLGame::wndProc; // WndProc处理消息 wc.cbClsExtra = 0; // 无额外窗口数据 wc.cbWndExtra = 0; // 无额外窗口数据 wc.hInstance = m_hInstance; // 设置实例 wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); // 装入缺省图标 wc.hCursor = LoadCursor( NULL, IDC_ARROW ); // 装入鼠标指针 wc.hbrBackground = NULL; // GL不需要背景 wc.lpszMenuName = NULL; // 不需要菜单 wc.lpszClassName = "OpenG"; // 设定类名字 if ( !RegisterClass( &wc ) ) // 尝试注册窗口类 { MessageBox( NULL, "注册窗口失败", "错误", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 退出并返回FALSE } if ( m_bFullScreen ) // 要尝试全屏模式吗? { DEVMODE dmScreenSettings; // 设备模式 memset( &dmScreenSettings, 0, sizeof( dmScreenSettings ) ); // 确保内存清空为零 dmScreenSettings.dmSize = sizeof( dmScreenSettings ); // Devmode 结构的大小 dmScreenSettings.dmPelsWidth = m_nWidth; // 所选屏幕宽度 dmScreenSettings.dmPelsHeight = m_nHeight; // 所选屏幕高度 dmScreenSettings.dmBitsPerPel = m_nBitMode; // 每象素所选的色彩深度 dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; // 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态条。 if ( ChangeDisplaySettings( &dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL ) { // 若模式失败,提供两个选项:退出或在窗口内运行。 if ( MessageBox( NULL, "全屏模式在当前显卡上设置失败!\n使用窗口模式?", "G", MB_YESNO | MB_ICONEXCLAMATION ) == IDYES ) { m_bFullScreen = FALSE; // 选择窗口模式(Fullscreen=FALSE) } else { // 弹出一个对话框,告诉用户程序结束 MessageBox( NULL, "程序将被关闭", "错误", MB_OK | MB_ICONSTOP ); return FALSE; // 退出并返回 FALSE } } } if ( m_bFullScreen ) // 仍处于全屏模式吗? { dwExStyle = WS_EX_APPWINDOW; // 扩展窗体风格 dwStyle = WS_POPUP; // 窗体风格 ShowCursor( FALSE ); // 隐藏鼠标指针 } else { dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // 扩展窗体风格 dwStyle = WS_OVERLAPPEDWINDOW; // 窗体风格 } AdjustWindowRectEx( &WindowRect, dwStyle, FALSE, dwExStyle ); // 调整窗口达到真正要求的大小 if ( !( m_hWnd = CreateWindowEx( dwExStyle, // 扩展窗体风格 "OpenG", // 类名字 m_szTitle, // 窗口标题 WS_CLIPSIBLINGS | // 必须的窗体风格属性 WS_CLIPCHILDREN | // 必须的窗体风格属性 dwStyle, // 选择的窗体属性 0, 0, // 窗口位置 WindowRect.right - WindowRect.left, // 计算调整好的窗口宽度 WindowRect.bottom - WindowRect.top, // 计算调整好的窗口高度 NULL, // 无父窗口 NULL, // 无菜单 m_hInstance, // 实例 NULL ) ) ) // 不向WM_CREATE传递任何东东 { killGLWindow(); // 重置显示区 MessageBox( NULL, "不能创建一个窗口设备描述表", "错误", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 返回 FALSE } static PIXELFORMATDESCRIPTOR pfd = // /pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式 { sizeof( PIXELFORMATDESCRIPTOR ), // 上述格式描述符的大小 1, // 版本号 PFD_DRAW_TO_WINDOW | // 格式支持窗口 PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL PFD_DOUBLEBUFFER, // 必须支持双缓冲 PFD_TYPE_RGBA, // 申请 RGBA 格式 m_nBitMode, // 选定色彩深度 0, 0, 0, 0, 0, 0, // 忽略的色彩位 0, // 无Alpha缓存 0, // 忽略Shift Bit 0, // 无累加缓存 0, 0, 0, 0, // 忽略聚集位 16, // 16位 Z-缓存 (深度缓存) 0, // 无蒙板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, // 主绘图层 0, // Reserved 0, 0, 0 // 忽略层遮罩 }; if ( !( m_hDC = GetDC( m_hWnd ) ) ) // 取得设备描述表了么? { killGLWindow(); // 重置显示区 MessageBox( NULL, "不能创建一种相匹配的像素格式", "错误", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 返回 FALSE } if ( !( PixelFormat = ChoosePixelFormat( m_hDC, &pfd ) ) ) // Windows 找到相应的象素格式了吗? { killGLWindow(); // 重置显示区 MessageBox( NULL, "不能设置像素格式", "错误", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 返回 FALSE } if( !SetPixelFormat( m_hDC, PixelFormat, &pfd ) ) // 能够设置象素格式么? { killGLWindow(); // 重置显示区 MessageBox( NULL, "不能设置像素格式", "错误", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 返回 FALSE } if ( !( m_hRC = wglCreateContext( m_hDC ) ) ) // 能否取得着色描述表? { killGLWindow(); // 重置显示区 MessageBox( NULL, "不能创建OpenGL渲染描述表", "错误", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 返回 FALSE } if( !wglMakeCurrent( m_hDC, m_hRC ) ) // 尝试激活着色描述表 { killGLWindow(); // 重置显示区 MessageBox( NULL, "不能激活当前的OpenGL渲然描述表", "错误", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 返回 FALSE } ShowWindow( m_hWnd, SW_SHOW ); // 显示窗口 SetForegroundWindow( m_hWnd ); // 略略提高优先级 SetFocus( m_hWnd ); // 设置键盘的焦点至此窗口 resizeGLScene( m_nWidth, m_nHeight ); // 设置透视 GL 屏幕 if ( !initGL() ) // 初始化新建的GL窗口 { killGLWindow(); // 重置显示区 MessageBox( NULL, "Initialization Failed.", "ERROR", MB_OK | MB_ICONEXCLAMATION ); return FALSE; // 返回 FALSE } return TRUE; // 成功 }
int main(int argc, char **argv) { XEvent event; KeySym key; done = False; /* default to fullscreen */ GLWin.fs = True; createGLWindow("NeHe's Rotation Tutorial", 1920, 1280, 24, GLWin.fs); /* wait for events*/ while (!done) { /* handle the events in the queue */ while (XPending(GLWin.dpy) > 0) { XNextEvent(GLWin.dpy, &event); switch (event.type) { case Expose: if (event.xexpose.count != 0) break; drawGLScene(); break; case ConfigureNotify: /* call resizeGLScene only if our window-size changed */ if ((event.xconfigure.width != GLWin.width) || (event.xconfigure.height != GLWin.height)) { GLWin.width = event.xconfigure.width; GLWin.height = event.xconfigure.height; printf("Resize event\n"); resizeGLScene(event.xconfigure.width, event.xconfigure.height); } break; /* exit in case of a mouse button press */ case ButtonPress: done = True; break; case KeyPress: key = XLookupKeysym(&event.xkey, 0); keyPressed(key); break; case ClientMessage: if (*XGetAtomName(GLWin.dpy, event.xclient.message_type) == *"WM_PROTOCOLS") { printf("Exiting sanely...\n"); done = True; } break; default: break; } } drawGLScene(); } killGLWindow(); return 0; }