Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Siv3D.hpp> // OpenSiv3D v0.3.1
- class Fish
- {
- private:
- Vec2 m_start;
- Vec2 m_dest;
- double m_duration;
- Stopwatch m_sw;
- public:
- Fish() : Fish(RandomVec2(Window::ClientRect())) {}
- Fish(Vec2 pos)
- : m_start(pos)
- , m_dest(m_start)
- , m_duration(Random(0.0, 5.0))
- , m_sw(true) {}
- Vec2 getPos() const
- {
- return m_start.lerp(m_dest, EaseOutQuad(Min(m_sw.sF(), 3.0) / 3.0));
- }
- bool update()
- {
- if (m_sw.sF() > m_duration)
- {
- m_start = getPos();
- m_dest = RandomVec2(Window::ClientRect());
- m_duration = Random(1.0, 5.0);
- m_sw.restart();
- }
- return RandomBool((1.0 - Min(m_sw.sF(), 3.0)) * 0.05);
- }
- void draw() const
- {
- TextureAsset(U"fish").mirrored((m_dest - m_start).x > 0).scaled(0.5).drawAt(getPos());
- }
- };
- struct RippleEffect : IEffect
- {
- double m_size;
- double m_duration;
- Circle m_circle;
- RippleEffect(Vec2 pos)
- {
- m_size = Random(80.0, 100.0);
- m_duration = 3.0;
- m_circle.setPos(pos + RandomVec2(Circle(0, 0, 10)));
- }
- bool update(double timeSec)
- {
- double a = (1.0 - EaseOutSine(timeSec / m_duration)) * 0.4;
- double r = EaseOutSine(timeSec / m_duration) * m_size;
- m_circle.setR(r).drawFrame(2.0, ColorF(0.3, 0.4, 0.5, a));
- return timeSec < m_duration;
- }
- };
- class Tamo
- {
- private:
- const double m_size;
- Circle m_paper;
- RectF m_handle;
- RectF m_water;
- Transition m_transition;
- Stopwatch m_effect_sw;
- public:
- Tamo(double size)
- : m_size(size)
- , m_paper(size)
- , m_handle(Arg::leftCenter = Vec2{ 0, 0 }, Vec2{ size * 1.6, size * 0.4 })
- , m_transition(0.6s, 0.2s)
- , m_effect_sw(true)
- {}
- double getR() const { return m_size; }
- bool update()
- {
- m_transition.update(MouseL.pressed());
- m_water.set(Arg::bottomCenter = Vec2{ -m_size, m_size * 1.5 }, Vec2{ 2.5 * m_size, m_size * 1.1 * m_transition.easeInOut() });
- if (MouseL.pressed() && m_effect_sw > 0.3s)
- {
- m_effect_sw.restart();
- return true;
- }
- return false;
- }
- void draw()
- {
- const Transformer2D t1(Mat3x2::Translate(Cursor::PosF()));
- const Transformer2D t3(Mat3x2::Rotate(40_deg));
- const Transformer2D t2(Mat3x2::Scale(Vec2{ 1.0, 1.0 - 0.3 * m_transition.easeInOut() }));
- m_paper.draw(ColorF(0.8, 0.9, 1.0)).drawFrame(3.0, ColorF(0.3, 0.4, 0.5));
- const Transformer2D t4(Mat3x2::Translate(Vec2{ m_size , 0 }));
- m_handle.draw(ColorF(1.0, 0.5, 0.0));
- const Transformer2D t5(Mat3x2::Rotate(20_deg));
- m_water.draw(ColorF(0.6, 0.75, 1.0, 0.5));
- }
- };
- void Main()
- {
- Graphics::SetBackground(ColorF(0.6, 0.75, 1.0, 0.5));
- Tamo tamo(50);
- Effect effect;
- int score = 0;
- Font font(30);
- Array<Fish> fish(10, Arg::generator = []() { return Fish(); });
- TextureAsset::Register(U"fish", Emoji(U"\U0001F41F"));
- Stopwatch fish_arrival_sw(true);
- Texture background(U"example/windmill.png");
- const Audio se(U"example/shot.mp3");
- const Audio audio(U"example/test.mp3");
- audio.play();
- while (System::Update())
- {
- if (fish_arrival_sw > 1.0s)
- {
- fish << Fish(RandomVec2(Window::Width() + Window::Height()));
- fish_arrival_sw.restart();
- }
- if (tamo.update()) effect.add<RippleEffect>(Cursor::PosF());
- for (auto it = fish.begin(); it != fish.end();)
- {
- if (it->update())
- effect.add<RippleEffect>(it->getPos());
- if (MouseL.up() && Circle(Cursor::PosF(), tamo.getR()).contains(it->getPos()))
- {
- score++;
- se.play();
- it = fish.erase(it);
- }
- else
- it++;
- }
- Window::ClientRect()(background).draw(ColorF(1.0, 0.3));
- effect.update(); // draw
- fish.each([](const Fish& f) { f.draw(); });
- tamo.draw();
- const Transformer2D t1(Mat3x2::Translate(Vec2{ 10, 10 }));
- RoundRect(Vec2{ 0, 0 }, Vec2{ 150, 50 }, 10).draw(ColorF(1.0, 0.5));
- const Transformer2D t2(Mat3x2::Translate(Vec2{ 5, 5 }));
- TextureAsset(U"fish").resized(40, 40).draw(0, 0);
- font(U"x {}"_fmt(score)).draw(50, 0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement