GameContext?[C++]

moba
記事: 82
登録日時: 9年前

GameContext?[C++]

投稿記事 by moba » 9年前

 ISLeさんのおっしゃるGameContextについて知りたいです。ピンポイントなので日記側から間接的に質問させていただきました。もしもご存じの方がいらっしゃれば、教えていただけると助かります_(._.)_
 質問掲示板で「GameContext」で検索すると、こちらがヒットします。クラス間でのデータの受け渡しについて
 僕が質問した際のご回答はこちらです。

 これで分かればいいのですが、実装で困りました。そこで、自分のコードで試そうとしました。クラスの上下関係はこんな感じです。

CODE:

GameParent
 - MapManager
   - MapDrawer
   - MapData  etc.
 - MapObjectsManager
   - ActorsManager
     - ActorsList etc.
   - ItemAndTrapManager
 - BGMManager
 - InputManager
 ここで、例えばMapObjectsがMap絡みのオブジェクトについて知りたいときに、GameContextを渡されていれば、下記のように書けるということだと思います。

CODE:

MapData* data = GetGameContext()->GetMapContext()->GetMapData();
data->GetMapSize( &width, &height );
...
■疑問点
 GameParentの下につくオブジェクト(Map, MapObjects, BGM, Input)をどのContextに入れるか。
 例えばMapManagerオブジェクトをGetGameContext()->GetMapManager()として得るか、
 GetGameContext()->GetMapContext()->GetMapManager()と書いて得るようにするか。

■問題点

1.誰がオブジェクトの所有権(deleteする責任の意味)を持つか、
 いつ誰がContextにポインタを持たせるか、
 誰がContextの所有権を持つか

2.Contextから得られるオブジェクトのインタフェイスは、なるべくGet系のみにしたい。


実装例:Contextだけ、GameContextをコンストラクトした時に最下層まで生成する。
Context::Set(オブジェクトへのポインタの引数)で、オブジェクトへのポインタを渡す。
GameParentがGameContextを持つ。

問題点:誰でもポインタをセットしてしまえる
     下層のオブジェクトが多いほど、Setの引数が増えて面倒くさい


ここまで考えました。この案はISLeさんの考えられているGameContextを実装するものとしてふさわしいでしょうか。
最後に編集したユーザー moba on 2016年3月29日(火) 20:33 [ 編集 2 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: GameContext?[C++]

投稿記事 by ISLe » 9年前

MapManagerのメンバ関数を呼び出しているところはMapManagerのコンテキストという言い方ができます。

もともと、ひとつのマネージャーオブジェクトだけではできない処理をどうすれば良いかという流れで
コンテキストという考え方(をもとにしたクラス構成)を提案したわけで
コンテキストに何でもかんでも詰め込むと本末転倒になってしまいます。

質問トピックのTilemapクラスやTileIndexerクラスはどちらもマップを抽象化してます。
それらを継承して具体的なマップを実装するわけです。
No.32のサンプルプログラムだとdungeon.cppのDungeon~という名前のクラスが具体的なマップの実装です。

コンテキストを何かに例えるなら、コンシェルジュ、ですかね。
お客さま(アプリ側)の要求を聞いて、各部署に仕事を割り振って、お客さまの期待する成果を出す。
主体が、お客さま(アプリ側)、なんですよ。
でも、各部署は、それぞれが専門であって、いちいち要求に対して変わるわけではない。

地形としてのマップデータのサイズはモデルが管理するもので
タイル画像のサイズなど描画に関するものはビューが管理するものです。
タイル画像(1マス)の大きさをビューが管理することで
ひとつのマップモデルに対して、実寸マップと縮小マップなど複数のビューを表示できます。
MVCの各役割を分離するメリットのひとつです。
むしろコールバックが実装方法のひとつに過ぎなくてMVCの考え方が重要なんです。

残念ながら、これを見ればコンテクストについて理解できる、というものはありません。
コンテキストって、何を中心と考えてプログラミングするかってことなので
いろんな環境でその仕組みを作った人の考えを想像しながらプログラミングすると理解が進むと思います。
わたしは仕事柄いろんな環境でプログラミングしましたが、
いろんな環境でやったということよりも
それぞれの環境でさまざまな制限があって
段階的に分けて考えることが必然だった
というのが経験値として大きかったかもしれません。
最後に編集したユーザー ISLe on 2016年4月23日(土) 22:25 [ 編集 2 回目 ]

moba
記事: 82
登録日時: 9年前

Re: GameContext?[C++]

投稿記事 by moba » 9年前

ありがとうございます。しばらくMVCについて調べてみます。
コンテキストについては、専門家を直接利用するのではなくて、間にマシンを挟んだら、便利で汎用的で、意味を書くように書けないか、と考えてみます。いつかはコンコルジュとも捉えられるかもしれません。
しばらくはコンテクストの無い日が続きそうです。

ところで、コンテキストは一般的な考え方なのでしょうか。他で聞いたことも無く、(日本語で)検索しても手掛かりを見つけられなかったので、どのような由来で考えられたものなのかなと不思議に思っています。
最後に編集したユーザー moba on 2016年4月25日(月) 16:27 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: GameContext?[C++]

投稿記事 by ISLe » 9年前

数年前くらいから、
コンテキスト指向プログラミング(COP)
というものが注目されているらしいです。
最近処理系でサポートされるようになったところで新しいパラダイム
と言われているようです。

COPで調べると、
アノテーションなど処理系に依存する解説がヒットするのですが
そういうのはあまり参考にならないですよね。
まあでも、コンテキストの考え方自体はむかしからあったってことですね。

moba
記事: 82
登録日時: 9年前

Re: GameContext?[C++]

投稿記事 by moba » 9年前

引数のcontext(状況)は前にもヒットさせられたのですが、
今回のcontext(文脈?)も少しは検索できそうでよかったです。
出てくることは、今はあてにならないかもしれないけれど、
しばらくしたら誰かがコンテキストについて雑談していないか見てみたいです。
今回も本当にありがとうございました。