ページ 11

C++プログラムの設計

Posted: 2014年10月13日(月) 19:06
by 工業高生・戸松
初めて、この掲示板を利用させていただきます戸松と申します。
現在、工業高生なのですが困っていることがありまして高校の課題研究についてです。
私はプログラム設計なんて、まともにしたことがないのに課題研究でゲームを作ることにしてしまいました。
案の定、序盤で行き詰ってしまい、一人では期限である11月に間に合いそうもない為、お力を貸して頂きたいです。

正直、分からないことはゲームプログラミングの全てなのですが
特に質問したいのはC++プログラムの設計についてです。

C++ではまずクラスを作り、インスタンスを生成して、インスタンスの関数を実行すると聞きました。
そこで気になるのがインスタンスの生成場所です。
例えば、キーボードで操作するものが主人公の場合、主人公インスタンスと同じ場所にキーボードインスタンスを生成します。
しかし、キーボードで操作するものが主人公だけではなく、他のオブジェクトもあった場合(メニュー画面の矢印など)に
そのオブジェクトは先程、生成されたキーボードインスタンスにはアクセスできません。
(メニュー画面インスタンスは主人公インスタンスとは違う場所にある為)
メニュー画面インスタンスを主人公インスタンスと同じ場所に生成すれば、この問題は解決できるかもしれませんが
それだとコードがごちゃごちゃになってしまいそうです。

以上が私が現在、悩んでいる問題です。
この問題の解決方法、正しい設計の仕方を私に教えてください。
よろしくお願いします。

コンパイラにはVC++、ライブラリにはDXライブラリを想定しています。
C++の機能は分かっているつもりです。

Re: C++プログラムの設計

Posted: 2014年10月13日(月) 19:37
by hide
その場所とやらとはなんなのでしょうか。

Re: C++プログラムの設計

Posted: 2014年10月13日(月) 19:54
by 工業高生・戸松
説明不足の点がありました。申し訳ありません。

main―┬―menu
     └―playerとkeyboard
このように設計した場合、キーボードの情報をメニューに伝えることができなかったので
解決方法を知りたく質問させていただきました。
main経由で伝える方法も考えましたが、その為にmainがキーボード情報保存用の変数を
持つのはおかしいのではないかと思いました。
また、manuが深い階層にいる場合、mainとmenuの中間のインスタンス全てが情報保存用の変数を
持たなくてはいけない為、これもおかしいのではないかと思いました。

Re: C++プログラムの設計

Posted: 2014年10月13日(月) 20:18
by softya(ソフト屋)
過去ログでも何度か話題になってますが、綺麗にオブジェクト指向にするのは経年(時間)と手間がかかります。
つまり経験値が必要なんですが時間がないとのことなので難しいかと思います。ハマると時間を失いますのでゲーム完成を優先すべきです。
お急ぎですので、キーボード処理全般をシングルトンにしてしまうと言う手があるかと思います。

Re: C++プログラムの設計

Posted: 2014年10月13日(月) 20:58
by 工業高生・戸松
申し訳ありません。過去ログを読ませていただいても解決することが難しかったので質問させてください。
シングルトンについて調べさせていただきましたが、
この方法を用いて解決したところで、そのプログラムはオブジェクト指向と呼べますか?
課題研究のテーマを「オブジェクト指向を用いたゲームプログラミング」で提出してしまったもので・・・
(碌に知らないことをテーマにしてしまったことは反省しています)

最悪、歩いてジャンプするだけのプログラムでも良いので知りたいのですが
やはり、それでも経年は要するものなのでしょうか?

Re: C++プログラムの設計

Posted: 2014年10月13日(月) 21:17
by softya(ソフト屋)
シングルトンも十分にオブジェクト指向の一部です。
綺麗に設計することばかり考えると先に勧めないので、一部はなんちゃってオブジェクト指向でも良いので完成させることを優先すべきです。
結局、ちゃんと設計できないと手戻りが多発して先に進めません。
ちゃんと設計するには経験値(膨大な試行錯誤)が必要なのです。

参考過去ログ。ここらの話の内容を理解してさくっと作れるならやったほうが良いと思いますが私は難しいと思います。
「キー入力クラスの設計 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=15685
「変数のカプセル化を守りながらのデータの受け渡しについて • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=15592

>最悪、歩いてジャンプするだけのプログラムでも良いので知りたいのですが
>やはり、それでも経年は要するものなのでしょうか?

それはシングルトンとしての話でしょうか?
それとも、純粋にゲームの作り方でしょうか?
オブジェクト指向なら、1つの方法はコントローラクラスがキーボードクラスにジャンプの有無を聞いて、ジャンプならコントローラクラスからプレーヤークラスのジャンプ・メソッドを呼び出すというのがひとつの方法です。ただ、この説明だけで実装できるぐらい経験がないとハマると思います。
他にも実装方法がありますが、それは紹介したトピックで出てきます。

Re: C++プログラムの設計

Posted: 2014年10月13日(月) 21:49
by 工業高生・戸松
ありがとうございました。
シングルトンと教えてもらったリンクを参考にして今日明日でサンプルを作って研究してみます。
ただ、まだ理解できなさそうな部分があるのでサンプルを作り上げてから、また質問させてください。

Re: C++プログラムの設計

Posted: 2014年10月14日(火) 19:01
by ISLe()
利用者側がシングルトンだと信じて使うシングルトンはグローバル変数と同じなのでオブジェクト指向的には問題あるような気がしますが。
工業高生・戸松 さんが書きました:また、manuが深い階層にいる場合、mainとmenuの中間のインスタンス全てが情報保存用の変数を
持たなくてはいけない為、これもおかしいのではないかと思いました。
わたしはおかしくないと思います。

武器クラスへのプレイヤー位置情報の渡し方
質問の内容としてはこちらのトピックと同じではないでしょうか。

ユーザー操作(いわゆるコントローラーオブジェクト)へのアクセスとか、アプリケーションレベルの情報へのアクセスとか、コンテキストにインターフェースを追加していくことで機能を増やせます。
ある程度柔軟性はありますが、離れたオブジェクトにアクセスするために上位層と絡むので、クラス階層の設計は重要です。