こんばんは、以前にも敵のクラスによる制御について質問したSDDという者です。
前回はお世話になりました。
まず環境ですが、OSはWIN7で、コンパイラはVC++2008EEです。
C言語もC++も初心者です。
今回の質問なのですが、タイトルのように、クラスにおける敵の画像のロードのことです。
ゲームが始まる際に、そのステージに必要な敵の数だけオブジェクトを作って,CSVデータを使い制御する予定なのですが、
敵の画像のロードはオブジェクトごとに、コンストラクタで行うということは選択肢としてありでしょうか。
それとも、ゲームのメイン関数内のロード関数内に、敵クラスのロード関数を入れ子にする感じでまとめたほうがよいのでしょうか。
このやり方にするといろいろ不自由になりそうなので、コンストラクタにしようと思うのです。
稚拙な質問かもしれませんが、よろしければご協力いただければと思います。
クラスにおける敵の画像ロード
Re: クラスにおける敵の画像ロード
すみません、言い忘れていました。シューティングゲームを作っています。
一応、前回の質問のURLを貼ります。http://dixq.net/forum/viewtopic.php?f=3 ... 33#p122433
一応、前回の質問のURLを貼ります。http://dixq.net/forum/viewtopic.php?f=3 ... 33#p122433
Re: クラスにおける敵の画像ロード
>敵の画像のロードはオブジェクトごとに、コンストラクタで行うということは選択肢としてありでしょうか。
画像ロードのような作業をコンストラクタで行う場合,
問題が発生した際(読めなかったとか)にはどうすればいいのか?
という点がしっかりしているのであれば,コンストラクタでやるのでも良いかと思いますが,
そうでないなら特段 コンストラクタでやる ことにこだわらなくてもいいような気もします.
画像ロードのような作業をコンストラクタで行う場合,
問題が発生した際(読めなかったとか)にはどうすればいいのか?
という点がしっかりしているのであれば,コンストラクタでやるのでも良いかと思いますが,
そうでないなら特段 コンストラクタでやる ことにこだわらなくてもいいような気もします.
//例えばこんなやつだったら…
class Test
{
public:
bool LoadImage( 略 ); //使う画像をロードする
};
//ロード処理をさせる箇所でのエラー時対応は
//まぁ,普通に戻り値を見て何かする
Test Inst;
if( !Inst.LoadImage( 略 ) )
{
//画像読めないときの処理
}
//他方,
//コンストラクタでやるとしたら…
class Test
{
public:
Test( 略 ) //引数は何か必要なもの
{
//ここで画像ロードするのだけれど
//もしここで画像を読めなかったら… どうする? という話.
//>C言語もC++も初心者です。
//ということなら,こういう面倒そうな形はとりあえず今は避けといてもいいのでは?という気もします.
}
};
Re: クラスにおける敵の画像ロード
usaoさん、ご協力ありがとうございます。
たしかに、読み込めなかったときの処理のこともそうだし、敵だけコンストラクタでロードするのも
気分が悪いので、普通に、メインループ内でのおおもとのロード系の関数でロードしようと
思います。
という風に、そのステージが開始される前に、そのステージでのすべての敵オブジェクトが動的確保で生成するとして、
そのステージが始まる前にロードするようにしようと思います。
一面が開始される前に、一面用の敵オブジェクトを生成・ロード
倒されるたびにデリートしてメモリを開放
二面が始まる前に同じように、二面用のオブジェクトを生成・ロード
という感じにしようと思うのですが、敵の画像の種類をわけてロードする方法に悩んでいます。
取り合えず考えていたのが、
と言う風に、CSVから読み取った敵の画像の種類に相当する数値をつかって判定する方法なのですが、
もっとスマートなやり方があると思うのですが、このやり方でも大丈夫でしょうか。
よろしければ、訂正やアドバイスのようなものをいただければと思います。
たしかに、読み込めなかったときの処理のこともそうだし、敵だけコンストラクタでロードするのも
気分が悪いので、普通に、メインループ内でのおおもとのロード系の関数でロードしようと
思います。
という風に、そのステージが開始される前に、そのステージでのすべての敵オブジェクトが動的確保で生成するとして、
そのステージが始まる前にロードするようにしようと思います。
一面が開始される前に、一面用の敵オブジェクトを生成・ロード
倒されるたびにデリートしてメモリを開放
二面が始まる前に同じように、二面用のオブジェクトを生成・ロード
という感じにしようと思うのですが、敵の画像の種類をわけてロードする方法に悩んでいます。
取り合えず考えていたのが、
void Enemy::load(){
switch(num){
case:1
img=LoadGraph("ほにゃらら/1.png");
break;
case:2
img=LoadGraph("ほにゃらら/2.png");
break;
}
もっとスマートなやり方があると思うのですが、このやり方でも大丈夫でしょうか。
よろしければ、訂正やアドバイスのようなものをいただければと思います。
Re: クラスにおける敵の画像ロード
私は DXライブラリ(なんですよね?きっと)は知らないので,間違ったこと言うかもしれないけど…
そのゲームって「同じ種類(=同じ画像を使う)の敵」が複数出てきたりしないのでしょうか?
敵(画像)の種類が N 種類で,敵がM体 (N<M) 出てくるとしたら,
画像ロード回数はN回でよく,各敵のオブジェクトはそれらN個の画像のうち自分が使うやつのハンドルさえ知ってればいい
と思うのです.
なので,私だったら,CSVか何かのファイルには,例えば
・N種類の画像の名前
・各敵が何番目の画像を使うか
というのを書いとくような気がします.
読み込んだN個の画像のハンドルを みたいな配列的なものに入れとけば,
各敵は ImgHandles[ 使う画像のindex ] を参照すれば良いのではないでしょうか.
そのゲームって「同じ種類(=同じ画像を使う)の敵」が複数出てきたりしないのでしょうか?
敵(画像)の種類が N 種類で,敵がM体 (N<M) 出てくるとしたら,
画像ロード回数はN回でよく,各敵のオブジェクトはそれらN個の画像のうち自分が使うやつのハンドルさえ知ってればいい
と思うのです.
なので,私だったら,CSVか何かのファイルには,例えば
・N種類の画像の名前
・各敵が何番目の画像を使うか
というのを書いとくような気がします.
読み込んだN個の画像のハンドルを みたいな配列的なものに入れとけば,
各敵は ImgHandles[ 使う画像のindex ] を参照すれば良いのではないでしょうか.
Re: クラスにおける敵の画像ロード
usaoさん、返信ありがとうございます。返信がおくれてしまい、すみません。
DXライブラリです。言い忘れてました、すみません。
仰るとおりで、同じ画像を使う敵ばかりです。せいぜい2,3種類で足りるのですが。
確かに、よくよく考えたらオブジェクトごとに、生成された度にいちいちロードするのも変ですね・・・。
教えていただいた方法をつかってなんとかしようと思います。
CSVで敵の種類の数値を記入して、その数値に対応したハンドルを使うようにします。
少し話しが脱却してしまうのですが、仮に、オブジェクトごとにロードしたとしたら、動作が重くなったりするのでしょうか?
DXライブラリです。言い忘れてました、すみません。
仰るとおりで、同じ画像を使う敵ばかりです。せいぜい2,3種類で足りるのですが。
確かに、よくよく考えたらオブジェクトごとに、生成された度にいちいちロードするのも変ですね・・・。
教えていただいた方法をつかってなんとかしようと思います。
CSVで敵の種類の数値を記入して、その数値に対応したハンドルを使うようにします。
少し話しが脱却してしまうのですが、仮に、オブジェクトごとにロードしたとしたら、動作が重くなったりするのでしょうか?
Re: クラスにおける敵の画像ロード
>仮に、オブジェクトごとにロードしたとしたら、動作が重くなったりするのでしょうか?
これは 例えば同じ種類の敵が20匹いたら,20個のオブジェクトそれぞれが同じ画像ファイルを別々のデータとしてロードする
というような話でしょうか?
それで動作が重くなるかどうか確かなことは言えませんが…
・本来1個で済むものを複数持っている→メモリを無駄に使う→遅くなる可能性も?
・当然ロード(と,対になる解放)処理は無意味に時間がかかることになる→遅いと感じるかどうかは規模しだい?
まぁ 速度への影響だとか以前に
「特段の理由が無いのにわざわざ無駄なことをするのは避けたい」ですよね.純粋に.
(「この計算処理は3回やればいいんだけど せっかくだから おまけで6回くらいやっとくかー」とか言わないですよね.)
コードの書き方的な都合(?)で 各敵オブジェクトが必要な絵をロードしようとする ように書く
(しかし実際は重複する絵はロードしない)というのは ありだとは思いますよ.
…みたいな.
これは 例えば同じ種類の敵が20匹いたら,20個のオブジェクトそれぞれが同じ画像ファイルを別々のデータとしてロードする
というような話でしょうか?
それで動作が重くなるかどうか確かなことは言えませんが…
・本来1個で済むものを複数持っている→メモリを無駄に使う→遅くなる可能性も?
・当然ロード(と,対になる解放)処理は無意味に時間がかかることになる→遅いと感じるかどうかは規模しだい?
まぁ 速度への影響だとか以前に
「特段の理由が無いのにわざわざ無駄なことをするのは避けたい」ですよね.純粋に.
(「この計算処理は3回やればいいんだけど せっかくだから おまけで6回くらいやっとくかー」とか言わないですよね.)
コードの書き方的な都合(?)で 各敵オブジェクトが必要な絵をロードしようとする ように書く
(しかし実際は重複する絵はロードしない)というのは ありだとは思いますよ.
//敵オブジェクトが,各々必要な絵(へのハンドル)を得ようとする
for(int i=0;ENEMY_NUM;i++){
enemy[i].m_hImg = LoadImage( enemy[i].m_EnemyTypeValue );
}
//敵の種類を表す値 EnemyTypeValue に対応する画像へのハンドルを返す.
//・その絵がまだなければファイルからロードしてそのハンドルを返す
//・既にロードされてたら 単にその絵へのハンドルを返す
int LoadImage( int EnemyTypeValue )
{
//画像のロード状況をなんらかの手段で管理して
//上記コメントのような動作を行う
}
Re: クラスにおける敵の画像ロード
usaoさん、毎度すみません。
参考になります。ありがとうございます。
一つのステージで大体100体以上敵を出すので、そういうロードの管理はしたほうが良いなと
判断しました。今回教えていただいたことを参考に、やってみようとおもいます。
今回もお世話になりました。ありがとうございました。
参考になります。ありがとうございます。
一つのステージで大体100体以上敵を出すので、そういうロードの管理はしたほうが良いなと
判断しました。今回教えていただいたことを参考に、やってみようとおもいます。
今回もお世話になりました。ありがとうございました。