c语言浪漫烟花源码.rar

上传者: INTWIN | 上传时间: 2025-11-25 15:48:14 | 文件大小: 5.55MB | 文件类型: RAR
vs2017环境下成功编译,vc6.0编译不通过
#include "stdafx.h"

#include

#include

#include

#include // 使用该计时器必须包含的文件

#pragma comment ( lib, "Winmm.lib" )



using namespace std;



#define LONG 800 // 窗口长

#define WIDE 500 // 窗口宽

#define NUM 13 // 烟花种类数量宏定义





void Init_Fire(); // 初始化烟花

void Load_Image(); // 加载烟花图片

void Shoot(); // 发射烟花

void Chose(DWORD& t1); // 筛选烟花

void Show(DWORD* pMem); // 绽放烟花

void Erase(DWORD* pMem); // 随机擦除像素点





// 烟花结构

struct FIRE

{

int r; // 当前爆炸半径

int max_r; // 爆炸中心距离边缘最大半径

int x, y; // 爆炸中心在窗口的坐标

int cen_x, cen_y; // 爆炸中心相对图片左上角的坐标

int width, height; // 图片的宽高

int xy[240][240]; // 储存图片像素点



bool show; // 是否绽放

bool draw; // 开始输出像素点

DWORD t1, t2, dt; // 绽放速度

}Fire[NUM];



// 烟花弹结构

struct JET

{

int x, y; // 喷射点坐标

int hx, hy; // 最高点坐标------将赋值给 FIRE 里面的 x, y

int height; // 烟花高度

bool shoot; // 是否可以发射



DWORD t1, t2, dt; // 发射速度

IMAGE img[2]; // 储存花弹一亮一暗图片

byte n : 1; // 图片下标

}Jet[NUM];





// 初始化烟花参数

void Init_Fire()

{

// 分别为:烟花中心到图片边缘的最远距离、烟花中心到图片左上角的距离 (x、y) 两个分量

int r[13] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 };

int x[13] = { 120, 120, 110, 117, 110, 93, 102, 102, 110, 105, 100, 108, 110 };

int y[13] = { 120, 120, 85, 118, 120, 103, 105, 110, 110, 120, 120, 104, 85 };



for (int i = 0; i < NUM; i++) // 初始化烟花

{

Fire[i].x = 0; // 烟花中心坐标

Fire[i].y = 0;

Fire[i].width = 240; // 图片宽

Fire[i].height = 240; // 图片高

Fire[i].max_r = r[i]; // 最大半径

Fire[i].cen_x = x[i]; // 中心距左上角距离

Fire[i].cen_y = y[i];

Fire[i].show = false; // 是否绽放

Fire[i].dt = 5; // 绽放时间间隔

Fire[i].t1 = timeGetTime();

Fire[i].r = 0; // 从 0 开始绽放





Jet[i].x = -240; // 烟花弹左上角坐标

Jet[i].y = -240;

Jet[i].hx = -240; // 烟花弹发射最高点坐标

Jet[i].hy = -240;

Jet[i].height = 0; // 发射高度

Jet[i].t1 = timeGetTime();

Jet[i].dt = rand() % 10; // 发射速度时间间隔

Jet[i].n = 0; // 烟花弹闪烁图片下标

Jet[i].shoot = false; // 是否发射

}

}



// 加载图片

void Load_Image()

{

IMAGE fm, gm;

loadimage(&fm, _T("fire/flower.jpg"), 3120, 240);



for (int i = 0; i < NUM; i++)

{

SetWorkingImage(&fm);

getimage(&gm, i * 240, 0, 240, 240);

SetWorkingImage(&gm);



for (int a = 0; a < 240; a++)

for (int b = 0; b < 240; b++)

Fire[i].xy[a][b] = getpixel(a, b);

}



IMAGE sm;

loadimage(&sm, _T("fire/shoot.jpg"), 200, 50);



for (int i = 0; i < NUM; i++)

{

SetWorkingImage(&sm);

int n = rand() % 5;



getimage(&Jet[i].img[0], n * 20, 0, 20, 50); // 暗

getimage(&Jet[i].img[1], (n + 5) * 20, 0, 20, 50); // 亮

}



SetWorkingImage(); // 设置回绘图窗口

}



// 在一定范围内筛选可发射的烟花,并初始化发射参数,输出烟花弹到屏幕,播放声音

