こんばんは。いつもお世話になっています。
前回のポーカーゲームが一通り完成したので、いよいよ本命の横スクロールを作りたいと思っています。
そして、今回からC++での創作をしようと思っています。
C++のレベルは入門サイトを2,3箇所。一通り目を通し、ある程度理解したのですが、とあるサイトにあった通り「C++はCに無い便利な機能がたくさんあるが、初心者やたらと利用するとソースが崩壊する」とあるので、今回は「クラスを分類をしっかりと行う。極力変数はprivateで」、とハードルを下げてオブジェクト指向に慣れていこうと思っています。
そこで今回はクラスの設計を、書ける範囲で書いてみました。なので、それを評価してほしいのです
評価してほしい点は、
1.Cの考えを引きずっていて手続き処理臭くなっていないか?
2.クラスを無駄に作りすぎていないか
3.クラスと構造体の使い分けが良くわからないのですが、構造体にした方がいいクラスはないか?
4.むしろ新しいクラスを加えた方がいいのではないか?
5.説明不足であれば「ここをもう少し詳しく説明して」と書いてください
6.シーンクラスで状態変数を使って、状態遷移を行っているがオブジェクト指向では状態変数は必要なのか?
7.その他、おかしいところなどがあればどんどん指摘してください
次に今回のアクションの仕様ですが、【初期(Xでない)のロックマン】やマリオ系とほぼ同じと考えていただければ間違いはないと思います。
なにぶんクラス設計をするのは初めてなので、めちゃくちゃであるかもしれませんが、皆さんの指導の下、すこしずつ改善していき、これならプログラミングがスムーズにいくだろうというラインまで持っていけたらなと思っています
/*@画像やcsvファイルなどのデータ*/
/*・クラス変数*/
/*△---クラス関数*/
/*【】---クラス*/
【スクロールクラス】
@スクロールされる横長の画像
・x座標 ・y座標 ・画像ハンドル
△ファイルロード △画像表示 △画像解放 △スクロール分だけ画像のx座標を足し引きする
【マップチップクラス】
@マップチップの画像
・x座標 ・y座標 ・画像ハンドル ・画像の種類 ・あたり判定(四角形)のx1,x2,y1,y2座標
・そのマップチップのタイプ(地面だったら何もなし針だったら主人公が死ぬなど)
△ファイルロード △画像表示 △画像解放 △スクロール分だけ画像のx座標を足し引きする
【musicクラス】
・BGM SEの音量
△BGM SEクラスの生成
【BGMクラス】
@音楽ファイル
・BGMの音量
△ファイルロード △音楽再生 △音楽停止 △BGM解放 △音量変更
【SEクラス】
@音楽ファイル
・SEの音量
△ファイルロード △音楽再生 △音楽停止 △SE解放 △音量変更
【キャラクタクラス(基底クラス)】
|
|--【主人公クラス(派生クラス)】
| @主人公画像,HPバーの画像
| ・主人公画像のx座標 ・主人公画像のy座標 ・あたり判定の四角形x1,x2,y1,y2座標 ・画像ハンドル ・キャラの向き ・残機 ・HP残量
| ・プレイヤーの状態<棒立ち、右へ歩く、左へ歩く、右へ走る、左へ走る、1段ジャンプ、被ダメ、死に>
・HPバーのx座標、HPバーのy座標
| △画像ロード △画像表示 △画像解放 △移動計算 △被ダメ時の判定の処理 △喰らった時の処理 △攻撃(武器クラスを新しく生成)
| △死んだときの処理
|
|--【雑魚敵クラス(派生クラス)】
・x座標 ・y座標 ・あたり判定の四角形x1,x2,y1,y2座標 ・画像ハンドル ・敵の種類 ・キャラの向 き ・HP残量
・敵の状態<棒立ち、右へ歩く、左へ歩く、1段ジャンプ、被ダメ、死に>
△画像ロード △画像表示 △画像解放 △CSVファイルからHPなどの情報を格納 △移動計算 △被ダメ時の処理 △攻撃(武器クラスを新しく生成) △敵の移動パターン △敵の攻撃パターン
△死んだときの処理
【武器クラス(基底クラス)】
|@武器画像
|--【主人公の武器クラス(派生クラス)】
| ・x座標 ・y座標 ・あたり判定の四角形x1,x2,y1,y2座標 ・武器の種類
| △画像ロード △画像表示 △画像解放 △移動計算
|--【敵の武器クラス(派生クラス)】
| ・x座標 ・y座標 ・あたり判定の四角形x1,x2,y1,y2座標 ・武器の種類
| △画像ロード △画像表示 △画像解放 △移動計算
【ゲームクラス(ゲーム全体を管理する)】
|・どのシーンかを示す状態変数
|・ゲーム全体で使われるカウント変数
|
|
|--【シーン0(タイトルクラス)】
| @タイトルに使われる画像(はじめから、終わる,その他ロゴなどの画像)
| ・画像のx座標 ・ 画像のy座標 ・それぞれの画像ハンドル ・初めからが選択されているか終わるを選択されているかのフラグ
| ・シーン0内での状態変数
| △画像ロード △画像表示 △画像解放 △プレイが始まる前の初期化 △シーン1に移る際の後処理
|--【シーン1(プレイ部分のクラス)】
| @プレイヤーのHPバーの画像
| ・画像のx座標 ・画像のy座標 ・シーン1での状態変数
| △プレイが始まる前の初期化 △あたり判定の計算 △当たった時の処理 △シーン0、シーン2に移る際の後処理
|
|--【シーン2(ゲームオーバのクラス)】
@ゲームオーバー画面で使われる画像
・画像のx座標 ・画像のy座標 ・画像のハンドル ・カウント(ゲームオーバを表示する時間の長さ)
△タイトル画面に映る際の初期化 △タイトル画面に映る際の後処理
【フェードイン・フェードアウトクラス】
それぞれのシーン間に挟まれるフェードイン、フェードアウトクラス
@白または黒一色の画像
・一色画像の透過度 ・フェードインする時間の長さ ・クラス内でのカウント変数
△透過度を上げていきBGM音量を下げていく △透過度を下げていきBGM音量を上げていく
【インプットクラス】
GetHitKeyStateAllという関数をそのまま宣言
△キーとジョイパットを対応付ける
クラスの設計について評価をしてほしいのです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: クラスの設計について評価をしてほしいのです
ぱっと見たところ、クラス間の情報の流れが不明確でクラスで保持する情報が不足。
例として【スクロールクラス】が何を基準にスクロールしているか分からない。スクロール範囲の情報を持っていない。など。
基底クラスから派生クラスへの変数や関数の継承がよくわからないのも問題でしょうか。
シーンの管理は、それがシーン0で良いのかって疑問がありますが、ステージとは無関係なんですよね?
マリオ的なゲームと言うことで全体の状態としてタイトル、タイトルデモ、起動オプション、オープニング、ゲーム中(ステージ1、ステージ1ボス・・・・)、エンディング、ゲームオーバーぐらいは想定しておいたほうがよさそうです。
※ ゲームオーバーはコンティニューする特殊なものなのでこの中には入れない方が良いかもしれませんが。
あといきなり規模が大きすぎるので、小規模に主人公がマップを自在に移動するだけのクラス設計と実装ぐらいでやったほうがよさそうな気がします。
[補足]
【ゲームクラス(ゲーム全体を管理する)】の「・ゲーム全体で使われるカウント変数」
これがクラスのインスタンスとして単一存在なのか気になりました。継承したクラスのインスタンスでどう扱うのでしょうか?
【さらに補足】
全体的な情報をもって管理をするクラスと個別の敵キャラなどステージなどのクラスは分けたほうが良いように思います。
個々の敵キャラクラスのインスタンスがcsvから情報を得るとかは非効率的かと。
上にも書きましたが、いきなり規模が大きすぎてマップの仕掛けやらボスやら色々気が回っていない様子が伺えます。
クラスの細かい仕様を書く前に、ゲーム全体の構成と必要なオブジェクトを割り出すことから始めたほうが良いなとは思いました。
例として【スクロールクラス】が何を基準にスクロールしているか分からない。スクロール範囲の情報を持っていない。など。
基底クラスから派生クラスへの変数や関数の継承がよくわからないのも問題でしょうか。
シーンの管理は、それがシーン0で良いのかって疑問がありますが、ステージとは無関係なんですよね?
マリオ的なゲームと言うことで全体の状態としてタイトル、タイトルデモ、起動オプション、オープニング、ゲーム中(ステージ1、ステージ1ボス・・・・)、エンディング、ゲームオーバーぐらいは想定しておいたほうがよさそうです。
※ ゲームオーバーはコンティニューする特殊なものなのでこの中には入れない方が良いかもしれませんが。
あといきなり規模が大きすぎるので、小規模に主人公がマップを自在に移動するだけのクラス設計と実装ぐらいでやったほうがよさそうな気がします。
[補足]
【ゲームクラス(ゲーム全体を管理する)】の「・ゲーム全体で使われるカウント変数」
これがクラスのインスタンスとして単一存在なのか気になりました。継承したクラスのインスタンスでどう扱うのでしょうか?
【さらに補足】
全体的な情報をもって管理をするクラスと個別の敵キャラなどステージなどのクラスは分けたほうが良いように思います。
個々の敵キャラクラスのインスタンスがcsvから情報を得るとかは非効率的かと。
上にも書きましたが、いきなり規模が大きすぎてマップの仕掛けやらボスやら色々気が回っていない様子が伺えます。
クラスの細かい仕様を書く前に、ゲーム全体の構成と必要なオブジェクトを割り出すことから始めたほうが良いなとは思いました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: クラスの設計について評価をしてほしいのです
こんにちは、別のパソコンからアクセスしているので名前が異なりますが、サンタクロースです。
いつもお世話になっています。
確かに、それぞれのクラスがどんな情報を処理しているのか、それぞれのクラス関数がどのような処理をしているのかが全くわからないですね。
紙面上ではうまくイメージできないので少しだけプログラムに起こしてみようと試みたのですが(本末転倒ですが)肝心な処理部分がごっそり抜けているので全く手が進みませんでした。
クラス設計ができないというよりは、アクションゲームの処理の流れがつかめていないので一旦
C言語で完成させて、あらかたの処理をイメージできるようになった上でC++のクラス設計に取り組もうと思います。
非常に申し訳ないですけど、このトピックは一旦解決ということにして、再度設計するときに質問させていただきますm(_ _)m
いつもお世話になっています。
確かに、それぞれのクラスがどんな情報を処理しているのか、それぞれのクラス関数がどのような処理をしているのかが全くわからないですね。
紙面上ではうまくイメージできないので少しだけプログラムに起こしてみようと試みたのですが(本末転倒ですが)肝心な処理部分がごっそり抜けているので全く手が進みませんでした。
クラス設計ができないというよりは、アクションゲームの処理の流れがつかめていないので一旦
C言語で完成させて、あらかたの処理をイメージできるようになった上でC++のクラス設計に取り組もうと思います。
非常に申し訳ないですけど、このトピックは一旦解決ということにして、再度設計するときに質問させていただきますm(_ _)m
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: クラスの設計について評価をしてほしいのです
C言語でも設計が重要なことには変わりがないですし、やはりフル仕様のアクションゲームは大規模な作業だと思います。サンタクロース(仮) さんが書きました:こんにちは、別のパソコンからアクセスしているので名前が異なりますが、サンタクロースです。
いつもお世話になっています。
確かに、それぞれのクラスがどんな情報を処理しているのか、それぞれのクラス関数がどのような処理をしているのかが全くわからないですね。
紙面上ではうまくイメージできないので少しだけプログラムに起こしてみようと試みたのですが(本末転倒ですが)肝心な処理部分がごっそり抜けているので全く手が進みませんでした。
クラス設計ができないというよりは、アクションゲームの処理の流れがつかめていないので一旦
C言語で完成させて、あらかたの処理をイメージできるようになった上でC++のクラス設計に取り組もうと思います。
非常に申し訳ないですけど、このトピックは一旦解決ということにして、再度設計するときに質問させていただきますm(_ _)m
C言語で完成させての問題ではないと思いますが・・・。
アクションゲームの流れは、マリオなどを参考に仕様分解して書きだしてみる事が大事です。
そうすれば、どれだけ大規模な作業なのか分かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。