シーン遷移トランジション#1
https://gyazo.com/159b76b56710f654cca388566331da55
一言
なんだかちょっといい感じのシーン遷移です。
コード
code:Main.cpp
# include <Siv3D.hpp>
class RectSlide {
Size area; //シーンの大きさ
Array<Rect> rects; //長方形たち
Array<ColorF> colors; //色
public:
RectSlide(Size s,int32 kazu = 30):area(s)
{
init(kazu);
};
//ランダムに色を設定する
ColorF randomcol() const{
double c = Random(0.3, 0.7);
if (RandomBool(0.8)) {
return ColorF(c);
}
c += 0.2;
if (RandomBool()) {
return ColorF(c, 1, c);
}
return ColorF(c, c, 1);
}
//長方形の形、色、数を初期化
void init(int kazu) {
rects.clear();
colors.clear();
Array<int32> p;
p << area.y;
for (auto i:step(kazu)) {
int32 num = p0 * Random(0.2, 0.8); p.remove_at(0);
}
int32 posy = 0;
for (auto n : p) {
rects << Rect{-area.x, posy, area.x, n};
posy += n;
colors << randomcol();
}
rects.shuffle();
}
//フェードアウト用
void drawFadeOut(double t) const{
for (const auto& i,rect :Indexed(rects)) { const double nt = Clamp((t - (double)i * 0.6 / rects.size()) * 2.5, 0.0, 1.0);
rect.movedBy(EaseInExpo(nt) * area.x, 0).draw(colorsi); }
}
//フェードイン用
void drawFadeIn(double t) const {
for (const auto& i, rect : Indexed(rects)) { const double nt = Clamp((t - (double)i * 0.6 / rects.size()) * 2.5, 0.0, 1.0);
rect.movedBy(area.x + EaseOutExpo(nt) * area.x, 0).draw(colorsi); }
}
};
struct GameData
{
int32 score = 0;
RectSlide rec = RectSlide{ Scene::Size()}; // 長方形のデータを共有する
};
using App = SceneManager<String, GameData>;
//シーン1
class Scene1 : public App::Scene
{
public:
Scene1(const InitData& init)
: IScene{ init }
{
}
void update() override
{
//Enterキーでシーン切り替え
if (KeyEnter.down())
{
getData().rec.init(30);
changeScene(U"Scene2",2.0s,CrossFade::No);
}
}
void draw() const override
{
FontAsset(U"SceneFont")(U"Scene1").drawAt(Scene::Center(), Palette::Aqua);
}
void drawFadeIn(double t) const override
{
draw();
getData().rec.drawFadeIn(t);
}
void drawFadeOut(double t) const override
{
draw();
getData().rec.drawFadeIn(1 - t);
}
};
// シーン2
class Scene2 : public App::Scene
{
public:
Scene2(const InitData& init)
: IScene{ init }
{
}
void update() override
{
//Enterキーでシーン切り替え
if (KeyEnter.down())
{
changeScene(U"Scene1");
}
}
void draw() const override
{
FontAsset(U"SceneFont")(U"Scene2").drawAt(Scene::Center(), Palette::Magenta);
}
void drawFadeOut(double t) const override
{
draw();
getData().rec.drawFadeOut(t);
}
void drawFadeIn(double t) const override
{
draw();
getData().rec.drawFadeOut(1- t);
}
};
void Main()
{
FontAsset::Register(U"SceneFont", 60, Typeface::Heavy);
App manager;
manager.add<Scene1>(U"Scene1");
manager.add<Scene2>(U"Scene2");
while (System::Update())
{
if (not manager.update())
{
break;
}
}
}
作者
BetAmoto