www.pudn.com > screensaver.rar > DoFireworks.c


#include "DoFireworks.h" 
#include "sound.h" 
#include "commonlib.h" 
#include "graphics.h" 
#include "extgraph.h" 
#include "random.h" 
#include "math.h" 
#include "time.h" 
 
//#define EFFECT_SOUND 
//#define EFFECT_BEAUTIFUL 
 
#define RANGE_LOW 1.0 
#define RANGE_HIGH 2.0 
#define HEIGHT_LOW 3.0 
#define HEIGHT_HIGH (GetWindowHeight()) 
#define FIREWORK_CLOCK 3000 
#define FIRE_CLOCK 1000 
#define EXPLODE_CLOCK 2000 
#define DELAY_LOW 100 
#define DELAY_HIGH 2000 
#ifndef EFFECT_SOUND 
#	ifdef EFFECT_BEAUTIFUL 
#		define FIREWORK_NUM 4 
#	else 
#		define FIREWORK_NUM 30 
#	endif 
#else 
#	define FIREWORK_NUM 1 
#	ifndef EFFECT_BEAUTIFUL 
#		define EFFECT_BEAUTIFUL 
#	endif 
#endif 
 
void DoFire(double dblX, double dblHeight); 
void DoExplode(double dblX, double dblHeight, double dblR); 
void DrawCircleLines(double dblX, double dblY, double dblStartR, double dblEndR, string strColor); 
void DrawCircleLine(double dblX, double dblY, double dblStartR, double dblEndR, double dblRad, string strColor); 
void DrawFireworks(firework_t * fw, int intClock); 
void DrawFire(firework_t * fw, int intClock); 
void DrawExplode(firework_t * fw, int intClock); 
void GenFirework(firework_t * fw); 
 
void GenFirework(firework_t * fw) 
{ 
	fw->dblR = RandomReal(RANGE_LOW, RANGE_HIGH); 
	fw->dblX = RandomReal(fw->dblR, GetWindowWidth() - fw->dblR); 
	fw->dblHeight = RandomReal(HEIGHT_LOW, HEIGHT_HIGH - fw->dblR); 
	fw->intStartClock = RandomInteger(DELAY_LOW, DELAY_HIGH) + ((int)clock()); 
#ifdef EFFECT_SOUND 
	fw->blnFired = FALSE; 
	fw->blnExploded = FALSE; 
#endif 
} 
 
void DoFireworks (void) 
{ 
	firework_t arrFw[FIREWORK_NUM]; 
	int i, intCurClock; 
 
	CleanScreen(); 
	UpdateDisplay(); 
 
	for (i = 0; i < FIREWORK_NUM; i++) 
	{ 
		GenFirework(&arrFw[i]); 
	} 
 
	arrFw[0].intStartClock = 0; 
 
	while(!MouseButtonIsDown()) 
	{ 
		CleanScreen(); 
		for(i = 0; i < FIREWORK_NUM; i++) 
		{ 
			intCurClock = clock() - arrFw[i].intStartClock; 
 
			if (intCurClock > FIREWORK_CLOCK) 
			{ 
				GenFirework(&arrFw[i]); 
			} else if (intCurClock > 0) 
			{ 
				DrawFireworks(&arrFw[i], intCurClock); 
			} 
		} 
		UpdateDisplay(); 
	} 
} 
 
void DrawCircleLines(double dblX, double dblY, double dblStartR, double dblEndR, string strColor) 
{ 
	double dblDeg; 
	double dblRad; 
 
	for(dblDeg = 0; dblDeg < 360; dblDeg += 15) 
	{ 
		dblRad = (dblDeg / 180) * PI; 
		DrawCircleLine(dblX, dblY, dblStartR, dblEndR, dblRad, strColor); 
	} 
} 
 
void DrawCircleLine(double dblX, double dblY, double dblStartR, double dblEndR, double dblRad, string strColor) 
{ 
#ifdef EFFECT_BEAUTIFUL 
	double dblCurR; 
#endif 
	double dblCurX, dblCurY; 
 
	SetPenColor(strColor); 
 
#ifdef EFFECT_BEAUTIFUL 
	for(dblCurR = dblStartR; dblCurR <= dblEndR; dblCurR += 0.06) 
	{ 
		dblCurX = dblX + dblCurR * cos(dblRad); 
		dblCurY = dblY + dblCurR * sin(dblRad); 
		MovePen(dblCurX, dblCurY); 
		DrawLine(0.03 * cos(dblRad), 0.03 * sin(dblRad)); 
	} 
#else 
	dblCurX = dblX + dblStartR * cos(dblRad); 
	dblCurY = dblY + dblStartR * sin(dblRad); 
	MovePen(dblCurX, dblCurY); 
	DrawLine( (dblEndR - dblStartR) * cos(dblRad), (dblEndR - dblStartR) * sin(dblRad) ); 
#endif 
} 
 
void DrawFireworks(firework_t * fw, int intClock) 
{ 
	if (intClock <= FIRE_CLOCK) 
	{ 
#ifdef EFFECT_SOUND 
		if (!fw->blnFired) 
		{ 
			PlayNamedSound("Fire"); 
			fw->blnFired = TRUE; 
		} 
#endif 
		DrawFire(fw, intClock); 
	} else 
	{ 
#ifdef EFFECT_SOUND 
		if (!fw->blnExploded) 
		{ 
			PlayNamedSound("Explode"); 
			fw->blnExploded = TRUE; 
		} 
#endif 
		DrawExplode(fw, intClock - FIRE_CLOCK); 
	} 
} 
 
void DrawFire(firework_t * fw, int intClock) 
{ 
	SetPenColor("White"); 
	MovePen(fw->dblX, fw->dblHeight * (((double)intClock) / FIRE_CLOCK )); 
	DrawNamedPicture("FireImage"); 
} 
 
void DrawExplode(firework_t * fw, int intClock) 
{ 
	if (intClock <= (EXPLODE_CLOCK / 2)) 
	{ 
		DrawCircleLines( fw->dblX, fw->dblHeight, 0, fw->dblR * ( ((double)intClock)/(EXPLODE_CLOCK / 2) ), GetRandomColor() ); 
	} else 
	{ 
		DrawCircleLines( fw->dblX, fw->dblHeight, fw->dblR * ( ((double)intClock)/(EXPLODE_CLOCK / 2) - 1 ), fw->dblR, GetRandomColor() );	 
	} 
}