敵の画像

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

敵の画像

#1

投稿記事 by situmon » 16年前

シューティングの館のプログラムでは、敵の画像が1種類しか使われないですが、
こんかいいろいろな画像の敵を使いたいのですがどうすればいいのでしょう。

管理人

Re:敵の画像

#2

投稿記事 by 管理人 » 16年前

以前も似たような質問をされていたと思いますが、前のトピでは解決しませんでしたか?
具体的に前の回答ではどうわからなかったのか教えていただかないとまた同じ答えしか出来ないかもしれません。

situmon

Re:敵の画像

#3

投稿記事 by situmon » 16年前

それは敵の弾の質問のことだとおもいます。
弾のことはきちんと理解しましたが、弾ではなく敵そのものの画像の
ことを知りたいのです。
わかりにくいとおもいますがよろしくお願いします。

木霊

Re:敵の画像

#4

投稿記事 by 木霊 » 16年前

敵の画像の種類を増やす(して利用する)のであれば、
その「敵の弾の質問」の回答がそのまま今回の質問の回答になっています。
変数が違うだけなので、その変数名を教えて欲しいということでしょうか?
厳しいことを言うかもしれませんが、これまでのsitumonさんの質問は、
理解せずに答えだけを聞こうとしているような印象を受けてしまいます。
実際、ほぼ全ての質問に、参考ページやサイトがリンクされている回答がありますが、
situmonさんはそちらのリンク先を読まれているのでしょうか?

一つ一つしっかり理解していった方が、結果的に早く作品ができるようになると思いますよ。
(質問の回答待ちをしなくてもよくなるので)

situmon

Re:敵の画像

#5

投稿記事 by situmon » 16年前

厳しくはありません。確かにそのとおりです。ありがとうございます。
今回、
・略・
typedef struct{
double x,y,size,img;
int flag,counter,hp,pattern,range;
} BODY_enemy_t;

BODY_enemy_t enemy[ENEMY_TOTAL_NUM];//[100]

・略・
typedef struct{
double x,y,size,img;
int flag,counter,hp,pattern,range;
} BODY_enemy_t;

extern BODY_enemy_t enemy[100];

・略・
enemy.pattern=6; //どういう軌道を描くか
enemy.flag=1; //出現フラグを立てる
enemy.counter=0;//出現して何カウント目か測るカウンター初期化
enemy.size=1.0f;//敵の大きさ
enemy.range=(int)((MONSTER1_X_SIZE-60)/2.0f*enemy.size); //※画像サイズから余白の部分60ピクセルを引く
        enemy.hp=100;
              enemy.img=6;
enemy.x=210.0; //xの初期座標
enemy.y=-10.0; //yの初期座標

とimgを加えて、
img_sound_load.cppに
img_enemy1[6] = LoadGraph("Sh/img/mons/mons2_0.png");
をかけば表示されるかと試したら、できなかったのです。

array

Re:敵の画像

#6

投稿記事 by array » 16年前

なるほど、ちょっとややこしいのかも知れませんね。

img_enemy1[5]で宣言されてるので、変更してない限りimg_enemy1[5]、img_enemy1[6]は使えません。
画像の種類を増やすには2次元配列をする必要があります。

あと敵を描画してる所も変更する必要が出てきます。

situmon

Re:敵の画像

#7

投稿記事 by situmon » 16年前

ではどうすればいいのでしょうか?
宣言を6にすればいいのでしょうか?

array

Re:敵の画像

#8

投稿記事 by array » 16年前

そこは対して重要じゃありません^^;

重要な部分は2次元配列を使う事です。
現在
int img_enemy1[5];
と宣言されていると思います。

これはimg_enemy1[0]~img_enemy1[4]に的画像が連番で入っているというのは分かりますか。
(0~4を繰り返して表示しているので、敵が動いてるように見える分けです)
となれば、これ以上にimg_enemy1[5]と増やして画像を読み込んでも種類は増やせないというのは分かりますよね。
ここで重要なのが2次元配列です。
int img_enemy1[2][5];
これが2次元配列なのですが、C言語の基礎なので分からなくても調べれば簡単に分かります。

なので[2]の各値に敵の画像を入れてあげれば、とりあえず大丈夫です。

しかし、こうなると敵の画像を表示してる部分に問題がでてくるので、そちらも書き換えが必要になります。

木霊

Re:敵の画像

#9

投稿記事 by 木霊 » 16年前

