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() );
}
}