void Chose(DWORD& t1)

{

DWORD t2 = timeGetTime();



if (t2 - t1 > 100)

{

int n = rand() % 20;



if (n < 13 && Jet[n].shoot == false && Fire[n].show == false)

{

Jet[n].x = rand() % LONG;

Jet[n].y = rand() % 100 + LONG / 2;

Jet[n].hx = Jet[n].x;

Jet[n].hy = rand() % LONG / 3;

Jet[n].height = Jet[n].y - Jet[n].hy;

Jet[n].shoot = true;

putimage(Jet[n].x, Jet[n].y, &Jet[n].img[Jet[n].n], SRCINVERT);

}

t1 = t2;

}

}



// 扫描烟花弹并发射

void Shoot()

{

for (int i = 0; i < NUM; i++)

{

Jet[i].t2 = timeGetTime();



if (Jet[i].t2 - Jet[i].t1 > Jet[i].dt&& Jet[i].shoot == true)

{

putimage(Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT); // 烟花弹的上升



if (Jet[i].y > Jet[i].hy)

{

Jet[i].n++;

Jet[i].y -= 5;

}



putimage(Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT);



if ((Jet[i].y - Jet[i].hy) * 4 < Jet[i].height) // 上升到高度的 3 / 4,减速

Jet[i].dt = rand() % 4 + 10;

if (Jet[i].y <= Jet[i].hy) // 上升到最大高度

{

putimage(Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT); // 擦掉烟花弹

Fire[i].x = Jet[i].hx + 10; // 在烟花弹中间爆炸

Fire[i].y = Jet[i].hy; // 在最高点绽放

Fire[i].show = true; // 开始绽放

Jet[i].shoot = false; // 停止发射

}

Jet[i].t1 = Jet[i].t2;

}

}

}



// 绽放烟花

void Show(DWORD* pMem)

{

// 烟花个阶段绽放时间间隔,制作变速绽放效果

int drt[16] = { 5, 5, 5, 5, 5, 6, 25, 25, 25, 25, 55, 55, 55, 55, 55 };



for (int i = 0; i < NUM; i++)

{

Fire[i].t2 = timeGetTime();



// 增加爆炸半径,绽放烟花,增加时间间隔做变速效果

if (Fire[i].t2 - Fire[i].t1 > Fire[i].dt&& Fire[i].show == true)

{

if (Fire[i].r < Fire[i].max_r)

{

Fire[i].r++;

Fire[i].dt = drt[Fire[i].r / 10];

Fire[i].draw = true;

}



if (Fire[i].r >= Fire[i].max_r - 1)

{

Fire[i].draw = false;

Init_Fire();

}

Fire[i].t1 = Fire[i].t2;

}



// 如果该号炮花可爆炸,根据当前爆炸半径画烟花,颜色值接近黑色的不输出。

if (Fire[i].draw)

{

for (double a = 0; a <= 6.28; a += 0.01)

{

int x1 = (int)(Fire[i].cen_x + Fire[i].r * cos(a)); // 相对于图片左上角的坐标

int y1 = (int)(Fire[i].cen_y -

文件下载

资源详情

[{"title":"( 5 个子文件 5.55MB ) c语言浪漫烟花源码.rar","children":[{"title":"烟花","children":[{"title":"烟花程序.exe <span style='color:#111;'> 933.00KB </span>","children":null,"spread":false},{"title":"烟花源码.txt <span style='color:#111;'> 7.32KB </span>","children":null,"spread":false},{"title":"fire","children":[{"title":"shoot.jpg <span style='color:#111;'> 17.35KB </span>","children":null,"spread":false},{"title":"flower.jpg <span style='color:#111;'> 2.14MB </span>","children":null,"spread":false},{"title":"bk.mp3 <span style='color:#111;'> 4.14MB </span>","children":null,"spread":false}],"spread":true}],"spread":true}],"spread":true}]

评论信息

免责申明

【只为小站】的资源来自网友分享,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,【只为小站】 无法对用户传输的作品、信息、内容的权属或合法性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论 【只为小站】 经营者是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。
本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二条之规定,若资源存在侵权或相关问题请联系本站客服人员,zhiweidada#qq.com,请把#换成@,本站将给予最大的支持与配合,做到及时反馈和处理。关于更多版权及免责申明参见 版权及免责申明