c++实现新年烟花效果完整代码

 更新时间:2023年11月29日 10:37:09   作者:独编  
这篇文章主要给大家介绍了关于c++实现新年烟花效果的相关资料,文中给出了详细完整代码,适合初学C语言/C++的小伙伴学习研究,需要的朋友可以参考下

分享一下我的烟花代码,图片可以去百度自己搜索

完整代码:

#include <iostream>
#include <graphics.h>      
#include <easyx.h>
#include "math.h"
#include "time.h"
 
//烟花弹
struct Jet {
    int x = 0, y = 0;
    int hx = 0, hy = 0;
    unsigned long t1 = 0, t2 = 0, dt = 0;
    IMAGE img;
    bool isshoot = 1;
}jet;
Jet jet1, jet2, jet3;
//烟花
struct Fire {
    int r = 0;            //当前半径
    int maxr = 0;          //最大半径
    int x = 0, y = 0;     //中心点坐标(窗口)
    int cx = 0, cy = 0;    //中心点坐标(图画)
    int xy[240][240];     //保存像素点
    bool isboom = 0;       //是否爆炸
    bool isdraw = 0;      //是否显示
    unsigned long t1 = 0, t2 = 0, dt = 0;   //爆炸速度
}fire;
Fire fire1, fire2, fire3;
 
void jet_init(Jet* jetn)     //烟花弹的初始化
{
    jetn->x = rand() % 1100 - 20;
    jetn->y = rand() % 50 + 700;
    jetn->hx = jetn->x;
    jetn->hy = rand() % 450;
    jetn->t1 = GetTickCount();  //获取系统时间
    jetn->isshoot = true;
    jetn->dt = rand() % 10 + 1;
}
 
void fire_init(Fire* firen)
{
    firen->r = 0;
    firen->maxr = 120;
    firen->cx = 120; firen->cy = 120;     //中心点的坐标(图片)
    firen->isboom = true; firen->isdraw = false;
    firen->t1 = GetTickCount();
    firen->dt = 5;             //烟花爆炸速度
    IMAGE fimg;
    
    loadimage(&fimg, L"烟花4.jpg", 240, 240);
    SetWorkingImage(&fimg);
    for (int a = 0; a < 240; a++)
    {
        for (int b = 0; b < 240; b++)
        {
            firen->xy[a][b] = getpixel(a, b);   //传入像素点
        }
    }
    SetWorkingImage();
}
 
//函数测试
void fire_text(Jet* jetn, Fire* firen)
{
    DWORD* pmem = GetImageBuffer();
    jetn->t2 = GetTickCount();
    if (jetn->t2 - jetn->t1 > jetn->dt && jetn->isshoot == true)
    {
        putimage(jetn->x, jetn->y, &jetn->img, SRCINVERT);
        if (jetn->y > jetn->hy)
        {
            jetn->y -= 5;
            putimage(jetn->x, jetn->y, &jetn->img, SRCINVERT);
        }
        if (jetn->y <= jetn->hy)     //烟花弹移动出界
        {
            jetn->isshoot = false;
            putimage(jetn->x, jetn->y, &jetn->img, SRCINVERT);
            fire_init(firen);    //烟花的初始化
            firen->x = jetn->hx + 10;
            firen->y = jetn->hy - 20;
 
        }
        if (jetn->isshoot == false && firen->isboom == true && firen->isdraw == 0)
        {
            jet_init(jetn);
            putimage(jetn->x, jetn->y, &jetn->img, SRCINVERT);
        }
        jetn->t1 = jetn->t2;
        //烟花
        int drt[13] = { 5,5,5,10,10,15,15,25,35,40,40,55,55 }; //不一样的速度
        firen->t2 = GetTickCount();
        if (firen->t2 - firen->t1 > firen->dt && firen->isboom == true)
        {
            if (firen->r < firen->maxr)
            {
                firen->r++;
                firen->dt = drt[firen->r / 10];
                firen->isdraw = true;
            }
            if (firen->r > firen->maxr - 1)
            {
                firen->isdraw = false;
                firen->isboom = false;
                //初始化烟花
                firen->r = 0;
                firen->maxr = 120;
 
            }
            firen->t1 = firen->t2;
            if (firen->isdraw = true)
            {
                for (double a = 0; a < 6.28; a += 0.01)
                {
                    for (int m = 0; m <= firen->r; m++)
                        //x1 y1 来自像素点的628个像素坐标
                    {
                        int x2 = firen->cx + m * cos(a);
                        int y2 = firen->cy - m * sin(a);
                        //如果数据正常,获取像素点的三原色系
                        if (x2 > 0 && x2 < 240 && y2 > 0 && y2 < 240)
                        {
                            int b = firen->xy[x2][y2] & 0xff;
                            int g = (firen->xy[x2][y2] >> 8) & 0xff;
                            int r = firen->xy[x2][y2] >> 16;
                            //求圈上的点在窗体上的坐标
                            int xx2 = firen->x + m * cos(a);
                            int yy2 = firen->y - m * sin(a);
                            if (/*b > 0x20 && g > 0x20 && r > 0x20 &&*/ xx2 < 1200 && xx2 > 0 && yy2 > 0 && yy2 <= 600)
                            {
                                pmem[yy2 * 1100 + xx2] = BGR(firen->xy[x2][y2]);
                            }
                        }
                    }
                }
                firen->isdraw == false;
            }
        }
    }
}
 
 
int ss = 0;
int Fire_Finally()       //烟花主函数
{
    initgraph(1100, 800);
    srand(time(0));
/*-----------------------------------------图片------------------------------------*/
    jet_init(&jet);
    loadimage(&jet.img, L"烟花弹2.jpg", 20, 50);
    putimage(jet.x, jet.y, &jet.img, SRCINVERT);
 
    DWORD* pmem = GetImageBuffer();
    BeginBatchDraw();
 
    while (1)
    {
        for (int clr = 0; clr < 1000; clr++)
        {
            for (int j = 0; j < 2; j++)
            {
                int px1 = rand() % 1200;
                int py1 = rand() % 650;
                if (py1 < 790)
                {
                    pmem[py1 * 1200 + px1] = pmem[py1 * 1200 + px1 + 1] = BLACK;
                }
            }
        }
        fire_text(&jet, &fire);
        FlushBatchDraw();
    }
    EndBatchDraw();
 
    closegraph();
 
    return 0;
}
 
