【ダイエット支援】今後の機能追加について

一通り食事管理機能は完成したのですが、

正直、いまいち使いづらいです。

数値を毎回入力しなければならないので。

過去に入力したデータを再利用できないかな、と思っているのですが、

調べてみると、HTMLのinputタグにはtype=searchというものがありまして、

                                <input type="search" v-model="contents.item" autocomplete="on" list="keyword"/>
                                <datalist id="keyword">
                                    <option value="札幌" />
                                    <option value="札駅" />
                                    <option value="新さっぽろ" />
                                    <option value="東札幌" />
                                    <option value="札束" />
                                </datalist>

こんな感じでautocomplete=”on” list=”キーワード”と記入すると、

こんな感じでdatalistタグのid=”キーワード”の内容が入力候補として表示されます。

これをうまく使えないかと。

品名の一部を入力→入力履歴を検索→候補を表示→履歴からデータを入力

という感じで、うまく処理できないかと思っています。

データベース

本来なら栄養素情報を別テーブルにしてそれを参照するという、正規化が必要なのだと思いますが、

いまからデータベースに変更を入れるのは、既存機能の大規模改修が発生(めんどくさい)ので、

それはそのままに、履歴検索用のテーブルを用意することにします。

それがあれば、入力履歴検索用のAPIを作成すれば行けるような気がします。

UI

datalistの中のoptionタグがv-forでリストを反映させることができると思います。

ただ、大量のoptionが画面に表示されても鬱陶しいので、例えば、検索結果が10件以上だったらあえて表示させない、というのも、一つの手かもしれません。

とりあえず、こんな方針でやってみますか。

次回から着手します。

【Cocos2d-x】画像を使用する

今回は画像を使ってみます。

画像はスプライトと呼ばれる単位で扱われます。

例えば、ただ画面に画像を表示する場合は、

bool SampleScene::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("pipo-charachip001b.png");
    if (sprite == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }
    return true;
}

画像をResources/res配下に設置し、

Sprite::create(“[画像ファイル名]”)スプライトの作成。

setPosition()で表示位置を決めてaddChild()でスプライトを設置すれば表示されます。

でも大抵は一枚の絵の中にいくつものパーツがまとめられているのが普通です。

なので、画像をクリッピングして、一部だけを表示させます。

    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("pipo-charachip001b.png", Rect(0,0,32,32));
    if (sprite == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }

    auto sprite2 = Sprite::create("pipo-charachip001b.png", Rect(0,32,32,32));
    if (sprite2 == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite2->setPosition(Vec2(visibleSize.width/2 + origin.x + sprite->getContentSize().width, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite2, 0);
    }
    return true;

じゃあ、これを使って、アニメーションさせます。


    auto sprite = Sprite::create("pipo-charachip001b.png");
    if (sprite == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }

    Vector<SpriteFrame*> animFrames;
    animFrames.reserve(12);
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,0,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,0,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,0,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,32,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,32,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,32,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,64,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,64,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,64,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,96,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,96,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,96,32,32)));

    Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.1f);
    Animate* animate = Animate::create(animation);

    sprite->runAction(RepeatForever::create(animate));

    auto moveBy = MoveBy::create(2, Vec2(50, 0));
    sprite->runAction(moveBy);

    return true;

SpriteFrameを組み合わせてAnimationを作成し、それからAnimateを作成します。

これからアクションを作成して、実行させます。

なかなか良い感じじゃないですか?

やっぱりハイスペックである必要は無いということ。

Pixel3からPixel4aに乗り換えたのですが、

非常に快適に動作しております。

Pixel3で動いていたアプリはほとんど動きますし、

最近始めた、戦国RENKAも問題無く動いております。

こういった3Dゲームでも問題ありません。

Pixel3のプロセッサーはSnapdragon 845であるのに対して、

Pixel4aのプロセッサーはSnapdragon 730Gです。

8XX番代はハイエンドプロセッサーにつけられる番号で、

7XX番代はミドルレンジプロセッサーにつけられる番号です。

この下には6XX番代もあり、これは低価格帯のスマホで使用されているプロセッサーです。

845と730Gは730Gの方が一世代新しいのですが、ハイエンドの845よりも快適に動いているように感じます。

おそらく、これはメモリ容量の差だと思うんですが、

それを考えると、いままではハイエンドの性能を生かし切れていなかったような気がしています。

やっぱり一般人にはハイスペックなんて必要なかった。

性能を生かし切れていない高い端末を買うよりも、安価でそこそこ動く端末の方がお買い得だと思いませんかね?

そう考えると、Pixel4aのコスパは最強で、低価格スマホで失敗するよりは、多少お金を積んでもPixel4aを勧めます。

ほんと、欠点は防水じゃ無いぐらいしか見つからない。

歩きすぎて足が痛い

こないだの土曜日、

時間があるから、病院(中央図書館付近)からすすきのまで歩いて帰り(この時点ですでに10000歩)

その日の午後、何を思ったか散歩に出かけ、

20000歩オーバーしました。

そのせいか、昨日から足が痛いです。

痛いというか、左足に違和感がある感じです。

骨じゃ無いんだろうな、筋肉なんだろうな。

昨日はそれでも散歩に出かけて、足が痛くなって途中でリタイア。

今日は大人しく自宅で足を休ませています。

散歩の途中で見つけたキノコとアサヒビール園のジンギスカン。

沢山食ったけど、思ったより体重増えてなかった。

【クラフトピア】無限繁殖機構

こちらのサイトに無限繁殖機構が紹介されていました。

https://wikiwiki.jp/craftopia/

