クラスの設計について評価をしてほしいのです
Posted: 2012年4月19日(木) 22:08
こんばんは。いつもお世話になっています。
前回のポーカーゲームが一通り完成したので、いよいよ本命の横スクロールを作りたいと思っています。
そして、今回から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という関数をそのまま宣言
△キーとジョイパットを対応付ける
前回のポーカーゲームが一通り完成したので、いよいよ本命の横スクロールを作りたいと思っています。
そして、今回から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という関数をそのまま宣言
△キーとジョイパットを対応付ける