いえ、こちらこそ厳しいことを言ってしまってすみません。

自分が何をしてみたか等を書くと、回答も付きやすくなりますよ。
自分みたいに誤解する人もいなくなりますし。

で、回答なんですが・・・arrayさんがいい回答を出してくれてるので
言うことが無くなってます・・・

situmon

Re:敵の画像

#10

投稿記事 by situmon » 16年前

2次元配列ですか・・・
難しそうですが検索してがんばります!
お二方ともありがとうございます。

situmon

Re:敵の画像

#11

投稿記事 by situmon » 16年前

どうすればいいのでしょう。
マンションを例にしたりしているサイトもありましたがどういうことか?
enemy.img=[0][0]と示せばいいのでしょうか。

Mist

Re:敵の画像

#12

投稿記事 by Mist » 16年前

> 難しそうですが検索してがんばります!
> どうすればいいのでしょう。

いくらなんでもあきらめるの早すぎ(^^;
http://www.geocities.jp/ky_webid/c/025.html
このサイト見られたかと思いますが、練習問題してみましたか?

situmon

Re:敵の画像

#13

投稿記事 by situmon » 16年前

こんないいサイトがあったのですか!
yahooで2次元配列と調べただけなのでそこまでは見ませんでした。

situmon

Re:敵の画像

#14

投稿記事 by situmon » 16年前

int img_enemy1[2][5];

これが宣言というのはわかりますが、
2へのアクセスの仕方がわかりません。

上記のサイトで
二次元配列の各要素へのアクセスには、2つの添字を使います。
という文章から
for(i=0; i<5; ++i) /* 縦方向の添字 */
横方向の数(上で言えば[2])にアクセスしているのはわかりました

2の5の部分に敵の画像を入れてあげようという命令なのはわかりましたが2の5の部分に入れるのが敵の画像なので添字をどう書けばいいのでしょう?

管理人

Re:敵の画像

#15

投稿記事 by 管理人 » 16年前

二次元配列は1次元配列のアドレスの集合なので、
二次元配列を使う時はポインタの概念の理解が必要です。
ポインタについての理解はOKでしょうか?
まだでしたらまずそちらを勉強されてはどうでしょうか?

配列、文字列、ポインタ、

この辺を押さえると二次元配列の理解が簡単になるかもしれません。

array

Re:敵の画像

#16

投稿記事 by array » 16年前

まず、[2]にアクセスしようとする事が間違いです。
int img_enemy1[5];
と宣言したら、img_enemy1[0]~img_enemy1[4]の範囲しか使用できません。

それと同じで
int img_enemy1[2][5];
と宣言したら、[2]は[0]~[1]までの範囲でしか使用できません。

よって[2]にアクセスすると不具合が起こります。(ポインタの概念が分かれば、どんな不具合が起こるか大体予想できるとおもいます。←は分からなくても、使用しちゃいけない事を知ってれば問題ないと思います)

ところで、エクセルというソフトを使ったことがありますか?
配列のイメージは、それです。

画像
この図を見て下さい。

0~4には既に敵の画像が入っています。
なので今回問題になっている2次元配列を使い敵の種類を増やそうという考えです。
違う種類の敵の画像を入れたい場合この5~9に画像データを入れれば良いわけです。

-どのようにアクセスすればいいか。
img_enemy1[0][0]=20;
とすれば、現在0の値になってる場所が20にになります。
img_enemy1[1][2]=30;
とすれば、現在7の値になっている場所が30になります。

木霊

Re:敵の画像

#17

投稿記事 by 木霊 » 16年前

流れと逆行してしまいますが、強引に一次配列でやっていくことも出来ます。
でも二次元配列を学んでおいた方が絶対にいいので、あくまでも参考程度に・・・

img_enemy1 [0]~img_enemy1 [3]・・・敵1の画像
img_enemy1 [4]~img_enemy1 [7]・・・敵2の画像
img_enemy1 [8]~img_enemy1 [11]・・・敵3の画像
とした場合、各敵の画像は n~n +3 になってますよね。
そこで、
DrawGraph ( 320, 240, img_enemy1 [ n *4 +Anime ], TRUE );/* Anime は0~3が入るアニメーション用の変数
 n は敵番号*/
と書くことで、敵の画像を増やすことが出来ます。

しかし今後の為にも、二次元配列を身に付ける事を諦めないで下さい。

では、流れをぶった切るKYですみませんでした。

situmon

Re:敵の画像

#18

投稿記事 by situmon » 16年前

では
img_enemy1[1][0] = LoadGraph("Sh/img/mons/mons2.png");
として
enemy.img=[1][0]
とすればいいのでしょうか?

array

Re:敵の画像

#19

投稿記事 by array » 16年前

とりあえず
enemy.img=[1][0]←これじゃコンパイルも通らないと思いますが・・・・。

ちょっと話を戻して
まず
http://l.huu.cc/s/13.html

13. 敵の動作と判定。
を21行目までで良いので詳しく読んでみてください。

連番で敵が動く事が分かりましたか?


最後に
DrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[enemy_img[counter%32/4]] , TRUE ) ;
と書いてありますよね。

