C++ のクラス

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Tomo
記事: 16
登録日時: 9年前
住所: 埼玉県

C++ のクラス

#1

投稿記事 by Tomo » 9年前

今回久しぶりの投稿です。
東方シューティングのようなゲームを作りたい!と思って始めたのですが...
自機(player)のクラスを作っているときに、数人の自機から選べるようにしたくてそれぞれ特徴を持たせようと思ったのですが、つまずいてしまいました。

まず、ヘッダーはこんな感じに書いてみました。
後々消したり足したりするデータメンバーはあると思いますがとりあえずこれで...
character.h

コード:

class character{
private:
	double Speed;//移動速度
	double x;//X座標
	double y;//Y座標
	int Power;//弾の威力
	int Life;//残機
	int Spell;//スペル数
	bool Exist;//死んでるか生きてるか
	bool Selection;//そのキャラが選ばれたかどうか

	//画像
	int Width;//画像の幅
	int Height;//画像の高さ
	int MoveStraight;//真っ直ぐ飛ぶときのグラフィックハンドル
	int MoveLeft;//左に移動するときのグラフィックハンドル
	int MoveRight;//右に移動するときのグラフィックハンドル

public:
	character();
	void CharaMove();
	void CharaDraw();

};
そして、コンストラクタで初期化...と思ったんですが、
自機を何種類か追加するときそれぞれ違ったパラメーターを持ちます。
この場合どうやって書けば良いのか分からなくなってしまいました。

とりあえず自分が考えた中では、
案1-配列を利用する
character.cpp

コード:

character::character(par1,par,2,par3,par4,par5,par6,par7,par8,......){
Speed=par1;
x=par2;
y=par3;
Power=par4;
Life=par5;
Spell=par6;
Exist=par7;
Selection=par8;
//以下略


}

character ziki[3]={
character(3,200,200,15,3,4,true,false,......),
character(7,200,200,8,3,4,true,false,......),
character(.......)
}

この場合画像はcharacter(3,200,200,15,3,4,true,false,....,LoadGraph("photo.png"),..),...);
としても問題ないでしょうか?

案2-全員が初めに同じパラメーターを持つものを基本クラスで、違うパラメーターは継承を使って派生クラスを作成してそこで新たに追加する
character.h

コード:

class character{
protected:
	double x;//X座標
	double y;//Y座標
	int Life;//残機
	int Spell;//スペル数
	bool Exist;//死んでるか生きてるか
	bool Selection;//そのキャラが選ばれたかどうか

public:
	character();
	void CharaMove();
	void CharaDraw();

};

class Ziki1:protected character{
private:
Speed=3;
Power=15;
Width=20;
Height=40;
MoveStraight=LoadGraph("photo1.png");
MoveLeft=LoadGraph("photo2.png");
MoveRight=LoadGraph("photo3.png");

}

class Ziki2:protected character{
private:
Speed=7;
Power=8;
Width=25;
Height=35;
MoveStraight=LoadGraph("photo4.png");
MoveLeft=LoadGraph("photo5.png");
MoveRight=LoadGraph("photo6.png");

}

案3
クラスを使用しない
ただ使用しない方が良いことがあるのであれば使わなくてもよいのですが、
できれば使いたいです。

こんな感じです。
クラスは初めて使用するのであまりよくわからないことが多いです。
このシューティングゲームに手を出す前に「ブロック崩し(笑)」みたいなのを作りましたが
その時は一切クラスを使用せずに作りました。
ですが、最初からC++でプログラムを勉強しているのでC++の特徴を活かして
よりよいコードを書いてみたく思いました。
どうかご援助願います。
クラスの特徴や仕様、どんな時にどのようなメリットがあるのか教えていただけると
とてもうれしいです。

環境:
windows8.1 64bit
visualstudio2013
C++/Dxライブラリ使用

アバター
spaaaark・∀・
記事: 66
登録日時: 10年前
住所: 埼玉
連絡を取る:

Re: C++ のクラス

#2

投稿記事 by spaaaark・∀・ » 9年前

これは僕個人の意見であるためもしかしたらもっといい方法があるかもしれないという事を留意ください。

この中からどれを使うかと聞かれるとどれでもないんですが、僕なら2に近い方法を取っていきます。
具体的に言いますと、2のように共通の変数部は別クラス化します。
ただしこの要素たちは全てpublicで、同クラス内に関数は持たせないようにします。
そしてこのクラスをcharacterクラスのメンバとして置いておきます。まとめるとこんな感じになります。

コード:

class CValues{
public:
  ...
};
class CCharacter{
  CValues mValue;
  /*以下メンバ関数等々…*/
};
この書き方の利点を挙げておくと、長々とクラスの初期化処理で配列にしなくていい、変数の配列化(vector等も)が容易、
また別クラスで値を与えておいてメンバ変数の引数として与え一気に初期化出来る、などがあります。
オフトピック
なお僕が実際に書くときにはあんまりC++に似つかわしくないstructキーワードを使ってます。public省けるし、差別化できるので。
ちなみに、不特定多数(かな?)のキャラの固有値をハードコーディングするのは好ましくないです。
後々の拡張も視野に入れて編集のしやすいcsv等の外部ファイルを使用することを推奨します。
クリエイティブな生活で刺激的な毎日を!

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: C++ のクラス

#3

投稿記事 by h2so5 » 9年前

案1を採用するべきです。
パラメーターが違うだけならクラスを分ける必要がありません。

Tomo
記事: 16
登録日時: 9年前
住所: 埼玉県

Re: C++ のクラス

#4

投稿記事 by Tomo » 9年前

spaaaarkさん、h2so5さんありがとうございます。
今回は案1でやろうと思います。
キャラの数も決まっていますしクラスをしっかり理解できていないので作るクラスも少なくしたいので。
詳しい解説ありがとうございました。このやり方も頭に入れておきたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る