リンク先は絵になってわかりづらいと思いますが、

要は、このように配置するみたいです。

矢印はコンベアーの動く向きです。

こうすることで牛が繁殖機に集まることになり、

自ら繁殖機の上に乗ってくれます。

上に積み重なっていくのは何でだろうねぇ?

もうちょっと細工すれば溢れた動物を処理できるかも。

【北海道大戦】メインシーンの作り直し

前回までの状況はこちら。

はい、大幅に書き換えました。

詳細はgitHubのソースを見て欲しいのですが、

https://github.com/takishita2nd/HokkaidoWar

まず、メインシーンで使用していたデータは全てGameDataクラスに移動しました。

    class GameData
    {
        public enum GameStatus
        {
            None,
            SelectCity,
            ActionEnemy,
            ActionPlayer,
            ShowResult,
            GameEnd,
            GameOver
        }

        public GameStatus gameStatus = GameStatus.None;
        public List<City> Cities = null;
        public List<City> AliveCities = null;
        public Battle Battle = null;
        public Player Player = null;

このクラスはシングルトンで管理します。

    class Singleton
    {
        private static GameData _gameData = null;

        public static GameData GetGameData()
        {
            if (_gameData == null)
            {
                _gameData = new GameData();
            }
            return _gameData;
        }

このシングルトンクラス、ゲッターのでいいんじゃないかと思い始めた。

やっていることは同じですが。

メソッドでやるか、プロパティでやるかの違いです。

気が向いたら直します。

シーン遷移は全てシーンクラスのインスタンスを作り直します。

            if (asd.Engine.Mouse.LeftButton.ButtonState == asd.ButtonState.Push)
            {
                var scene = new MainScene();
                asd.Engine.ChangeScene(scene);
            }

そのときに、ゲームデータを元に画面を作り直す、という感じです。

これで、バトルシーンからメインシーンに切り替わっても、ゲームが止まることは無くなりました。

これでやっと次に進める・・・。

【クラフトピア】羊を繁殖させてみる

繁殖機という設備がクラフトできたので、使ってみました。

繁殖機の上に赤い部分が二つあるので、ここに動物を運ぶと、繁殖機が動物を産みだしてくれます。

とは言っても無限ではないので、繁殖元の動物が死ぬと、繁殖機の動きが止まります。

あと、動物を運ぶのには、モンスタープリズムというアイテムが必要です。

はい、あのポケモンのあの丸いボールのような物です。

ある程度ダメージを与えて、このボールをぶつけると動物を捕まえることができ、好きなところに出現させることができます。

とりあえず、逃げないように囲って、繁殖場を作ってみたのですが、

勝手に動物が繁殖機に乗ってくれるような仕組みって無いんですかね?

あと、繁殖させた動物を処理する仕組みも考えてみたのですが、

コンベアーが燃えてしまいました。

壁も木材使うと燃えるので、これもダメですね。

コンベアーで上に運んで焚き火の上に落下させる方法が良いのかもしれない(確か、まだ作れない)

そろそろ次の文明に発展させるか・・・

【北海道大戦】バトルシーンを状態遷移に組み込んでみる。

前回作ったバトルシーンを、既存の状態遷移に組み込んでみました。

変更前はこんな感じでした。

結構複雑になってきましたね。

でも修正はそんなに難しくない・・・と思いきや。

どうやらシーンは切り替えるごとに作り直さなくちゃいけないらしくて

バトルシーンからメインシーンに切り替わるときに、OnUpdated()処理が走らないという。

おそらくシーンのプロパティにIsAliveというのがあって、

これはReadOnlyのプロパティなので、やっぱりシーンを作り直さなくちゃいけないんだろうなぁ、と思います。

ということは、ゲームデータはシーンとは別に保持しなくちゃいけなくて、

大幅に設計変更が発生しそう、

と分かった時に心が折れました。

まぁ、完成はさせたいので、時間があるときに修正しておきます。

自宅が職場に近いと、これだけメリットがあるんだぞっていう話。

というか、メリットしかない。

と言うのも、自分が過去にやらかしているから。

自分が東京で仕事していた頃、

東京都内は家賃が高いから、家賃の安い千葉県松戸市に住んでいました。

当時、通勤時間2時間かかってました。

朝定時に出社するために朝5時に起床し、終電まで仕事して家に着く頃には午前1時、という生活を当たり前のように送っていました。

当然、こんな職場にも問題はありましたが、

とにかく睡眠時間が取れないのがきつかった。

直近の職場、札幌では朝8時過ぎて家を出ても出社時間の9時には十分間に合っていたので、前者に比べれば歴然の差。

むしろ加齢で早く目が覚めてしまう方がきつかった。

とにかく、睡眠時間を確保するためにも、多少高くても狭くても職場に近い所に住むべき。

ということを学びました。

もう一つ。

東京って、満員電車がきつかった。

出社するだけで疲れてる。

長時間の満員電車で体力消耗するくらいなら、短い方が遙かに良い。

なんなら、電車使わなくても通勤できる方がいい。

東京でコロナの感染経路不明の感染者って、たぶん、電車の中で感染していると思います。

コロナ対策の面でも、通勤時間は減らすべき。

電車内で本読んだり勉強する時間が無い?

勉強は家でやれば良いだろう。

家を出る時間が遅くなる分勉強する時間は確保できているハズだ。

なんなら早く家を出て、おしゃれな喫茶店で朝活するのもいいだろう。電車の中で勉強するより遙かに快適だ。

とにかく、通勤で体を壊すという事態にはならないでもらいたい。