「技術」カテゴリーアーカイブ

【農場経営ゲーム】各画面の作成

https://github.com/takishita2nd/FarmGame/tree/develop

本当はトランジション処理を入れたかったんだけど、

なんかエラーで動かない・・・

解決方法がわからないので、とりあえず放置。

(GitHubを覗いてみたけど、ドキュメント・サンプル作成中らしい)

https://github.com/altseed/Altseed2/issues/653

今はトランジションを使わない処理にしておきます。

【デザインパターン】Commandパターン

Commandパターンのサンプルコードです。

package org.example.command;

public interface Command {
public void execute() throws Exception;
}
package org.example.command;

public class Receiver {
public void action()
{

}
}
package org.example.command;

public class ConcreteCommand implements Command{
@Override
public void execute() throws Exception {
Receiver receiver = new Receiver();
receiver.action();
}
}
package org.example.command;

public class Main {
public static void main(String[] args)
{
Command command = new ConcreteCommand();
try {
command.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
}

CommandパターンはReceiverに対する命令(Command)をオブジェクト化して使用します。

こうすることによって、命令のバッチ処理、履歴保存ができます。

undo/redo処理を実装する場合もこのパターンを適用する場合が多いです。

【農場経営ゲーム】ボタンを作り始めた。

https://github.com/takishita2nd/FarmGame/tree/develop

ボタンの画像を作成。

ボタンをクラス化して、ボタンの上にマウスを置いたときと、マウスをクリックしたとき、画像を切り替えるようにしました。

次は、下のボタン達は共通している処理なので、ここをまとめて一つのクラスに処理をまとめたいと思います。

それを各シーンで使用して、共通の動作になるようにしたい。

たぶん、シーンの切り替えのみの処理だから。

【北海道大戦2021】リンク情報のチェック

https://github.com/takishita2nd/HokkaidoWar/tree/2021_develop

そういえば、まだデータのチェックやっていなかったな、と思って、

こんなコードを書きました。

    protected override void OnUpdated()
    {
        asd.Vector2DF pos = asd.Engine.Mouse.Position;

        var maps = Singleton.FieldMap.GetAllMaps();
        foreach(var map in maps)
        {
            if(map == null)
            {
                continue;
            }

            if(map.IsOnMouse(pos))
            {
                map.GetCity().PaintAttackColor();
                foreach(var linkedMap in map.GetLinkdMap())
                {
                    linkedMap.GetCity().PaintDeffenceColor();
                }
                break;
            }
            else
            {
                map.GetCity().ClearPaint();
            }
        }

都市間のリンクデータを確認するプログラムです。

こんな感じで確認しました。

まぁ、手ででーたを入力していたわけで、

データミスが一箇所見つかりました。

めんどくさいことだけど、放置するともっとめんどくさいことになるから、めんどくさくてもやらなくちゃ行けないのです。

【農場経営ゲーム】画面を作り始めた。

https://github.com/takishita2nd/FarmGame

とりあえず、ボタンを配置してみた。

ボタンは下記リンク先のフリー素材を使用しています。

https://kopacurve.blog.fc2.com

ボタン+テキスト配置で作成したけど、たぶん、文字の入ったボタンを作った方が良いような気がする。

位置合わせがめんどくさい。

あ、そうそう、今回はAltseed2を使用しています。

.NEt Coreで動作するゲーム用ライブラリです。

農場経営ゲームを作ってみる

とりあえず、こんなものをサクッと考えてみた。

メイン画面

  • 各画面への移動
  • 所持金
  • 体力(1日に何回行動できるか)
  • 天気
  • 進捗状況

農場画面

  • 畑に種をまいて、育てて収穫する。
  • 種は、収穫物から回収・市場で購入することで入手。
  • お世話作業をすることで管理を行う
  • 時間経過とともに成長度が増加し、100%を超えたときに収穫できる。
  • 管理状態によって収穫物の品質が変化する。
  • 畑は市場で購入することで拡張できる。

牧場画面

  • 牛や鶏を飼うことができる。
  • 牛や鶏は市場で購入できる。
  • エサを与えることで成長度がアップし、100%に達すると畜産物を収穫できる。収穫後は成長度が0に戻る。
  • エサは市場で買うか、加工場で農作物から作成できる。
  • エサやお世話作業によって畜産物の品質が変化する。

市場画面

  • お金を使用して様々なアイテムを購入することができる。
  • (種、畑の拡張、動物、加工に必要なアイテムなど)

加工場画面

  • 農作物や畜産物を使用して別のアイテム(加工品)を作成する。

お店画面

  • 農作物、畜産物、加工品を商品棚に並べて、販売する。
  • 商品棚に並べた商品は時間経過で自動的に販売される。
  • 販売価格は品物と品質によって変化する。

能力画面

  • プレイヤーの能力値を確認できる。
  • プレイヤーには農業レベル、酪農レベル、加工レベル、経営レベルがある。
  • 農業レベルが高いと、農場でのお世話作業の効率がアップする。
  • 酪農レベルが高いと、牧場でのお世話作業の効率がアップする。
  • 加工レベルが高いと、加工品の品質がアップする。
  • 経営レベルは売り上げによってレベルアップし、作業回数が増える。

こんな感じで、着手開始します。

【COCOS2D-X】クエストリストをスクロールしすぎないように調整する。

https://github.com/takishita2nd/cocos2d-x_sample

こんなかんじになりました。

今回はスクロール処理にもう少し手を加えて、

スクロールしすぎないようにストッパ処理を追加しました。

    if(questListMenu.isShow)
    {
        // Yの差分だけメニューを動かす
        float divY = touch->getLocation().y - keepPosition.y;
        auto visibleSize = Director::getInstance()->getVisibleSize();
        Vec2 origin = Director::getInstance()->getVisibleOrigin();

        if(questListMenu.questListMenu[0].parts.point.y - questListMenu.questListMenu[0].parts.size.height + divY < visibleSize.height)
        {
            for(int i = 0; i < QUEST_NUM; i++)
            {
                questListMenu.questListMenu[i].parts.point = Vec2(questListMenu.parts.point.x, questListMenu.parts.point.y - questListMenu.questListMenu->parts.sprite->getContentSize().height * (i + 1));
                questListMenu.questListMenu[i].parts.sprite->setPosition(questListMenu.questListMenu[i].parts.point);
                questListMenu.questListMenu[i].questName.point = Vec2(questListMenu.questListMenu[i].parts.point.x + questListMenu.questListMenu[i].parts.size.width / 30.0, questListMenu.questListMenu[i].parts.point.y);
                questListMenu.questListMenu[i].questName.label->setPosition(questListMenu.questListMenu[i].questName.point);
            }
        }
        else if(questListMenu.questListMenu[QUEST_NUM - 1].parts.point.y + divY >= origin.y)
        {
            int listcount = 0;
            for(int i = QUEST_NUM - 1; i <= 0; i--)
            {
                questListMenu.questListMenu[QUEST_NUM - 1].parts.sprite->setPosition(questListMenu.questListMenu[i].parts.point.x, questListMenu.questListMenu[0].parts.point.y * listcount + origin.y);
                questListMenu.questListMenu[QUEST_NUM - 1].parts.point.y = questListMenu.questListMenu[0].parts.point.y * listcount + origin.y;
                questListMenu.questListMenu[QUEST_NUM - 1].questName.label->setPosition(questListMenu.questListMenu[i].questName.point.x, questListMenu.questListMenu[0].parts.point.y * listcount + origin.y);
                questListMenu.questListMenu[QUEST_NUM - 1].questName.point.y = questListMenu.questListMenu[0].parts.point.y * listcount + origin.y;
                listcount++;
            }
        }
        else
        {
            for(int i = 0; i < QUEST_NUM; i++)
            {
                questListMenu.questListMenu[i].parts.sprite->setPosition(questListMenu.questListMenu[i].parts.point.x, questListMenu.questListMenu[i].parts.point.y + divY);
                questListMenu.questListMenu[i].parts.point.y = questListMenu.questListMenu[i].parts.point.y + divY;
                questListMenu.questListMenu[i].questName.label->setPosition(questListMenu.questListMenu[i].questName.point.x, questListMenu.questListMenu[i].questName.point.y + divY);
                questListMenu.questListMenu[i].questName.point.y = questListMenu.questListMenu[i].questName.point.y + divY;
            }
        }

        keepPosition.y += divY;
    }

考え方としては、

リストの先頭が画面上部のサイズから下に移動しそうなときは初期位置に設定する、

リストの最後が画面の下から上にいs¥どうしそうなときは下からリストを並べる、

といった感じです。

じゃあ、次はタップで選択処理だな。