int main()
{
    Fire_Finally();
    system("pause");
    return 0;
}

这是一个烟花连续放的程序,如果要更多的烟花道理相同,如果不想自己写可以私信我哦。

总结

到此这篇关于c++实现新年烟花效果完整代码的文章就介绍到这了,更多相关c++新年烟花内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV如何提取图片中曲线

    OpenCV如何提取图片中曲线

    这篇文章主要为大家详细介绍了OpenCV如何提取图片中曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C++实现KFC点餐系统

    C++实现KFC点餐系统

    这篇文章主要为大家详细介绍了C++实现KFC点餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言之函数返回值与参数传递案例教程

    C语言之函数返回值与参数传递案例教程

    这篇文章主要介绍了C语言之函数返回值与参数传递案例教程,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 一文让你不再害怕指针之C指针详解(经典,非常详细)

    一文让你不再害怕指针之C指针详解(经典,非常详细)

    这篇文章主要给大家介绍了C指针的相关资料,文中介绍的很经典,非常详细,文中通过示例代码介绍的非常详细,对大家学习或者使用C指针具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • VC判断一个文件为目录的方法

    VC判断一个文件为目录的方法

    这篇文章主要介绍了VC判断一个文件为目录的方法,在Windows应用程序设计中非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • 文件编译时出现multiple definition of ''xxxxxx''的具体解决方法

    文件编译时出现multiple definition of ''xxxxxx''的具体解决方法

    以下是对文件编译时出现multiple definition of 'xxxxxx'的解决方法进行了详细的分析介绍,如也遇到此问题的朋友们可以过来参考下
    2013-07-07
  • C++函数模板的使用详解

    C++函数模板的使用详解

    大家好,本篇文章主要讲的是C++函数模板的使用详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C语言内存函数的使用及其模拟实现

    C语言内存函数的使用及其模拟实现

    这篇文章主要介绍了C语言内存函数的使用及其模拟实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 使用C语言操作树莓派GPIO的详细步骤

    使用C语言操作树莓派GPIO的详细步骤

    今天抽空给大家普及使用C语言操作树莓派GPIO的详细步骤,本文大概分五步给大家介绍树莓派GPIO安装步骤,首先需要安装GPIO库然后进行一步步设置,具体操作方法跟随小编一起学习吧
    2021-06-06
  • OpenCV实现视频绿幕背景替换功能的示例代码

    OpenCV实现视频绿幕背景替换功能的示例代码

    这篇文章主要介绍了如何利用OpenCV实现视频绿幕背景替换功能,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以学习一下
    2023-02-02

最新评论