LoginSignup
8
7

More than 5 years have passed since last update.

育成ゲームを作ったはなし

Last updated at Posted at 2018-12-04

クラゲを飼育するゲーム

Jellyfish

本物に見えるクラゲを作ってみました。

ダウンロード

端末
Android
Kindle
Windows

操作方法

画面タップで画面上部から餌が出ます。
以上です。

イベント

クラゲに餌を与えないといつか死にます。
時間経過でクラゲが成長します。

くそゲーです。

ソース

開発

言語はC++で作っています。
Visual Studio 2017のVisual C++で作っています。
いわゆるAndroid NDKです。

メインコード

※公開以来ソースコードをいじっていないのでちょっと古い書き方をしているかもしれないです。

#define ASLIB_INCLUDE_DL
#include <AsLib.hpp>

//ペットの管理
struct Pet {

    std::string name = u8"Jelly";
    //UI
    AnimeUI ui;
    //体力
    float hp = 100;
    //泳ぐ速さ
    Pos2F speed = { 0.6f,0.6f };
    //目的対象との距離
    float dis = 0.0f;

    Pet() = default;
    Pet(const AnimeMainData* add_tmd, const uint8_t add_alpha, const Pos4& add_pos4, const float hp_) :ui(add_tmd, add_alpha, add_pos4), hp(hp_) {}
    Pet(const AnimeMainData* add_tmd, const uint8_t add_alpha, const PosA4F& add_pos4, const float hp_) : ui(add_tmd, add_alpha, add_pos4), hp(hp_) {}
    //const Pet& tmd(const AnimeMainData* const add_tmd) { ui. = add_tmd; }

    Pet& move(std::vector<AnimeUI>& food)
    {
        //餌があるか調べ、もし餌があったら最小距離の餌へ移動する
        size_t dis_id = 0;
        if (searchMin(food, this->ui.PosF(), dis_id, &this->dis) == -1) {
            this->ui.addPosF(speed.moveHypot(ui.Rota()));
            this->ui.setPosF(asWindowSizeF());
            return *this;
        }
        const Pos2F p(((food[dis_id].PosF().x < this->ui.PosF().x) ? this->speed.x*(-1) : this->speed.x), ((food[dis_id].PosF().y < this->ui.PosF().y) ? this->speed.y*(-1) : this->speed.y));
        //餌の方向に向かって移動する
        this->ui.setRota(atan2(p.x, -p.y), 0.025f);
        this->ui.addPosF(speed.moveHypot(ui.Rota()));
        this->ui.setPosF(asWindowSizeF());

        //餌を食べる
        if (this->dis < ((ui.PosF().h > ui.PosF().w) ? ui.PosF().w / 6.0f : ui.PosF().h / 6.0f)) {
            food.erase(food.begin() + dis_id);
            this->hp += float(asRand32(100)) / 10.0f;
            if (this->hp > 100.0f) this->hp = 100.0f;
        }
        return *this;
    }
};

int32_t asMain()
{
    MainControl as(u8"Jellyfish", Pos2(540,960), ColorRGB(0, 0, 0));
    //画像ファイル
    const AnimeMainData petA(32, asLoadTex(u8"P/Pet/pet.png", 8, 4));
    const AnimeMainData foodA(1, asLoadTex(u8"P/Pet/food.png", 1));
    //const AnimeMainData twitterA(1, asLoadTex(u8"P/SNS/twitter.png", 1));

    PosA4F p_a4(1000.0f, 300.0f, 100.0f, 100.0f);
    PosA4F def_a4(p_a4);
    float hp_def = 100.0f;
    time_t time_def;

    asReadPos(u8"jelly_0_size_0.dat", p_a4);
    asReadFloat(u8"jelly_0_hp_0.dat", hp_def);
    if (asReadTime(u8"time_0.dat", time_def) == -1) time_def = time(nullptr);
    const float time_float = float((time(nullptr) - time_def));
    hp_def -= time_float * 0.0002f;
    p_a4.w += time_float * 0.000004f;
    p_a4.h += time_float * 0.000004f;

    //ペット
    Pet pet(&petA, 200, p_a4, hp_def);
    //餌
    std::vector<AnimeUI> food;

    FontMainData font(asMakeFont(asWindowSize().x / 16));

    //メインループ
    while (as.loop())
    {
        font.drawAt(u8"Name: %s", Pos2(asWindowSize().x / 2, asWindowSize().x / 16), ColorRGBA(100, 100, 200, 255), pet.name.c_str());
        font.drawAt(u8"Hp: %d", Pos2(asWindowSize().x / 2, asWindowSize().x * 2 / 16), ColorRGBA(100, 100, 200, 255), int32_t(pet.hp + 0.5f));
        font.drawAt(u8"Size: %f", Pos2(asWindowSize().x / 2, asWindowSize().x * 3 / 16), ColorRGBA(100, 100, 200, 255), pet.ui.PosF().w);

        pet.hp -= 0.000004f;
        if (pet.hp < 0.0f) { pet.ui.setPosF(def_a4); pet.name = "Jelly"; pet.hp = 100.0f; }
        pet.move(food).ui.fpsUpdate().addSizeF(0.000004f, 2000.0f).addRota(0.0f).drawRF();
        for (size_t i = 0; i < food.size(); ++i) {
            //餌がウィンドウ外に出たら餌を消す
            if (food[i].addPosF(0.0f, 0.3f).addRota(0.005f).drawRF().isOutWindowF()) { food.erase(food.begin() + i); --i; }
        }
        //タッチされたら餌を出す
        if (as.isUp()) {
            food.emplace_back();
            food[food.size() - 1].setUI(&foodA, 100, PosA4F(float(as.touchPos().x), 0.0f, 30.0f, 30.0f));
        }
    }

    asWritePos(u8"jelly_0_size_0.dat", pet.ui.PosF());
    asWriteFloat(u8"jelly_0_hp_0.dat", pet.hp);
    asWriteTime(u8"time_0.dat", time(nullptr));
    return 0;
}

ソースコードは煮るなり焼くなり好きにしてください。

おわり

アプリ制作は楽しい。

ソースコードのライセンス

These codes are licensed under CC0.
CC0

この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。

次の記事

RPGツ◯ールをツクール👾

RPGメイキングツールを作ったよ!

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7