質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4217閲覧

自作ノベルゲームのクラス図

ganariya

総合スコア50

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

4クリップ

投稿2018/02/24 16:28

前提・実現したいこと

 現在、ゲームライブラリである「Siv3D」を利用して
「通常のゲームウィンドウに加えてコンソールウィンドウも使用したノベルゲーム」
を制作したいと考えております。(Doki Doki Literature Clubというゲームにとても触発されました。)
しかし、ノベルゲームのクラス構造を考えるのが難しく躓いてしまいました。

現在のクラス構造

イメージ説明

現在は上記のようなクラス構図になっており、以下に現在考えている各クラスの役割を記述します。

  • Program → 起動された際に、画像などのリソースを読込み、適切なシーンへ移動する。

  • asd.Scene → シーンであり、継承元。

  • TitleScene → タイトルシーン。セーブ、ロード、CG鑑賞などを行う。

  • GameScene → ゲームシーン。セーブ内容から適切なセーブ段階からノベルゲームを再開する。

  • EndingScene → エンディングシーン。エンディングを流す。

  • GameManager → いろいろなManagerインスタンスを持つ。GameManagerはcsvファイルから一行ずつスクリプトを読込、適切なManagerへ処理を委譲する。

  • **VisualManager **→ Character, BackGroundManagerインスタンスを持つ。GameManagerから受け取った処理を適切なインスタンスに移譲する。

  • CharacterManager → キャラクター画像のリンクをVisualManagerから受け取り、キャラクターを表示する。

  • BackgroundManager → 背景画像のリンクを受け取り、背景を表示する。エフェクトなども行う。

  • TextManager → MessageManagerやConsoleManagerインスタンスを持つ。GUIで表示するスクリプトはMessageManagerに、CUIで表示するスクリプトはConsoleManagerに移譲する。

  • MessageManager → GUIにおいて、メッセージウィンドウの役割を果たす。受け取ったスクリプトを正しく表示する。

  • ConsoleManager → CUIにおいて、ターミナルウィンドウの役割を果たす。受け取ったスクリプトを正しく表示する。

  • SoundManager → BGMや効果音を再生する。

  • SystemManager → セーブ、ロード、ヒストリー履歴などシステム周りの処理を行う。DDLCというゲームに影響を受けたため複雑な処理をいざという時に担当する。

問題点

現在のクラス構造では以下のような良くない点があると考えました。

  • GameManagerの行う処理が多い。

 → スクリプトの読込
→ 読み込んだスクリプトを適したインスタンスに渡す
→ インスタンスの処理進行の管理

  • 階層構造が深い際にどう進捗を管理すればいいのか、どこで入力を受け付けるのかわからない

→ 例えばGameManagerからMessageManagerまで2つ距離が離れており、Messageがすべて出力し終わったのかわからない。
→ 一つ一つ文字を画面に入力する際、Enterキーが押された場合文字を一気に出力するが、Enterキーの受け付けはGameManagerでやるべきなのかMessageManagerでやるべきなのかわからない。


現在のクラス構造についてアドバイスをいただければ幸いです。

補足情報(FW/ツールのバージョンなど)

OS: Windows10
ゲームライブラリ: Siv3D
クラス図: Astah* Community

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

思いつくまま:

  • 経験上、~Manager/~Controllerてなクラス名をつけたときは要注意。単なる機能の寄せ集めになってる場合が少なくない。思いつく部品にかたっぱしからManagerをくっつけてクラスをでっちあげているように感じる。あるいはクラスのつもりが、実はインスタンスを作っているだけかもしれない。クラスのインスタンスがたったひとつと思われるとき、その傾向が顕著に現れる。
  • MessageManager と ConsoleManager は同じ基底クラスから導出されると思われる。出力先が異なるだけでほぼ同じ機能であるから。もしくはひとつにまとめてふたつのインスタンスを用意するだけで済むのかもしれない。
  • GameScene が GameManager を使うのが気になる。 GameManager が状況/状態に応じて適切な ~Scene を読みこんで動くんじゃないのか? ~Scene はすべてSceneのインスタンスではないか?
  • "GameManagerの行う処理が多い"のはおそらく下請けクラスが足りない。たとえばSceneの実行エンジン:ScenePlayerを定義し、GameManagerは必要なSceneをScenePlayerに与えることで実行できないか。

投稿2018/02/24 22:19

編集2018/02/25 04:10
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問