合計 昨日 今日

オブジェクト管理システムについて

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: asahi
[URL]
Date: 2018年2月03日(土) 18:57
No: 1
(OFFLINE)

 オブジェクト管理システムについて

初めて投稿させていただきます。

https://qiita.com/hart_edsf/items/a64ce3d149b5490239fb

このページを参考にオブジェクト管理システムを作ろうと思うのですが、IObjectの派生クラスから他のIObjectの派生クラスへ参照する場合、どのような記述をする必要がありますか?

よろしければサンプルコードをいただけないでしょうか?
よろしくおねがいします。

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月03日(土) 21:07
No: 2
(OFFLINE)

 Re: オブジェクト管理システムについて

ObjectManagerに引数を検索キーにしてIObjectのポインターを返すメンバー関数を用意すれば良いかと思います。

Name: asahi
[URL]
Date: 2018年2月03日(土) 21:58
No: 3
(OFFLINE)

 Re: オブジェクト管理システムについて

ご返答ありがとうございます!

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
    std::shared_ptr<IObject> *FindIObject(std::string arg_ClassName)
    {
        for (auto obj : ObjList)
        {
            if(std::equal(obj->ClassName.begin(), obj->ClassName.end(), arg_ClassName.begin(), arg_ClassName.end()))
                return &obj;
        }
    }

これをObjectManagerで定義しました。

自分のC++の理解が浅くてよくわからないのですが、これをIObjectの派生クラスから呼び出す場合にはどのような記述が必要ですか?

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月03日(土) 22:53
No: 4
(OFFLINE)

 Re: オブジェクト管理システムについて

派生クラスにObjectManagerと検索キーを引数にするメンバー関数を作ればよいかと思います。

Name: asahi
[URL]
Date: 2018年2月03日(土) 23:19
No: 5
(OFFLINE)

 Re: オブジェクト管理システムについて

ご返答ありがとうございます。
コード[C++]: 全て選択
1
2
3
4
    std::shared_ptr<IObject> GetIObject(ObjectManager arg_ObjManager, std::string arg_ClassName)
    {
        arg_OjbManager.FindIObject(arg_ClassName);
    }


あってるかどうかわかりませんがこのようにIObjectの派生クラスに定義しました。
引数に渡すObjectManagerの実態はどのように派生クラスにもってくればいいでしょうか。

Name: usao
[URL]
ハッカー(142,819 ポイント)
Date: 2018年2月04日(日) 10:58
No: 6
(OFFLINE)

 Re: オブジェクト管理システムについて

Offtopic :
目指すところ,というか,解決すべき事柄は何なのだろう?

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月04日(日) 11:16
No: 7
(OFFLINE)

 Re: オブジェクト管理システムについて

元のQiitaの記事では、ObjectManager mgr;で定義されています。これはゲームの設計次第のところがあって、ただ一つの正解というものはないです。ゲームオブジェクトを全部管理する一つだけのObjectManagerでも良いですし、オブジェクトの種類ごとに用意してもよいです(plaeyer_mgr,enemy_mgr)。個人的には後者です。

Name: TKS
[URL]
Date: 2018年2月04日(日) 11:26
No: 8
(OFFLINE)

 Re: オブジェクト管理システムについて

>引数に渡すObjectManagerの実態はどのように派生クラスにもってくればいいでしょうか。
好みの問題だと思いますが、
自分はObjectManager自体もIObjectにして、ObjectManagerを管理するObjectManagerを許容する構造が好きですね。
この場合は元記事と同じようにWinMain関数にルートとなるObjectManagerを一個作り、後は各層で必要に応じて管理クラスを拡張できます。

Name: asahi
[URL]
Date: 2018年2月04日(日) 11:39
No: 9
(OFFLINE)

 Re: オブジェクト管理システムについて

usao さんが書きました:
Offtopic :
目指すところ,というか,解決すべき事柄は何なのだろう?


IObjectの派生クラスから別のIObjectの派生クラスの関数をよびだしたいです。
プレイヤークラスから、エネミークラスの座標を取得するなどです。

Name: asahi
[URL]
Date: 2018年2月04日(日) 11:44
No: 10
(OFFLINE)

 Re: オブジェクト管理システムについて

参照魚 さんが書きました:元のQiitaの記事では、ObjectManager mgr;で定義されています。これはゲームの設計次第のところがあって、ただ一つの正解というものはないです。ゲームオブジェクトを全部管理する一つだけのObjectManagerでも良いですし、オブジェクトの種類ごとに用意してもよいです(plaeyer_mgr,enemy_mgr)。個人的には後者です。


ObjectManagerをプレイヤークラスで一つ、エネミークラスで一つ定義していくということですか?
それだとすべて解決しそうです!
試したら報告させていただきます。

Name: 参照魚
[URL]
ぴよぴよ(957 ポイント)
Date: 2018年2月04日(日) 12:02
No: 11
(OFFLINE)

 Re: オブジェクト管理システムについて

ObjectManagerもオブジェクトの種類ごとに派生、FindObjectを仮想関数にすれば、オブジェクトによって検索方法をカスタマイズできます。もしそうするならObjectManagerはその派生オブジェクトの静的メンバー変数にもできます。
コード[C++]: 全て選択
1
2
3
4
class EnemyObject : public IObect {
public:
 static EnemyObjectManager mgr;
};

Name: usao
[URL]
ハッカー(142,819 ポイント)
Date: 2018年2月04日(日) 12:42
No: 12
(OFFLINE)

 Re: オブジェクト管理システムについて

Offtopic :
そのObjectManagerとかいうのは,要するに,
「update()だのdraw()だのをまとめてコールする役目の物」なんだと思うけど,
それ以外の事柄に関しては(ObjectManagerというのを間に介さずに)普通に書けばよいのでは…?


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[15人]