DXライブラリ本家のリファレンスに書いてある通り、赤文字の位置が画像ハンドルになります。

なので今まで敵の画像は
img_enemy1[0]~img_enemy1[4]に入ってますよ、と言ってたわけです。

画像表示部分は現在
DrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[enemy_img[counter%32/4]] , TRUE ) ;
と書いてありますよね。となってますので、これじゃ1種類の敵しか表示できなかったのです。

2次元配列を使うと
DrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;
に書変わります。

そうすると

enemy[i].img=0
の時に0に登録してた敵を表示する事になります。

enemy[i].img=1
とすれば1に登録してた敵を表示します。

situmon

Re:敵の画像

#20

投稿記事 by situmon » 16年前

エラーが起きました。
error C2108: 添字に整数でない型が使われました
とでました。
たぶんDrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[enemy.img][enemy_img[counter%32/4]] , TRUE ) ;
に問題ありです。
あとimg_sound_load.cppにはどう書けばいいのでしょうか?
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_4.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons2.png");
か img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[0][1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[0][2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[0][3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[0][4] = LoadGraph("Sh/img/mons/mons1_4.png");
img_enemy1[1][0] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][1] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][2] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][3] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[1][4] = LoadGraph("Sh/img/mons/mons2.png");
か違うかどれですか?

array

Re:敵の画像

#21

投稿記事 by array » 16年前

誘導した管理人さんが解説されてるページを読んで理解してもらえたでしょうか?
もし書かれてる内容が分からないようであれば

とりあえず、ゲーム作成は保留にして、C言語から勉強してみてはどうでしょうか?

私は立ち読みで知ったのですが「Cの絵本」といのをお勧めします。全体的に絵を使いプログラムを書かなくてもイメージできるくらい易しく解説しくれてます。
もちろん配列なども絵を使いとても分かりやすく解説してくれてます。

situmon

Re:敵の画像

#22

投稿記事 by situmon » 16年前

先ほどの話は(シューティングの館の13)はよくわかります。
すいませんがさっきの質問の答えを教えてくださいますでしょうか?
あとCの絵本はちょうど図書室にあるのでチョクチョクよんでいます!
がんばっています!(多分・・・)

kazuoni

Re:敵の画像

#23

投稿記事 by kazuoni » 16年前

arrayさんのおっしゃる通り、まずは基礎を固めたほうがいいかもしれませんね。

>error C2108: 添字に整数でない型が使われました
おそらく配列を勉強すればどこがいけないかすぐにわかると思います。(添字)

>あとimg_sound_load.cppにはどう書けばいいのでしょうか?
これも二次元配列の各要素に整数を代入するが分かればわかります。

詰まったらすぐ解決したいことはわかりますが
それでは基礎がない今はほぼすべてをこの掲示板できくことになります。
このままだとC言語の力はつきません
(自分なりで必死にやっている自分でもビギナーから抜け出せませんw)
ゆえに自分でプログラムが書けません。
http://www9.plala.or.jp/sgwr-t/
など、ググれば親切なC言語解説サイトはたくさん出てきます。
まずはここからではないでしょうか?

通りすがり

無題

#24

投稿記事 by 通りすがり » 16年前

親切に回答してくれる人が多いからといって甘えすぎてはいませんか?
あまりにも努力が足らない気がします。
説明はいいから早く答え教えてくれ といっているように聞こえます。
ゲーム製作はC言語をしっかりと理解しないと出来ません。
解らないことがあるたびに人に聞いてたんじゃsitumonさん自身効率が悪いでしょう。
C言語は質問しているうちに全部わかるようになるなんて易しいものじゃないですからね。

situmon

Re:無題

#25

