- 论坛徽章:
- 5
|
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <GL/glut.h>
- #define WINDOW_WIDTH 600
- #define WINDOW_HEIGHT 640
- #define WINDOW_X 200
- #define WINDOW_Y 200
- #define FRAME_PER_SECOND 20
- #define KEY_EXIT 27
- #define POINT_NUM 288
- #define MATRIX_NUM 8
- typedef struct bgPoint
- {
- float x, y;
- float vx, vy;
- int r, g, b;
- }BGPoint;
- typedef BGPoint* Point;
- typedef struct bgMatrix
- {
- BGPoint point[POINT_NUM];
- int timer;
- int targetTime;
- int pauseTime;
- }BGMatrix;
- typedef BGMatrix* Matrix;
- Matrix* matrices;
- #define bgRand(m) ((float)(rand() % 10000) * m / 10000.0f)
- void handleKeyEvent(unsigned char key, int x, int y);
- void handleMouseEvent(int button, int state, int x, int y);
- void handleReshape(int width, int height);
- void run(int null);
- void update(void);
- void repaint(void);
- void initScene(void);
- void doScene(void);
- void drawScene(void);
- void exitScene(void);
- void initMatrices(void);
- void doMatrices(void);
- void drawMatrices(void);
- void exitMatrices(void);
- Matrix initMatrix(int matrixId);
- void doMatrix(int matrixId);
- void drawMatrix(int matrixId);
- void exitMatrix(int matrixId);
- void sleepMilliSeconds(long milliSeconds);
- int main(int argc, char ** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
- glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT);
- glutInitWindowPosition(WINDOW_X, WINDOW_Y);
- glutCreateWindow("BestMatrix");
- glutKeyboardFunc(handleKeyEvent);
- glutMouseFunc(handleMouseEvent);
- glutReshapeFunc(handleReshape);
- initScene();
- glutDisplayFunc(repaint);
- glutTimerFunc(FRAME_PER_SECOND, run, 0);
- glutMainLoop();
- return 0;
- }
- void run(int null)
- {
- clock_t startTime, endTime;
- startTime = clock();
- update();
- repaint();
- endTime = clock();
- if (endTime - startTime < FRAME_PER_SECOND)
- {
- sleepMilliSeconds(FRAME_PER_SECOND - (endTime - startTime));
- }
- glutPostRedisplay();
- glutTimerFunc(FRAME_PER_SECOND, run, 0);
- }
- void update(void)
- {
- doScene();
- }
- void repaint(void)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- drawScene();
- glutSwapBuffers();
- }
- void initScene(void)
- {
- srand(time(0));
- initMatrices();
- glPointSize(2.0);
- glMatrixMode (GL_PROJECTION);
- glLoadIdentity ();
- gluOrtho2D(0, (GLdouble)WINDOW_WIDTH, 0, (GLdouble)WINDOW_HEIGHT);
- glClearColor(0.0, 0.0, 0.0, 0.0);
- glShadeModel(GL_FLAT);
- glEnable(GL_COLOR_MATERIAL);
- }
- void doScene(void)
- {
- doMatrices();
- }
- void drawScene(void)
- {
- drawMatrices();
- }
- void exitScene(void)
- {
- exitMatrices();
- exit(0);
- }
- void initMatrices(void)
- {
- int i;
- matrices = malloc(sizeof(Matrix) * MATRIX_NUM);
- for (i = 0; i < MATRIX_NUM; i++)
- {
- matrices[i] = initMatrix(i);
- }
- }
- void doMatrices(void)
- {
- int i = 0;
- for (i = 0; i < MATRIX_NUM; i++)
- {
- doMatrix(i);
- }
- }
- void drawMatrices(void)
- {
- int i;
- for (i = 0; i < MATRIX_NUM; i++)
- {
- drawMatrix(i);
- }
- }
- void exitMatrices(void)
- {
- int i;
- for (i = 0; i < MATRIX_NUM; i++)
- {
- exitMatrix(i);
- }
- }
- Matrix initMatrix(int matrixId)
- {
- Matrix matrix;
- float x, y;
- int r, g, b;
- int i;
- matrix = malloc(sizeof(BGMatrix));
- matrix->timer = 0;
- matrix->targetTime = rand()%50;
- matrix->pauseTime = 50;
- x = 20.0f + bgRand(600.0f);
- y = 100.f + bgRand(100.0f);
- r = 50 + rand()%(255-50);
- g = 50 + rand()%(255-50);
- b = 50 + rand()%(255-50);
- for (i = 0; i < POINT_NUM; i++)
- {
- matrix->point[i].x = x;
- matrix->point[i].y = y;
- matrix->point[i].vx = 1.0f - bgRand(2.0f);
- matrix->point[i].vy = 1.0f - bgRand(2.0f);
- matrix->point[i].r = r;
- matrix->point[i].g = g;
- matrix->point[i].b = b;
- }
- return matrix;
- }
- void doMatrix(int matrixId)
- {
- int i;
- if (matrices[matrixId]->timer++ > matrices[matrixId]->targetTime)
- {
- for (i = 0; i < POINT_NUM; i++)
- {
- //matrices[matrixId]->point[i].vy += 0.1f;
- matrices[matrixId]->point[i].x += matrices[matrixId]->point[i].vx;
- matrices[matrixId]->point[i].y += matrices[matrixId]->point[i].vy;
- }
- }
- if (matrices[matrixId]->timer > matrices[matrixId]->targetTime + matrices[matrixId]->pauseTime)
- {
- exitMatrix(matrixId);
- matrices[matrixId] = initMatrix(matrixId);
- }
- }
- void drawMatrix(int matrixId)
- {
- int i;
- unsigned char r, g, b;
- glBegin(GL_POINTS);
- for (i = 0; i < POINT_NUM; i++)
- {
- r = matrices[matrixId]->point[i].r;
- g = matrices[matrixId]->point[i].g;
- b = matrices[matrixId]->point[i].b;
- glColor3ub(r, g, b);
- glVertex2f(matrices[matrixId]->point[i].x, WINDOW_HEIGHT - matrices[matrixId]->point[i].y);
- }
- glEnd();
- }
- void exitMatrix(int matrixId)
- {
- free(matrices[matrixId]);
- }
- void handleKeyEvent(unsigned char key, int x, int y)
- {
- switch (key)
- {
- case KEY_EXIT:
- exitScene();
- break;
- default:
- break;
- }
- }
- void handleMouseEvent(int button, int state, int x, int y)
- {
- switch (button)
- {
- case GLUT_LEFT_BUTTON:
- if (state == GLUT_DOWN)
- glutIdleFunc(repaint);
- break;
- case GLUT_RIGHT_BUTTON:
- if (state == GLUT_DOWN)
- glutIdleFunc(NULL);
- break;
- default:
- break;
- }
- }
- void handleReshape(int width, int height)
- {
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0, (GLdouble)width, 0, (GLdouble)height);
- }
- void sleepMilliSeconds(long milliSeconds)
- {
- clock_t start, end;
- start = clock();
- end = start + milliSeconds;
- while (start < end)
- {
- start = clock();
- }
- }
复制代码 |
|