//设置粒子 for (loop = 0; loop < MAX_PARTICLES; loop++) // Initials All The Textures { particle[loop].active = true; // Make All The Particles Active particle[loop].life = 1.0f; // Give All The Particles Full Life particle[loop].fade = float(rand() % 100) / 1000.0f + 0.003f; // Random Fade Speed particle[loop].r = colors[(loop + 1) / (MAX_PARTICLES / 12)][0]; // Select Red Rainbow Color particle[loop].g = colors[(loop + 1) / (MAX_PARTICLES / 12)][1]; // Select Green Rainbow Color particle[loop].b = colors[(loop + 1) / (MAX_PARTICLES / 12)][2]; // Select Blue Rainbow Color particle[loop].xi = float((rand() % 50) - 26.0f) * 10.0f; // Random Speed On X Axis particle[loop].yi = float((rand() % 50) - 25.0f) * 10.0f; // Random Speed On Y Axis particle[loop].zi = float((rand() % 50) - 25.0f) * 10.0f; // Random Speed On Z Axis particle[loop].xg = 0.0f; // Set Horizontal Pull To Zero particle[loop].yg = -0.8f; // Set Vertical Pull Downward particle[loop].zg = 0.0f; // Set Pull On Z Axis To Zero }
for (loop = 0; loop < MAX_PARTICLES; loop++) // Loop Through All The Particles { if (particle[loop].active) // If The Particle Is Active { float x = particle[loop].x; // Grab Our Particle X Position float y = particle[loop].y; // Grab Our Particle Y Position float z = particle[loop].z + zoom; // Particle Z Pos + Zoom
// Draw The Particle Using Our RGB Values, Fade The Particle Based On It's Life glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life);
glBegin(GL_TRIANGLE_STRIP); // Build Quad From A Triangle Strip glTexCoord2d(1, 1); glVertex3f(x + 0.5f, y + 0.5f, z); // Top Right glTexCoord2d(0, 1); glVertex3f(x - 0.5f, y + 0.5f, z); // Top Left glTexCoord2d(1, 0); glVertex3f(x + 0.5f, y - 0.5f, z); // Bottom Right glTexCoord2d(0, 0); glVertex3f(x - 0.5f, y - 0.5f, z); // Bottom Left glEnd(); // Done Building Triangle Strip
particle[loop].x += particle[loop].xi / (slowdown * 1000); // Move On The X Axis By X Speed particle[loop].y += particle[loop].yi / (slowdown * 1000); // Move On The Y Axis By Y Speed particle[loop].z += particle[loop].zi / (slowdown * 1000); // Move On The Z Axis By Z Speed
particle[loop].xi += particle[loop].xg; // Take Pull On X Axis Into Account particle[loop].yi += particle[loop].yg; // Take Pull On Y Axis Into Account particle[loop].zi += particle[loop].zg; // Take Pull On Z Axis Into Account particle[loop].life -= particle[loop].fade; // Reduce Particles Life By 'Fade'
if (particle[loop].life < 0.0f) // If Particle Is Burned Out { particle[loop].life = 1.0f; // Give It New Life particle[loop].fade = float(rand() % 100) / 1000.0f + 0.003f; // Random Fade Value particle[loop].x = 0.0f; // Center On X Axis particle[loop].y = 0.0f; // Center On Y Axis particle[loop].z = 0.0f; // Center On Z Axis particle[loop].xi = xspeed + float((rand() % 60) - 32.0f); // X Axis Speed And Direction particle[loop].yi = yspeed + float((rand() % 60) - 30.0f); // Y Axis Speed And Direction particle[loop].zi = float((rand() % 60) - 30.0f); // Z Axis Speed And Direction particle[loop].r = colors[col][0]; // Select Red From Color Table particle[loop].g = colors[col][1]; // Select Green From Color Table particle[loop].b = colors[col][2]; // Select Blue From Color Table } } }
//如果有按键按下调用此函数 voidkeyboard(unsignedchar key, int x, int y) { usleep(100); //稍微延时以免干扰
switch (key) { case ESCAPE: glutDestroyWindow(window); //销毁窗口 exit(0); //正常退出程序 break; case UP_ARROW: //zoom in zoom += 0.1f; if (yspeed < 200){ yspeed += 1.0f; } break; case DOWN_ARROW: //zoom out zoom -= 0.1f; if (yspeed > -200){ yspeed -= 1.0f; } break; case LEFT_ARROW: // if (xspeed > -200){ xspeed -= 1.0f; } break; case RIGHT_ARROW: if (xspeed < 200){ xspeed += 1.0f; } break; case PLUS: if (slowdown > 0.0f){ slowdown -= 0.01f; } break; case MINUS: if (slowdown < 4.0f){ slowdown += 0.01f; } break; case SPACE: col++; if (col > 11) col = 0; break; case TAB: particle[loop].x = 0.0f; // Center On X Axis particle[loop].y = 0.0f; // Center On Y Axis particle[loop].z = 0.0f; // Center On Z Axis particle[loop].xi = float((rand() % 50) - 26.0f) * 10.0f; // Random Speed On X Axis particle[loop].yi = float((rand() % 50) - 25.0f) * 10.0f; // Random Speed On Y Axis particle[loop].zi = float((rand() % 50) - 25.0f) * 10.0f; // Random Speed On Z Axis break; case N2: //6 if (particle[loop].yg > -1.5f){ particle[loop].yg -= 0.01f; } break; case N4: if (particle[loop].xg > -1.5f){ particle[loop].xg -= 0.01f; } break; case N6: if (particle[loop].xg < 1.5f){ particle[loop].xg += 0.01f; } break; case N8: if (particle[loop].yg < 1.5f){ particle[loop].yg += 0.01f; } break; default: break; } }