投稿記事 by situmon » 16年前

img_enemy1[0] = LoadGraph("Sh/img/mons/mons1_0.png");
img_enemy1[1] = LoadGraph("Sh/img/mons/mons1_1.png");
img_enemy1[2] = LoadGraph("Sh/img/mons/mons1_2.png");
img_enemy1[3] = LoadGraph("Sh/img/mons/mons1_3.png");
img_enemy1[4] = LoadGraph("Sh/img/mons/mons1_4.png");
img_enemy1[5] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[6] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[7] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[8] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[9] = LoadGraph("Sh/img/mons/mons2.png");
img_enemy1[10] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[11] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[12] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[13] = LoadGraph("Sh/img/mons/mons3.png");
img_enemy1[14] = LoadGraph("Sh/img/mons/mons3.png");
と書いて、

int enemy_img[2][8]={{0,1,2,3,4,3,2,1},
{5,6,7,8,9,8,7,6},
{10,11,12,13,14,13,12,11}};
for(i=0;i<100;i++){
if(enemy.flag==1){
enemy.counter++;
と書いたのですが、
error C2078: 初期化子の数が多すぎます。とでてしまいました。

管理人

Re:無題

#26

投稿記事 by 管理人 » 16年前

同じ画像を違う配列要素に入れているのは何故ですか?
後、8個の入れ物を2つ作ると宣言しているのに3つも入れているので多すぎると思われます。

situmon

Re:無題

#27

投稿記事 by situmon » 16年前

> 同じ画像を違う配列要素に入れているのは何故ですか?
あとあとmons2_0,mons2_1とアニメーションになるよう増やしていくつもりだからです。
>後、8個の入れ物を2つ作ると宣言しているのに3つも入れているので多すぎると思われます。
そうか!とわかりました。ありがとうございます。

あとやはりDrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[enemy.img][enemy_img[counter%32/4]] , TRUE ) ;
の部分で添字に整数でない型が使われました。とでてきます。

array

Re:無題

#28

投稿記事 by array » 16年前

img_enemy1を配列宣言しているみたいなので、2次元配列で呼び出すことはできませんよ。

situmon

Re:無題

#29

投稿記事 by situmon » 16年前

さっそく1を消しました!

situmon

Re:無題

#30

投稿記事 by situmon » 16年前

まだご迷惑をおかけすることになると思うのですが、
かなりスレもたまってきて自分も少し学習しました。
木霊さま、通りすがりさま、
アドバイスありがとうございます。
Mistさま、kazuoniさま、
とてもよい学習サイトを教えていただいて本当に助かりました。
おかげで少しは2次元配列について理解できたと思います。
arrayさま、管理人さま、
いつもご迷惑をおかけしてすいません・・・
画像もつけていてとてもわかりやすい回答なのでいつも感動しています。

situmon

Re:無題

#31

投稿記事 by situmon » 16年前

あと、添字に整数でない型が使われました。はABC[1]ならば[1]が添字なのですが、
あれのどこがだめなのでしょうか?
DrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy[enemy.img][enemy_img[counter%32/4]] , TRUE ) ;

img_enemy[enemy.img][enemy_img[counter%32/4]] , TRUE ) ;
に問題があるまでは突き止めたのですが。
お礼したのにまた質問ですいません。

やそ

Re:無題

#32

投稿記事 by やそ » 16年前

enemy.img

がdouble型で宣言されているからじゃない?

situmon

Re:無題

#33

投稿記事 by situmon » 16年前

double型のほかにSingle型などもあるようですが、
具体的に何を使ったらいいのでしょう。
きっとExternGV.hなどの宣言をdoubleからかえるはずなのですが。

array

Re:無題

#34

投稿記事 by array » 16年前

ちなみに、
> さっそく1を消しました!
と言われてますが、なぜ消しましたか?

できれば今エラーになっている+αの所はsitumonさんに自力で頑張ってほしかったのですが。
ちょっと難しいみたいなので、私の言った事は忘れてもらった方が良いかもしれません。

(そんなつもりは無かったのですが)私が遠まわしにアドバイスしたせいか
かなり間違いだらけのプログラムになってますよ。


今後プログラムを書くときに注意してもらいたいのが、
・宣言してない変数は使わない事。
・同じ変数名は使わない事。
・変数の書き込み時・呼び出し時は宣言に合わせる。
どんな書き方をしたらエラーがでるか知っていれば、プログラムが楽しくなりますよ。

