目录
系列推荐
写在前面
烟花代码
代码分析
运行结果
写在后面
系列推荐
序号 | 目录 | 直达链接 |
1 | 爱心代码 | https://want595.blog.csdn.net/article/details/136360684 |
2 | 李峋同款跳动的爱心 | https://want595.blog.csdn.net/article/details/139722249 |
3 | 满屏飘字代码 | https://want595.blog.csdn.net/article/details/136342476 |
4 | 大雪纷飞代码 | https://want595.blog.csdn.net/article/details/140735166 |
5 | 烟花代码 | https://want595.blog.csdn.net/article/details/140813777 |
6 | 黑客帝国字母雨 | https://want595.blog.csdn.net/article/details/139923742 |
7 | 樱花树 | https://want595.blog.csdn.net/article/details/140690893 |
写在前面
七夕就要到啦,博主给大家准备了一个炫酷的烟花代码,一起来看看叭!
什么是Visual Studio?
Microsoft Visual Studio 是由微软公司开发的一款强大且全面的集成开发环境(IDE),主要用于创建从桌面应用程序到云服务,以及跨多种平台(包括Windows、Android、iOS和Web)的应用程序。它支持一系列广泛的编程语言,如C#、C++、Visual Basic、F#、TypeScript、Python等,并集成了.NET框架和其他微软技术栈的支持。
什么是EasyX?
EasyX是专为C++语言设计的一款轻量级图形库,它在Visual Studio环境下运行,极大地简化了Windows平台下C++图形编程的难度。通过集成于Visual Studio IDE中,EasyX提供了一系列易于理解和调用的API接口,支持图形绘制、颜色填充、图像处理、键盘和鼠标事件响应等功能,使得初学者能够快速入门并实现如画图、小游戏等图形化项目开发。其简洁易懂的API设计风格降低了学习曲线,使开发者无需深入理解复杂的Windows GDI编程机制,即可高效完成简单的2D图形界面开发任务。
烟花代码
#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#define MAXNUM 15
#define WIDTH 640
#define HEIGHT 480
#define PI 3.1415926
struct Fire
{
int nowx;
int nowy;
int endy;
int radio;
int explode;
int rgb[3];
COLORREF color;
}fire[MAXNUM];
void Init()
{
for (int i = 0; i < MAXNUM; i++)
{
fire[i].nowx = rand() % WIDTH;
fire[i].nowy = HEIGHT + rand() % 250 + 50;
fire[i].endy = rand() % 100 + 10;
fire[i].radio = rand() % 50 + 120;
fire[i].explode = 0;
int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
int n = rand() % 8;
fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
fire[i].rgb[0] = c[n][0];
fire[i].rgb[1] = c[n][1];
fire[i].rgb[2] = c[n][2];
}
}
void Draw()
{
for (int i = 0; i < MAXNUM; i++)
{
if (fire[i].nowy > fire[i].endy)
{
for (int size = 5; size > 0; size--)
{
int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
for (int k = 0; k < 3; k++)
{
temp[k] += 50 * (5 - size);
if (temp[k] > 255) temp[k] = 255;
}
setfillcolor(RGB(temp[0], temp[1], temp[2]));
solidcircle(fire[i].nowx, fire[i].nowy + 15 * (10 - size), size);
}
}
else
{
for (int a = 0; a < 360; a += 30)
{
for (int size = 5; size > 0; size--)
{
int x = cos(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowx;
int y = sin(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowy + fire[i].radio / 2;
int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
for (int k = 0; k < 3; k++)
{
temp[k] += 50 * (5 - size);
if (temp[k] > 255) temp[k] = 255;
}
setfillcolor(RGB(temp[0], temp[1], temp[2]));
solidcircle(x, y + (HEIGHT - y) * 0.1 + size * (size - 2), size);
}
}
}
}
}
void Move()
{
for (int i = 0; i < MAXNUM; i++)
{
if (fire[i].nowy > fire[i].endy)
{
fire[i].nowy -= 3;
}
else
{
if (fire[i].explode >= fire[i].radio)
{
fire[i].nowx = rand() % WIDTH;
fire[i].nowy = HEIGHT + rand() % 250 + 50;
fire[i].endy = rand() % 100 + 10;
fire[i].radio = rand() % 50 + 120;
fire[i].explode = 0;
int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
int n = rand() % 8;
fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
fire[i].rgb[0] = c[n][0];
fire[i].rgb[1] = c[n][1];
fire[i].rgb[2] = c[n][2];
}
else fire[i].explode++;
}
}
}
……
完整代码:https://pan.quark.cn/s/db67eb39b861
代码分析
这段代码是一个用C++编写的基于EasyX图形库的简单烟花模拟程序。以下是对该程序主要部分的详细分析:
首先,程序定义了一些常量和结构体:
- `MAXNUM` 定义了同时显示的最大烟花数量。
- `WIDTH` 和 `HEIGHT` 分别定义了窗口的宽度和高度。
- `PI` 是圆周率的近似值。
- `Fire` 结构体代表一个独立的烟花实例,其中包含了烟花当前的位置(nowx, nowy)、最终到达的高度(endy)、爆炸范围(radio)、爆炸阶段(explode)以及颜色信息。
接下来是三个函数:
1. Init()函数:
- 用于初始化所有烟花对象,设置它们的初始位置、下落终点、半径大小以及随机选取的颜色。
- 使用随机数生成器为每个烟花赋予不同的起始参数,并将颜色信息转换为RGB格式存储在COLORREF类型变量color中,同时也分别存储到rgb数组以便后续调整。
2. Draw()函数:
- 根据烟花当前的状态绘制每一帧画面。
- 当烟花处于下降阶段时,以烟花当前位置为中心,根据当前尺寸绘制一系列逐渐变淡的同心圆来表现烟花的消散效果。
- 当烟花爆炸时,依据角度(从0到360度)和尺寸绘制多个小圆圈,形成扩散状的爆炸效果,并且随着远离中心点,颜色逐渐加深。
3. Move()函数:
- 更新每个烟花的位置和状态。
- 如果烟花已经落在地面(nowy > endy),则将其向上移动一定的距离。
- 若烟花已完成爆炸,则重新初始化其属性,使其再次从顶部开始落下并准备爆炸;否则,增加烟花的爆炸阶段计数器。
最后定义主函数main():
- 初始化随机种子,确保每次运行产生的随机结果不同。
- 启动图形界面,设置屏幕分辨率。
- 调用 `BeginBatchDraw()` 开始批处理模式绘图,提高渲染效率。
- 进入无限循环,在循环内部清除屏幕、绘制烟花、更新烟花状态,然后使用 `FlushBatchDraw()` 更新屏幕内容。
- 每次循环之间暂停2毫秒,以实现动画效果。
- 循环结束后调用 `EndBatchDraw()` 结束批处理绘图,并关闭图形界面。
总的来说,这个程序通过创建和维护一组烟花对象,利用图形库提供的绘图函数动态地模拟出多烟花绽放和爆炸的效果。
运行结果
写在后面
喜欢本篇内容的小伙伴可以给博主点个赞嘛~