火の粉
https://scrapbox.io/files/646891d3300754001b1b524a.png
使い方
Sparks::update(); 描画する。
コード
code:火の粉.cpp
# include <Siv3D.hpp>
int32 interval(double& accumulator, double spawnTime) {
int32 n = 0;
accumulator += Scene::DeltaTime();
while (spawnTime <= accumulator)
{
accumulator -= spawnTime;
++n;
}
return n;
}
class Sparks {
Effect effect;
double accumulator = 0;
struct SparkEffect : IEffect
{
//sparkの範囲は多めにとる(画面外から火の粉が来ないと違和感)
Vec2 spark{ Random(Scene::Size().x + Scene::Size().x / 2) - Scene::Size().x / 4, Scene::Size().y + 10 };
Vec2 target{};
Vec2 velocity{ 0, 0 };
double accumulator = 0.5;
bool update(double t) override
{
if (interval(accumulator, 0.5))
{
//targetの範囲は多めにとる(画面の中心に火の粉が向かっていかないように)
target = { Random(Scene::Size().x + Scene::Size().x/2) - Scene::Size().x/4, -200 };
}
spark = Math::SmoothDamp(spark, target, velocity, 1,500);
Circle circle{ spark ,3 };
circle.draw(Palette::Red);
return spark.y > -circle.r;
}
};
public:
void update() {
if (interval(accumulator, 0.1))
{
effect.add<SparkEffect>();
}
effect.update();
}
};
void Main()
{
Scene::SetBackground(Palette::Black);
Sparks sparks;
while (System::Update())
{
Rect{ 0,300,800,300 }.draw(Arg::top = Palette::Black, Arg::bottom = Palette::Red);
sparks.update();
}
}