IE盒子

搜索
查看: 131|回复: 0

C语言2700行代码!粒子系统 (Particle System) ,EasyX ...

[复制链接]

4

主题

7

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2023-1-5 19:10:38 | 显示全部楼层 |阅读模式
粒子系统的一个普遍公认的定义是:粒子系统由具有相同属性规则的微小个体组成,大量微小个体可以随机显示不同特征的粒子的集合体。
一、说明

基于 C++ 11EasyX 实现。
主要功能
内置一些简单的粒子行为。可以控制或修改相关属性,生成更加复杂和精彩的效果。
    ☁ 特效
    ☁ 粒子
    ☁ 发射器

二、运行截图









三、项目源码


源码有两个文件,ParticleSystem.h 和ParticleSystem.cpp
先看流程图:


用代码描述就是:
#include "ParticleSystem.h"
int main()
{
    constexpr float Width = 1024.0f;
    constexpr float Height = 576.0f;
    // step1:初始化【粒子系统】
    FParticleSystem& ParticleSystem = FParticleSystem::GetInstance()
            .SetName(_T("Particle System"))
            .SetVersion(2, 8, 1)
            .SetScreenSize({Width, Height})
            .InitInstance();
    // step2: 新建【粒子特效】或者跳过
    ParticleSystem.CreateParticleEffect(14)
            .SetFunction([](const float InDeltaTime, FParticleInstance& InParticleInstance)
            {
            // do everything you want
            InParticleInstance.Velocity =
            {
                FTool::GenerateRandomNumber(0, 10, 2.0f),
                -3.0f + FTool::GenerateRandomNumber(-5, 5, 2.0f)
            };
        })
        .SetKeyboard('N')
        .SetHelpContent(_T("Diy"))
        .SetIsShowHelp(true)
        .SetIsEnable(false)
        .Finish();
    // step3: 新建或复用【粒子模板】
    ParticleSystem.CreateParticleTemplate(1)
        .SetName(_T("样例粒子"))
        .SetDescription(_T("样例"))
        .SetShapeType(EShapeType::SolidCircle)
            // .SetShapeType(EShapeType::Image)
            // .SetImage(FTool::LoadImageA(_T("star.png"), 10))
        .SetColor({RGB(125, 125, 0), RGB(255, 255, 255), EGenerateType::RandColor})
        .SetStartLocation({0.0f, 0.0f})
        .SetStartSpeed({0.0f, 25.0f})
        .SetRadius({1.0f, 4.4f})
        .SetFriction({0.93f, 0.95f})
        .SetLifeTime({0.4f, 0.8f})
        .SetEffects(FVarNum(1), 14)
        .Finish();
    ParticleSystem.CreateParticleTemplate(2, 1)
        .SetShapeType(EShapeType::SolidCircle)
        .SetColor({RGB(125, 0, 125), RGB(255, 255, 255), EGenerateType::RandColor});
    ParticleSystem.CreateParticleTemplate(3, 1)
        .SetShapeType(EShapeType::SolidSquare)
        .SetColor({RGB(0, 125, 125), RGB(255, 255, 255), EGenerateType::RandColor});
    // step4: 新建或复用【发射器模板】
    ParticleSystem.CreateEmitterTemplate(1)
        .SetName(_T("样例发射器"))
        .SetDescription(_T("样例"))
        .SetSum(6666)
        .SetTime(0.0f)
        .SetLocation({Width * 0.5f, Height * 0.5f})
        .SetAngle({-90.0f, 90.0f})
        .SetSpeed(1)
        .SetIsLoop(true)
        .Finish();
    ParticleSystem.CreateEmitterTemplate(2, 1)
        .SetLocation({Width * 0.5f, Height * 0.5f}).Finish();
    ParticleSystem.CreateEmitterTemplate(3, 1)
        .SetLocation({Width * 0.5f, Height * 0.5f}).Finish();
    // step5: 生成【带多个粒子实例的发射器实例】
    ParticleSystem.CreateEmitterInstance(1).CreateParticleInstance(FVarNum(1), 1).Finish();
    ParticleSystem.CreateEmitterInstance(2).CreateParticleInstance(FVarNum(1), 2).Finish();
    ParticleSystem.CreateEmitterInstance(3).CreateParticleInstance(FVarNum(1), 3).Finish();
    // step6:【粒子系统】运行所有的【发射器实例】
    ParticleSystem.RunEmitterInstances();
    return 0;
}
可以看到,只需要设置好相关参数,就可以轻松使用粒子系统。
当然上面的例子只是演示,没有做什么效果(完结撒花),期待你们给出更好的样例。
而且呃,很多好玩且有用的参数和功能并未实现,不过之后会一直更新的~
但是由于完整过多,这里我就不全部贴出来了,需要的可以下方专栏介绍的裙里自行下载。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表