2025新的一年:C++烟花代码(Easyx实现)
【代码】2025新的一年:C++烟花代码(Easyx实现)
·
1.效果图
2.给vs2022配置exsyx,教学链接
1.VS2022安装EasyX 及 EasyX图形库安装和使用(附C++各图形编程项目示例源码)_vs配置easyx-CSDN博客
3.完整代码以及注释
/*******************************
* 项目名称:新年烟花
* 开发环境:vs2022 + Easyx
* 作者:永远爱你的
* 代码长度:137 行
* 完成时间:2023.1.20
* 用时:2.2 小时
*******************************/
#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#define MAXNUM 15 // 最大烟花数量
#define WIDTH 1024 // 窗口宽度
#define HEIGHT 768 // 窗口高度
#define PI 3.1415926 // π常量
// 定义烟花结构体,包含位置、颜色、爆炸状态等
struct Fire
{
int nowx; // 当前烟花的x坐标
int nowy; // 当前烟花的y坐标
int endy; // 烟花的终点y坐标
int radio; // 烟花升空的速度
int explode; // 烟花爆炸的程度
int rgb[3]; // 烟花的RGB颜色值
COLORREF color; // 烟花的颜色(RGB颜色)
} fire[MAXNUM]; // 数组,用来存储多个烟花对象
// 初始化烟花的随机位置、颜色、爆炸速度等
void Init()
{
for (int i = 0; i < MAXNUM; i++)
{
// 随机生成烟花的初始位置,适应新的大屏幕
fire[i].nowx = rand() % WIDTH; // x坐标
fire[i].nowy = HEIGHT + rand() % 250 + 50; // y坐标(随机生成更高的位置)
fire[i].endy = rand() % 100 + 10; // 终点y坐标(控制烟花升空的高度)
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; // 保证颜色不超过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) // 每次生成8个方向的烟花粒子(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; // 保证颜色不超过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; // 烟花每次上升3个像素
}
else
{
// 烟花已经到达终点,开始爆炸
if (fire[i].explode >= fire[i].radio)
{
// 烟花爆炸后重新随机生成位置
fire[i].nowx = rand() % WIDTH; // 随机生成新的x坐标
fire[i].nowy = HEIGHT + rand() % 250 + 50; // 随机生成新的y坐标
fire[i].endy = rand() % 100 + 10; // 重新设定终点y坐标
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++; // 如果还没有达到爆炸的条件,增加爆炸程度
}
}
}
int main()
{
srand(time(NULL)); // 设置随机数种子
initgraph(1024, 768); // 创建一个1024x768的窗口
Init(); // 初始化烟花
BeginBatchDraw(); // 开始批量绘制
while (true)
{
cleardevice(); // 清空屏幕
Draw(); // 绘制烟花效果
Move(); // 更新烟花位置
FlushBatchDraw(); // 刷新屏幕
Sleep(2); // 每2毫秒刷新一次
}
EndBatchDraw(); // 结束批量绘制
closegraph(); // 关闭图形窗口
return 0; // 程序结束
}
更多推荐
所有评论(0)