📄 bounce.c
字号:
// Bounce.c// Demonstrates a simple animated rectangle program with GLUT// OpenGL SuperBible, 3rd Edition// Richard S. Wright Jr.// rwright@starstonesoftware.com#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff// Initial square position and sizeGLfloat x = 0.0f;GLfloat y = 0.0f;GLfloat rsize = 25;// Step size in x and y directions// (number of pixels to move each time)GLfloat xstep = 1.0f;GLfloat ystep = 1.0f;// Keep track of windows changing width and heightGLfloat windowWidth;GLfloat windowHeight;///////////////////////////////////////////////////////////// Called to draw scenevoid RenderScene(void) { // Clear the window with current clearing color glClear(GL_COLOR_BUFFER_BIT); // Set current drawing color to red // R G B glColor3f(1.0f, 0.0f, 0.0f); // Draw a filled rectangle with current color glRectf(x, y, x + rsize, y - rsize); // Flush drawing commands and swap glutSwapBuffers(); }///////////////////////////////////////////////////////////// Called by GLUT library when idle (window not being// resized or moved)void TimerFunction(int value) { // Reverse direction when you reach left or right edge if(x > windowWidth-rsize || x < -windowWidth) xstep = -xstep; // Reverse direction when you reach top or bottom edge if(y > windowHeight || y < -windowHeight + rsize) ystep = -ystep;
// Actually move the square
x += xstep;
y += ystep; // Check bounds. This is in case the window is made // smaller while the rectangle is bouncing and the // rectangle suddenly finds itself outside the new // clipping volume if(x > (windowWidth-rsize + xstep)) x = windowWidth-rsize-1;
else if(x < -(windowWidth + xstep))
x = -windowWidth -1; if(y > (windowHeight + ystep)) y = windowHeight-1;
else if(y < -(windowHeight - rsize + ystep))
y = -windowHeight + rsize - 1; // Redraw the scene with new coordinates glutPostRedisplay(); glutTimerFunc(33,TimerFunction, 1); }///////////////////////////////////////////////////////////// Setup the rendering statevoid SetupRC(void) { // Set clear color to blue glClearColor(0.0f, 0.0f, 1.0f, 1.0f); }///////////////////////////////////////////////////////////// Called by GLUT library when the window has chanaged sizevoid ChangeSize(int w, int h) { GLfloat aspectRatio; // Prevent a divide by zero if(h == 0) h = 1; // Set Viewport to window dimensions glViewport(0, 0, w, h); // Reset coordinate system glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Establish clipping volume (left, right, bottom, top, near, far) aspectRatio = (GLfloat)w / (GLfloat)h; if (w <= h) { windowWidth = 100; windowHeight = 100 / aspectRatio; glOrtho (-100.0, 100.0, -windowHeight, windowHeight, 1.0, -1.0); } else { windowWidth = 100 * aspectRatio; windowHeight = 100; glOrtho (-windowWidth, windowWidth, -100.0, 100.0, 1.0, -1.0); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }///////////////////////////////////////////////////////////// Main program entry pointint main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(800,600); glutCreateWindow("Bounce"); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); glutTimerFunc(33, TimerFunction, 1); SetupRC(); glutMainLoop(); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -