⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 particlefun.cpp

📁 实战粒子系统例程
💻 CPP
字号:
/*
	glmain.cpp - OpenGL mainframe
	Copyright (c) HalfLucifer, 2001.6.20
*/
#include "ParticleFun.h"

void ProcessMenu()
{
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-50, "Numbers: %d", ps.GetNum());
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-70, "Size: %.0f", ps.GetSize());
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-90, "Gravity: %.1f", ps.GetGravity());
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-110, "Bounce: %.1f", ps.GetBounce());
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-130, "EnergyDrop: %.3f", ps.GetEnergyDrop());
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-150, "BirthVelocity: %.1f", ps.GetBirthVelocity());

	glColor3f(0.66f, 0.22f, 0.22f);
	switch (g_menu)
	{
		case 0:
			font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-50, "Numbers: %d", ps.GetNum());
			break;
		case 1:
			font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-70, "Size: %.0f", ps.GetSize());
			break;
		case 2:
			font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-90, "Gravity: %.1f", ps.GetGravity());
			break;
		case 3:
			font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-110, "Bounce: %.1f", ps.GetBounce());
			break;
		case 4:
			font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-130, "EnergyDrop: %.3f", ps.GetEnergyDrop());
			break;
		case 5:
			font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-150, "BirthVelocity: %.1f", ps.GetBirthVelocity());
			break;
	}

	glColor3f(0.33f, 0.66f, 1.0f);
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10-10, "Billboarding: %s", g_billboard ? "On" : "Off");
}

void glProcessKeyboard()
{
	if (input.KeyDown(DIK_A) && !ap)
	{
		ap = true;
		if (g_menu==0)
			g_menu = 5;
		else
			g_menu--;
	}
	if (input.KeyUp(DIK_A))
		ap = false;

	if (input.KeyDown(DIK_Z) && !zp)
	{
		zp = true;
		if (g_menu==5)
			g_menu = 0;
		else
			g_menu++;
	}
	if (input.KeyUp(DIK_Z))
		zp = false;

	if (input.KeyDown(DIK_S) && !sp)
	{
		sp = true;
		switch (g_menu)
		{
			case 0:
				ps.SetNum(ps.GetNum()+500);
				break;
			case 1:
				ps.SetSize(ps.GetSize()+10);
				break;
			case 2:
				ps.SetGravity(ps.GetGravity()+1);
				break;
			case 3:
				ps.SetBounce(ps.GetBounce()+0.1f);
				break;
			case 4:
				ps.SetEnergyDrop(ps.GetEnergyDrop()+0.005f);
				break;
			case 5:
				ps.SetBirthVelocity(ps.GetBirthVelocity()+5);
				break;
		}
	}
	if (input.KeyUp(DIK_S))
		sp = false;

	if (input.KeyDown(DIK_X) && !xp)
	{
		xp = true;
		switch (g_menu)
		{
			case 0:
				ps.SetNum(ps.GetNum()-500);
				break;
			case 1:
				ps.SetSize(ps.GetSize()-10);
				break;
			case 2:
				ps.SetGravity(ps.GetGravity()-1);
				break;
			case 3:
				ps.SetBounce(ps.GetBounce()-0.1f);
				break;
			case 4:
				ps.SetEnergyDrop(ps.GetEnergyDrop()-0.005f);
				break;
			case 5:
				ps.SetBirthVelocity(ps.GetBirthVelocity()-5);
				break;
		}
	}
	if (input.KeyUp(DIK_X))
		xp = false;

	if (input.KeyDown(DIK_B) && !bp)
	{
		bp = true;
		g_billboard = !g_billboard;
	}
	if (input.KeyUp(DIK_B))
		bp = false;

	if (input.KeyDown(DIK_SPACE) && !spp)
	{
		spp = true;
		g_init = false;
	}
	if (input.KeyUp(DIK_SPACE))
		spp = false;
	
	if (input.KeyDown(DIK_UP))
		camera.Move(0.1f);
	if (input.KeyDown(DIK_DOWN))
		camera.Move(-0.1f);
	if (input.KeyDown(DIK_LEFT))
		camera.Strafe(0.1f);
	if (input.KeyDown(DIK_RIGHT))
		camera.Strafe(-0.1f);

	if (input.KeyDown(DIK_ESCAPE))
		PROGRAM_QUIT = true;
}

bool glInitialize()
{
	font.Initialize("font.tga");
	input.Initialize();

	ps.Initialize();
	ps.SetEmitterPos(GLvector(0, 200, 0));

	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glClearDepth(1.0f);
	glShadeModel(GL_SMOOTH);
	glDepthFunc(GL_LEQUAL);
	glLightfv(GL_LIGHT0, GL_AMBIENT, GLvector(1.0f, 1.0f, 1.0f));
	glLightfv(GL_LIGHT0, GL_DIFFUSE, GLvector(1.0f, 1.0f, 1.0f));
	glLightfv(GL_LIGHT0, GL_POSITION, GLvector(0.0f, 200.0f, 50.0f));
	glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
	glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_TEXTURE_2D);

	ShowCursor(false);

	return true;
}

void glShutDown()
{
}

void glReshape(int width, int height)
{
	glViewport(0, 0, (GLsizei)(width), (GLsizei)(height));
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(90.0f, (GLfloat)width/(GLfloat)height, 1.0f, 9999.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void glDrawScene()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	camera.Update();

	// Begin to Draw
	if (!g_init)
	{
		srand(GetTickCount());
		ps.SetColor(GLvector((float)(rand()%256)/255, (float)(rand()%256)/255, (float)(rand()%256)/255));
		g_init = true;
	}
	else
	{
		ps.Update();
		ps.Render();
		ProcessMenu();
	}
	// End to Draw

	camera.ViewMove();
	input.Update();
	glProcessKeyboard();
	timer.Update();
	glColor3f(1.0f, 1.0f, 0.1f);
	font.Print(font.Viewport.left+10, font.Viewport.bottom*9/10+30, "FPS: %.2f", timer.GetFps());
	glColor3f(1.0f, 1.0f, 1.0f);
	font.Print(font.Viewport.right*2/5+100, 10, "Written by HalfLucifer (c)2002");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -