敵画像を格納している二次元配列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sbc

敵画像を格納している二次元配列について

#1

投稿記事 by sbc » 16年前

どうも初めまして、このサイトを読んでSTGを作り始めました。
STGとしての土台は概ね出来上がってきたあたりなのですが
どうしてもわからないことがあります。

第10章「敵を表示させてみよう」においてGV.hで
GLOBAL int img_enemy[3][9];//敵画像9枚分 X3体分
として敵(ザコ敵)の画像を格納する二次元配列を3体分宣言し、
load.cppのload()関数で
LoadDivGraph( "../dat/img/enemy/0.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;
として画像を3*3に分割して敵1体あたり9枚の画像を
img_enemy[0]に読み込んでいるのですが
せっかくだから雑魚敵の種類をもっと増やそうと思い、
自前でドットを打って新しい雑魚敵の画像を数枚用意しました。

まずはGV.hを
GLOBAL int img_enemy[9][9];//敵画像9枚分 X3体分
と変更して、3体までしか用意していない敵画像格納用の配列を9体まで広げ、load()関数を
LoadDivGraph( "../dat/img/enemy/1.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[1] ) ;
LoadDivGraph( "../dat/img/enemy/2.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[2] ) ;
LoadDivGraph( "../dat/img/enemy/3.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[3] ) ;
(以下同様に続く)

というように行を追加していくことで
雑魚の種類を増やしていくことを試みたのですが
img_enemy[1]とimg_enemy[2]に新たに読み込んだ敵画像はきちんと表示されているのに
img_enemy[3]以降に読み込んだ敵画像が表示されません。
何もない空間から敵が弾を撃ってくるような感じになります。
用意した画像に問題があるのかもしれないと思い、試しにimg_enemy[3]に読み込んでいた画像を
img_enemy[2]に格納してみたところ、こちらは問題なく表示できました。

恐らく敵画像を格納する二次元配列まわりで何かミスや見落としをしているのではないかと思います。
このやり方で雑魚敵画像を増やしていくことは間違っているのでしょうか?
どなたか御教授をお願いします。

s-rush

Re:敵画像を格納している二次元配列について

#2

投稿記事 by s-rush » 16年前

>>用意した画像に問題があるのかもしれないと思い、試しにimg_enemy[3]に読み込んでいた画像を
>>img_enemy[2]に格納してみたところ、こちらは問題なく表示できました。
ということから、ロードする画像のパスは間違ってはいないようですね。

ちなみに敵を描画する関数は変更しましたか?
敵の描画にfor文を使っているようですが、その繰り返し処理を行う条件も変更する必要がありますよ。
defineでENEMY_MAXを定義しているので、その値を3から9に変更すれば、
追加分の敵も表示されると思います。

sbc

Re:敵画像を格納している二次元配列について

#3

投稿記事 by sbc » 16年前

>s-rushさん

せっかく回答を頂いたところを申し訳ありません。
今現在、敵を描画する関数graph_enemy()は一切変更しておらず
void graph_enemy(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy.flag==1){
DrawRotaGraphF(enemy.x+FIELD_X,enemy.y+FIELD_Y,1.0f,0.0f,img_enemy[enemy.knd][enemy.img],TRUE);
}
}
}


という状態ですが、define.hで定義され、敵描画のfor文条件にもなっているENEMY_MAXは
「画面に一度に出現できる敵の最大数」なので、
img_enemy[3]以降に格納されている画像を表示できないという問題に関係しているとは思えないのですが。

sbc

Re:敵画像を格納している二次元配列について

#4

投稿記事 by sbc » 16年前

追記:
を使うと自動的に字下げされると思って左寄せでコードを書いてしまいました。
読みにくいコードになってしまい申し訳ありません。

BEMANI

Re:敵画像を格納している二次元配列について

#5

投稿記事 by BEMANI » 16年前

>>sbcさん
DrawRotaGraphFが何をする関数なのかはDxLib知らないのでよく解りませんが
画像を描画する関数だという前提で話を続けます。

>「画面に一度に出現できる敵の最大数」
と書かれていますが、

>for(i=0; i<ENEMY_MAX; i++)
>if(enemy.flag==1){

ここの処理を見てみるとENEMY_MAXが使われています。
s-rushさんも仰っていますが、ENEMY_MAXは「描画したい数の9」になっていますか?
ENEMY_MAXが3であれば繰り返し文であるforは三回ループするだけで
[0][1][2]までは表示されますが、[3]以降は表示されません。

sbc

Re:敵画像を格納している二次元配列について

#6

投稿記事 by sbc » 16年前

>BEMANIさん

今のソースではdefine.hではENEMY_MAXは

#define ENEMY_MAX 30


読み込んだ画像が表示されなくて苦労しているimg_enemy[9][9]という2次元配列は
敵1体1体の持つ「knd」というメンバと向いている方向などから決まる「img」という2つのメンバから
どの画像を敵の座標位置に表示するかを取ってくるための2次元配列です。

graph_enemy()において
>for(i=0; i<ENEMY_MAX; i++)
>if(enemy.flag==1){
となっているのは、今出現している敵すべてに対してフラグが立っているかをチェックし、
フラグが立っているのなら

img_enemy[enemy.knd][enemy.img]

をその敵の位置に表示する。
という処理のための条件分岐であり、用意されている敵画像の種類とは関係がないのでは?
と言いたかったのですが。

sbc

Re:敵画像を格納している二次元配列について

#7

投稿記事 by sbc » 16年前

すみません。いまだに何が原因なのかよくわからないのですが
解決法がわからないからと色々試行錯誤していたらimg_enemy[3]以降に格納された
画像を参照したときもきちんと表示されるようになりました。
表示できていなかったときと本当にソースは全くいじっていないはずなのですが…

ともかく無事解決できました。ご意見、ご回答を下さった方々ありがとうございました。

閉鎖

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