array

Re:無題

#35

投稿記事 by array » 16年前

解決の見込みがないのでとりあえず回答を書いておきます。今回、実際にエラーを体験し自分なりに色々頑張ってくれたと信じてます。

できるだけ自分の書き方で何がいけなかったのか検討してみてください。
--- GlobalVariable.h ---

int img_enemy1[2][5];  //2種類以上の敵を登録しない事

typedef struct{
	double x,y,size;
	int flag,counter,hp,pattern,range,img;
} BODY_enemy_t;

--- ExternGV.h ---

extern int img_enemy1[2][5];

typedef struct{
	double x,y,size;
	int flag,counter,hp,pattern,range,img;
} BODY_enemy_t;

--- enemy.cpp ---
void EnemyCalcDisp()内

		case 2750:
			enemy.pattern=2; //どういう軌道を描くか
			enemy.flag=1;   //出現フラグを立てる
			enemy.counter=0;//出現して何カウント目か測るカウンター初期化
			enemy.size=0.5f;//敵の大きさ
			enemy.range=(int)((MONSTER1_X_SIZE-60)/2.0f*enemy.size); //※画像サイズから余白の部分60ピクセルを引く
			enemy.x=210.0;  //xの初期座標
			enemy.y=-10.0;  //yの初期座標
			enemy.img=0;    //敵の種類
			break;


DrawRotaGraph( (int)enemy.x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy[i].img][enemy_img[counter%32/4]] , TRUE ) ;

--- img_sound_load.cpp ---

void img_sound_load(){
	//画像ハンドル取得
	//1種類目の敵を登録
	img_enemy1[0][0]		= LoadGraph("Sh/img/mons/mons1_0.png");
	img_enemy1[0][1]		= LoadGraph("Sh/img/mons/mons1_1.png");
	img_enemy1[0][2]		= LoadGraph("Sh/img/mons/mons1_2.png");
	img_enemy1[0][3]		= LoadGraph("Sh/img/mons/mons1_3.png");
	img_enemy1[0][4]		= LoadGraph("Sh/img/mons/mons1_4.png");

	//2種類目の敵を登録
	img_enemy1[1][0]		= LoadGraph("Sh/img/mons/mons2_0.png");	//青色は敵の画像ファイル
	img_enemy1[1][1]		= LoadGraph("Sh/img/mons/mons2_1.png");
	img_enemy1[1][2]		= LoadGraph("Sh/img/mons/mons2_2.png");
	img_enemy1[1][3]		= LoadGraph("Sh/img/mons/mons2_3.png");
	img_enemy1[1][4]		= LoadGraph("Sh/img/mons/mons2_4.png");

}
 

これで多分大丈夫だと思います。

管理人

Re:無題

#36

投稿記事 by 管理人 » 16年前

C言語にSingle型なんて無いでしょう^^;
VisualBasicとかの話ではないですか?
最初のうちはint型、double型、char型だけ覚えておけばOKだと思います。
後DXライブラリはfloatを引数にしているので、その辺も覚えておくといいかもしれません。
配列要素を示す場合は基本的にint型で行って下さい。
小数点を含む実数では指定できません。

後img_enemyとenemy_imgって私がつけた変数名でしたっけ?
なんという解りにくい変数名・・orz
是非わかりやすい変数名に変更して下さい。

あと、どうも階段を使わずに何とか誰かの助けで二階に上がろうとしている感じが否めません。
C言語の基礎がしっかりしていないと、製作途中何度も躓くと思います。
躓くたびにここで聞いていたのではキリが無いと思いますし、質問者さんのためにもならないと思います。
一度C言語の参考書を一冊読破するなり、参考ウェブサイトをみながら自分でCの基礎を固めるなりして
しっかりC言語を勉強した方がいいかもしれません。

ただ参考書を読むだけじゃなく、自分でガリガリとプログラムを書いてはコンパイルして下さい。
参考書にはコンパイルエラーからエラーを見つける方法なんてあまり書いてないと思います。

>添字に整数でない型が使われました。

自分でプログラムを書いているとこんなエラーが出たらどこが悪いのかパッとわかるようになります。
それにダブルクリックしたらそのエラーが出た行に飛びますから
少々あやふやな状態でも原因は突き止められるかと思います。

うまく行かなかった時に何が悪いのか突き止める力がつくと、製作がずっと効率化しますよ。

やそ

Re:無題

#37

投稿記事 by やそ » 16年前

>あとやはりDrawRotaGraph( (int)enemy.x , (int)enemy.y , enemy.size , 0.0f , img_enemy1[enemy.img][enemy_img[counter%32/4]] , TRUE ) ;
の部分で添字に整数でない型が使われました。とでてきます。

とのことですが、配列をお勉強されたということなので、
2次元配列のイメージは掴んでいることを前提に話します。
配列の添字はsitumonさんもおっしゃるとおり、
[0]
[1]
[2]
[3]
[4]
というように「整数」で数えていきます。
配列に[1.0]とか[1.5]というのはありえません。

これは言われなくても分かってるよ!!馬鹿にすんな!といわれてしまいそうですが、結構大事なことです。
変数の値に1を設定しても、その変数の型が実数型であるdouble型の場合内部的には1.0となっているんです。

自分の頭の中ではスルーしてしまいがちなところで、ちょっと慣れてきた頃にやる失敗例のひとつとして典型的なものではないでしょうか?

また、エラーメッセージがせっかく日本語で表示されているのですから、落ち着いてよく読んでみましょう。
「添字に整数でない型が使われました。」
ということですから、エラーのある文の添字に使用している変数や定数の中で、整数型(int型)でないものが怪しいと見当は付きますよね。
で改めて文を眺めてみると・・・
添字に使用されている変数(定数)は、i、enemy.img、counter%32/4が挙げられます。
で、トピックの最初のほうで宣言されていたところを見返せば・・・
enemy.imgはdoubleで宣言されているのは一目瞭然。

じゃあ、なに型で宣言すれば良いのか?って話ですが、エラーメッセージのとおり、
「整数型」のintで宣言してあげれば問題ないでしょう。
が、実際にはそのimgという変数がどんな意味を持っていて、その値の範囲はどれくらいを想定しているのかで使用する変数を決めるべきです。
・敵の画像を番号で管理するために
・敵の種類はintで十分収まる
(・っていうか添字として使うなら普通int型でしょ)
ならintですね。

しかし、arrayさん、管理人(キュー)さん、相変わらず優しいね^^

situmon

Re:無題

#38

投稿記事 by situmon » 16年前

宣言は
int enemy_img[2][5]={{0,1,2,3,4},//敵1の画像
{0,1,2,3,4}};//敵2の画像
だと思うのですが、ポインタでない式に、添字が使われました。とでてしまいます。

管理人

Re:無題

#39

投稿記事 by 管理人 » 16年前

そのログの通りのエラーなんじゃないでしょうか?
そもそもenemy_imgって変数必要なのでしょうか?
0,1,2,3,4
ならカウンタで普通にループできると思いますが。
3,1,4,2,0
みたいな不規則だと無理ですが。

array

Re:無題

#40

投稿記事 by array » 16年前

int enemy_img[2][5]←二次元配列になっています。
詳しくは、知りませんが、呼び出し時に配列で呼び出してるので、2次元配列の先頭アドレスを受け渡す形になり、ポインタと勘違いされているんだと思います。(多分)

記事を読み返してもらえれば分かると思いますが、私は、img_enemy1を2次元配列にするとしか言ってません。
確かに見た目にてますけど、enemy_imgを2次元配列にしちゃいけませんよ。(いけなくはないですが、また書き換えないといけません)



まあ、残念なのがimg_enemy1を2次元配列と何度も言ってるのに最後まで、2次元配列を使ってくれなかったことです。
そして違うところに2次元配列を使っていたことです。

situmon

Re:無題

#41

投稿記事 by situmon » 16年前

でもどのようにすればarrayさんの回答どおりになるのですか?
もしint enemy_img[2][5]を消すと
error C2065: 'enemy_img' : 定義されていない識別子です。
となってしまいました。

array

Re:無題

#42

投稿記事 by array » 16年前

消しちゃまずいです。だれも2次元配列する必要があるとは言ってないので、そのままで良いです。
ようするにint enemy_img[5]がそのままの形ですよね?

関係ない事ですが言いたい事はいっぱいあります・・・が、一言だけにしておきます。
C言語頑張ってください。

situmon

Re:無題

#43

投稿記事 by situmon » 16年前

やはりどうしてもわからないので、”高橋麻奈さんのやさしいC”という本ででがんばります。
みなさまなんどもくどいですが、これからもよろしくおねがいします。
ありがとうございました。

閉鎖

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