配列とfor文を使っているのに画像が一つしか表示されない。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
プログラマ見習い
記事: 44
登録日時: 4年前

配列とfor文を使っているのに画像が一つしか表示されない。

#1

投稿記事 by プログラマ見習い » 4年前

完全なプログラミング初心者です。
DXライブラリでシューティングゲームを作成しています。
マップデータを使って複数のキャラクターを複数表示させる事が出来ません。

コード:

 
 
 char mapdata[YHMAX][XWMAX+1]={

/*00*/{'0','0','0','0','0','0','1','1','1','1'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'1','1','1','1','1','1','1','1','1','1'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*01*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*02*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*03*/{'0','0','0','0','0','0','0','0','A','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*04*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*05*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*06*/{'0','0','0','0','0','0','0','A','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*07*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*08*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*09*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*10*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*11*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*12*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*13*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*14*/{'0','0','0','0','0','0','1','1','1','1'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'1','1','1','1','1','1','1','1','1','1'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/}

};
 
 
  //●各キャラクターのデータの初期化
void CharaInit() {

	
	//for (int i = 0; i < YHMAX*XWMAX; i++) {
		for (int y = 0; y < YHMAX; y++) {
			for (int x = 0; x < XWMAX + 1; x++) {

				char i = mapdata[y][x];

				ch.num[i].x=(float)x*32;
				ch.num[i].y = (float)y * 32;

				switch (i) {

				case '1':
					//ch.num[i].x = (float)x * 32;
					//ch.num[i].y = (float)y * 32;

					ch.num[i].body = 100;

					break;

				case 'A':
					//ch.num[i].x = (float)x * 32;
					//ch.num[i].y = (float)y * 32;

					ch.num[i].anipat = 2;
					ch.num[i].body = 1;

					break;

				} //switch(c)の最後

				mapdata[y][x] = '0';

			} //for(int x=0;x<XWMAX+1;x++)の最後
		} //for(int y=0;y<YHMAX;y++)の最後
	//} //for(int i=0;i<YHMAX*XWMAX;i++)の最後



}; //void CharaInit();の最後






 //●各キャラクターの移動処理
void CharaMove() {

	for (int i = 0; i < YHMAX*XWMAX; i++) {

		switch (i) {

		case '1':
			DrawGraph(ch.num[i].x, ch.num[i].y, im.kabe01, TRUE);
			break;

		case 'A':
			int Aa = anicounter / 20 % ch.num[i].anipat;
			DrawGraph(ch.num[i].x, ch.num[i].y, im.teki0A[Aa], TRUE);
			break;

		} //switch(i)の最後

		ch.num[i].x = ch.num[i].x - 1;

	} //for(int i=0;i<YHMAX*XWMAX;i++)の最後

} //void CharaMove();の最後


 
 
  


こちらのソースコードではマップデータから座標軸を取り出してスクロールさせるところは出来たのですが、とりだせたデーターは実質一つだけでした。
//for (int i = 0; i < YHMAX*XWMAX; i++) {を利用してキャラクターの種類と個数を分ける方法も試したのですが、すると今度は応答なしの状態になってしまいます。
どうすればマップデータからすべての座標軸を正常に取り出して画面に表示する事が出来るでしょうか。

プログラミング初心者

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#2

投稿記事 by プログラミング初心者 » 4年前

以下のソースコードだとコンパイルエラーではないのにフリーズしてしまいます。

コード:

 
/●各キャラクターのデータの初期化
void CharaInit() {


	for (int i = 0; i < YHMAX*XWMAX; i++) {
		for (int y = 0; y < YHMAX; y++) {
			for (int x = 0; x < XWMAX + 1; x++) {

				int c = mapdata[y][x];

				ch.num[i].x = (float)x * 32;
				ch.num[i].y = (float)y * 32;

				switch (c) {

				case '1':
					ch.num[i].body = 100;

					break;

				case 'A':
					ch.num[i].anipat = 2;
					ch.num[i].body = 1;

					break;

				} //switch(c)の最後

				mapdata[y][x] = 0;

			} //for(int x=0;x<XWMAX+1;x++)の最後
		} //for(int y=0;y<YHMAX;y++)の最後
	} //for(int i=0;i<YHMAX*XWMAX;i++)の最後

}; //void CharaInit();の最後




 //●各キャラクターの移動処理
void CharaMove() {

	for (int i = 0; i < YHMAX*XWMAX; i++) {

		switch (i) {

		case '1':
			DrawGraph(ch.num[i].x, ch.num[i].y, im.kabe01, TRUE);
			break;

		case 'A':
			int Aa = anicounter / 20 % ch.num[i].anipat;
			DrawGraph(ch.num[i].x, ch.num[i].y, im.teki0A[Aa], TRUE);
			break;

		} //switch(i)の最後

		ch.num[i].x = ch.num[i].x - 1;

	} //for(int i=0;i<YHMAX*XWMAX;i++)の最後

} //void CharaMove();の最後

原因はint c = mapdata[y][x];とswitch (c) {の部分ですが、複数の画像を複数同時に描画する方法をこれ以外に思いつきません。何か分かりやすい解決策を教えてください。

複数の画像を複数同時に描画するのは難しいどころか自分にとっては不可能に近い神の御業です。もう打つ手がありません。一日中試行錯誤しても解決しませんでした。

プログラマ見習い2

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#3

投稿記事 by プログラマ見習い2 » 4年前

コード:

 
 //●各キャラクターのデータの初期化
void CharaInit() {

	for (int y = 0; y < YHMAX; y++) {
		for (int x = 0; x < XWMAX + 1; x++) {
			for (int i = 0; i < YHMAX*XWMAX; i++) {

				//char i = mapdata[y][x];

				//ch.num[i].x = (float)x * 32;
				//ch.num[i].y = (float)y * 32;

				switch (mapdata[y][x]) {

				case '1':
					ch.num[i].body = 100;
					ch.num[i].x = (float)x * 32;
					ch.num[i].y = (float)y * 32;
					break;

				case 'A':
					ch.num[i].anipat = 2;
					ch.num[i].body = 1;
					ch.num[i].x = (float)x * 32;
					ch.num[i].y = (float)y * 32;
					break;

				} //switch(c)の最後

				mapdata[y][x] = '0';

			} //for(int i=0;i<YHMAX*XWMAX;i++)の最後
		} //for(int x=0;x<XWMAX+1;x++)の最後
	} //for(int y=0;y<YHMAX;y++)の最後

}; //void CharaInit();の最後
switch (mapdata[y][x]) で、mapdata[y][x])を直接switch文に入れましたが、ビルド正常終了で画面がフリーズして閉じてしまいました。どこをどう直せばいいか分からない状態です。

異なる種類の画像を複数描画。

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#4

投稿記事 by もるも » 4年前

描画されないのはCharaMove()のswitch文の分岐では、
char型分岐なのにint型が入っているからではないでしょうか?

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#5

投稿記事 by プログラマ見習い » 4年前

もるもさんへ。アドバイスありがとうござます。
さっそくchar型に変えたのですが、1とAでそれぞれ一つずつしか描画されませんでした。
さらに、スクロール処理をしていたので、32ピクセル単位で移動してしまいました。
問題は解決しませんでした。

コード:

 
void CharaMove() {

	for (int y = 0; y < YHMAX; y++) {
		for (int x = 0; x < XWMAX + 1; x++) {

			char i = y * XWMAX + x+1;


			switch (i) {

			case '1':
				DrawGraph(ch.num[i].x,ch.num[i].y, ch.num[i].ghandle1, TRUE);
				break;

			case 'A':
				int Aa = anicounter / 20 % ch.num[i].anipat;
				DrawGraph(ch.num[i].x, ch.num[i].y, ch.num[i].ghandle2[Aa], TRUE);
				break;

			} //switch(i)の最後

			ch.num[i].x = ch.num[i].x - 1;

		} //for(int x=0;x<XWMAX+1;x++)の最後
	} //for(int y=0;y<YHMAX;y++)の最後


} //void CharaMove();の最後
 


異なる種類の画像を複数描画するのは鬼門です。

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#6

投稿記事 by もるも » 4年前

コード:

char i = y * XWMAX + x+1;
これだと文字は取得できていません。整数型です。
マップデータからもらってきましょう。

コード:

char i = mapdata[y][x];

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#7

投稿記事 by もるも » 4年前

キャラクターの初期化で最後にmapdataに'0'を代入しているのはなぜでしょうか?

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#8

投稿記事 by プログラマ見習い » 4年前

ch.num.x = (float)x * 32;など、マップの座標軸を取り出した後で、mapdata[y][x] = '0';にしてマップデータの初期値を破棄する事で、画像を動かす事が出来るようにするためです。
マップデータからデータを引き剥がして移植する感じです。

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#9

投稿記事 by プログラマ見習い » 4年前

予定ではfor文や配列を駆使して大量のデータを読み込むはずでしたが、どうも一つ読み込んだ時点で読み込みが作業が終了してしまっている気分です。

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#10

投稿記事 by もるも » 4年前

データを引きはがすのなら、キャラクターのタイプも座標と同じにキャラクターデータに保持している方が良いと思います。
マップデータ数の分ループを回すよりも、キャラクターデータ分回すほうが少なくて済みますし。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#11

投稿記事 by みけCAT » 4年前

こんな感じにするといいと思います。
(コンパイルしてチェックしていないので、typoなどあったらごめんなさい)

コード:

int charaCount; // 取り出したキャラクターの数を格納する

//●各キャラクターのデータの初期化
void CharaInit() {
	charaCount = 0; // キャラクターが1個も無い状態にする

	for (int y = 0; y < YHMAX; y++) {
		for (int x = 0; x < XWMAX + 1; x++) {

			char i = mapdata[y][x]; // キャラクターの種類
			int charaValid = 0; // キャラクターを取り出したか

			// この時点で、次に取り出すキャラクターはcharaCount番目である
			// そのため、これ以降の処理では情報をcharaCount番目に格納する
			
			ch.num[charaCount].kind = i; // キャラクターの種類を覚えておく (このメンバを作ってください)
			ch.num[charaCount].x = (float)x * 32;
			ch.num[charaCount].y = (float)y * 32;

			switch (i) {

			case '1':
				//ch.num[charaCount].x = (float)x * 32;
				//ch.num[charaCount].y = (float)y * 32;

				ch.num[charaCount].body = 100;

				charaValid = 1; // キャラクターを取り出したことを伝える
				break;

			case 'A':
				//ch.num[charaCount].x = (float)x * 32;
				//ch.num[charaCount].y = (float)y * 32;

				ch.num[charaCount].anipat = 2;
				ch.num[charaCount].body = 1;

				charaValid = 1; // キャラクターを取り出したことを伝える
				break;

			} //switch(c)の最後

			mapdata[y][x] = '0';
			if (charaValid) {
				// キャラクターを取り出していたら、記憶しているキャラクターの数を増やす
				charaCount++;
			}

		} //for(int x=0;x<XWMAX+1;x++)の最後
	} //for(int y=0;y<YHMAX;y++)の最後

}; //void CharaInit();の最後






 //●各キャラクターの移動処理
void CharaMove() {

	for (int i = 0; i < charaCount; i++) { // 取り出したキャラクターの数だけループを回す

		switch (ch.num[i].kind) { // 覚えておいたキャラクターの種類を使う

		case '1':
			DrawGraph(ch.num[i].x, ch.num[i].y, im.kabe01, TRUE);
			break;

		case 'A':
			int Aa = anicounter / 20 % ch.num[i].anipat;
			DrawGraph(ch.num[i].x, ch.num[i].y, im.teki0A[Aa], TRUE);
			break;

		} //switch(ch.num[charaCount].kind)の最後

		ch.num[i].x = ch.num[i].x - 1;

	} //for(int i=0;i<charaCount;i++)の最後

} //void CharaMove();の最後
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#12

投稿記事 by みけCAT » 4年前

#11の訂正です。

訂正前:常にマップに'0'を代入する

コード:

			mapdata[y][x] = '0';
			if (charaValid) {
				// キャラクターを取り出していたら、記憶しているキャラクターの数を増やす
				charaCount++;
			}
訂正後:キャラクターを取り出した場合のみ、マップに'0'を代入する

コード:

			if (charaValid) { // キャラクターを取り出していたら
				// マップからキャラクターを消して
				mapdata[y][x] = '0';
				// 記憶しているキャラクターの数を増やす
				charaCount++;
			}
こうすることで、キャラクター化しない「マップ」の要素にも対応できるはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#13

投稿記事 by プログラマ見習い » 4年前

アドバイスありがとうございました。
しかし、画面がフリーズして閉じてしまいました。

コード:

char i = mapdata[y][x]; // キャラクターの種類
switch (i) {
			case '1':
				ch.num[charaCount].x = (float)x * 32;
				ch.num[charaCount].y = (float)y * 32;
 
charaCountの部分をiにするとフリーズしないのですが、画像が1種類につき1つしか表示されず、何の解決にも至っておりません。
異なる複数の種類を同時に複数描画する良い方法はないでしょうか。もうお手上げです。

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#14

投稿記事 by プログラマ見習い » 4年前

以下のように、switch文にマップデータmapdata[y][x] を入れてコンパイルすると、ビルドは正常終了しているのに、画面がフリーズして終了してしまいます。

コード:

 
switch (mapdata[y][x]) {
 

アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#15

投稿記事 by もるも » 4年前

エラーが出ないのが厄介ですね。
開発環境は何でしょうか?
フリーズするのは無限ループか、ループ処理が多すぎて重くなりフリーズしてるように見えたりが良くありますが・・・
終了してしまう原因がわかりませんね(-_-;)
キャラクターの構造体もどのようになっているのか気になります。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#16

投稿記事 by usao » 4年前

ch.num
とか書いてるけど,このnumの要素数はいくつあるんです? (領域外アクセスしてないかどうか)

ch.num の iの値としては '1' と 'A' を用いてるみたいだけども,
これって10進数で言えば,49と65になると思うんです.つまり
【ch.num[49] と ch.num[65] の2要素だけに関して何かあれこれ処理する】ということになっていそうに見えるのですが,
これって想定通りなんですか?

CharaInit()でマップデータ全体に関してループしている際に,'1'や'A'はデータに複数個存在しているから
毎度激しく ch.num の内容を上書きしていると思うけど.

アバター
usao
記事: 1887
登録日時: 11年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#17

投稿記事 by usao » 4年前

くっそ…しくじった.
前記投稿(#16)にて「ch.num」と見えている箇所は

コード:

ch.num[i]
と書いたつもりなので,読み変えてください.
(コレほんと使いにくいなぁ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#18

投稿記事 by みけCAT » 4年前

提示されたコードでのマップでは、'1'と'A'が合計30個しかなく、
添字として'1'と'A'が有効なのであれば有効になるはずです。
バグがある可能性が否定出来ないので、コンパイル・実行できる形にして試してみます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#19

投稿記事 by みけCAT » 4年前

足りない部分を補完した以下のコードを実行した結果、
フリーズは確認できず、複数の「キャラクター」が動く様子を確認できました。

コード:

#include <DxLib.h>

const int YHMAX = 15;
const int XWMAX = 80 - 1; // なぜか+1されているので、それに合わせて-1する

struct ch_num_t {
	char kind; // 追加したメンバ
	float x;
	float y;
	int body;
	int anipat;
};

struct ch_t {
	ch_num_t num[YHMAX * (XWMAX + 1)];
} ch;

struct im_t {
	int kabe01;
	int teki0A[2];
} im;

int anicounter = 0;

char mapdata[YHMAX][XWMAX+1]={

/*00*/{'0','0','0','0','0','0','1','1','1','1'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'1','1','1','1','1','1','1','1','1','1'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*01*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*02*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*03*/{'0','0','0','0','0','0','0','0','A','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*04*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*05*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*06*/{'0','0','0','0','0','0','0','A','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*07*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*08*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*09*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','0','0','0','0','0','0'/*20*/,'0','0','0','0','0','0','0','0','0','0'/*30*/,'0','0','0','0','0','0','0','0','0','0'/*40*/,'0','0','0','0','0','0','0','0','0','0'/*50*/,'0','0','0','0','0','0','0','0','0','0'/*60*/,'0','0','0','0','0','0','0','0','0','0'/*70*/,'0','0','0','0','0','0','0','0','0','0'/*80*/},
/*10*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*11*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*12*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*13*/{'0','0','0','0','0','0','0','0','0','0'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'0','0','0','0','0','0','0','0','0','0'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/},
/*14*/{'0','0','0','0','0','0','1','1','1','1'/*11*/,'0','0','0','0','0','0','0','0','0','0'/*21*/,'1','1','1','1','1','1','1','1','1','1'/*31*/,'0','0','0','0','0','0','0','0','0','0'/*41*/,'0','0','0','0','0','0','0','0','0','0'/*51*/,'0','0','0','0','0','0','0','0','0','0'/*61*/,'0','0','0','0','0','0','0','0','0','0'/*71*/,'0','0','0','0','0','0','0','0','0','0'/*81*/}

};

int charaCount; // 取り出したキャラクターの数を格納する

//●各キャラクターのデータの初期化
void CharaInit() {
	charaCount = 0; // キャラクターが1個も無い状態にする

	for (int y = 0; y < YHMAX; y++) {
		for (int x = 0; x < XWMAX + 1; x++) {

			char i = mapdata[y][x]; // キャラクターの種類
			int charaValid = 0; // キャラクターを取り出したか

			// この時点で、次に取り出すキャラクターはcharaCount番目である
			// そのため、これ以降の処理では情報をcharaCount番目に格納する
			
			ch.num[charaCount].kind = i; // キャラクターの種類を覚えておく (このメンバを作ってください)
			ch.num[charaCount].x = (float)x * 32;
			ch.num[charaCount].y = (float)y * 32;

			switch (i) {

			case '1':
				//ch.num[charaCount].x = (float)x * 32;
				//ch.num[charaCount].y = (float)y * 32;

				ch.num[charaCount].body = 100;

				charaValid = 1; // キャラクターを取り出したことを伝える
				break;

			case 'A':
				//ch.num[charaCount].x = (float)x * 32;
				//ch.num[charaCount].y = (float)y * 32;

				ch.num[charaCount].anipat = 2;
				ch.num[charaCount].body = 1;

				charaValid = 1; // キャラクターを取り出したことを伝える
				break;

			} //switch(c)の最後

			if (charaValid) { // キャラクターを取り出していたら
				// マップからキャラクターを消して
				mapdata[y][x] = '0';
				// 記憶しているキャラクターの数を増やす
				charaCount++;
			}

		} //for(int x=0;x<XWMAX+1;x++)の最後
	} //for(int y=0;y<YHMAX;y++)の最後

}; //void CharaInit();の最後






 //●各キャラクターの移動処理
void CharaMove() {

	for (int i = 0; i < charaCount; i++) { // 取り出したキャラクターの数だけループを回す

		switch (ch.num[i].kind) { // 覚えておいたキャラクターの種類を使う

		case '1':
			DrawGraph(ch.num[i].x, ch.num[i].y, im.kabe01, TRUE);
			break;

		case 'A':
			int Aa = anicounter / 20 % ch.num[i].anipat;
			DrawGraph(ch.num[i].x, ch.num[i].y, im.teki0A[Aa], TRUE);
			break;

		} //switch(ch.num[charaCount].kind)の最後

		ch.num[i].x = ch.num[i].x - 1;

	} //for(int i=0;i<charaCount;i++)の最後

} //void CharaMove();の最後

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() != 0) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	im.kabe01 = LoadGraph("kabe01.png");
	LoadDivGraph("teki0A.png", 2, 2, 1, 32, 32, im.teki0A);

	CharaInit();

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		CharaMove();
		anicounter++;
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
添付ファイル
kabe01.png
描画用素材1
kabe01.png (290 バイト) 閲覧数: 23235 回
teki0A.png
描画用素材2
teki0A.png (498 バイト) 閲覧数: 23235 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#20

投稿記事 by プログラマ見習い » 4年前

みけCATさん。貴重なアドバイスをありがとうございます。
みけCATさんが提供してくれたソースコードと同じものでコンパイルした結果、こちらもエラーがない事が確認されました。
現在の状況は、みけCATさんのアドバイスを参考に、一からソースコードを書き直している所です。ただ、また不具合が発生している状態です。自分が気付かない所でソースコードを打ち間違えているみたいなので、確認のための試行錯誤中です。

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#21

投稿記事 by プログラマ見習い » 4年前

トラブルでコンパイルテストが長引いています。
原因は、みけCATさんが提供してくれたソースコードを参考にソースコードを記述して分割コンパイルすると、ビルドは正常終了しているのに、画面がフリーズしてすぐに閉じてしまうトラブルです。
原因を調査しているので、結果が出るのが遅くなります。

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#22

投稿記事 by プログラマ見習い » 4年前

トピックの趣旨とは外れるとは思うのですが、あえて質問させていただきます。
画像を複数描画するテストを行っている最中に、ビルドは正常終了しているのに、画面がフリーズして終了してしまうトラブルに悩まされています。
みけCATさんが提供してくれたソースコードをコピペすると、フリーズしないで正常に画面が起動します。
しかし、私が自分で分割コンパイルをしてソースコードを打ち込んで起動すると、「ビルドは正常終了しているのに、画面がフリーズして終了してしまう」トラブルが起きてしまいます。
原因を調べてみました。

一つは、メモ帳などでソースコードを打ち込んでコピペすると、文字コードにBONがついてしまい、正常に起動しない事があると聞いたので、エディタをBONなしモードでソースコードを打ち込みました。
しかし、解決しませんでした。

一つはDXライブラリが最新ではない事が原因の可能性があったので、最新版をダウンロードして追加のインクルードディレクトリに追加しました。
しかし、解決しませんでした。

一つはソースコードの打ち間違いの可能性もあったので、何度も何度も調べてみましたが、問題は見つかりませんでした。

自分と同じような体験をした人はいるのでしょうか?

もしもこの質問が本トピックの趣旨から外れていると言う指摘があれば、新しいトピックを立ち上げて改めて質問する事にします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#23

投稿記事 by みけCAT » 4年前

プログラマ見習いさんに見つけられないだけで、プログラムに間違いがある可能性が高いと考えられます。
差し支えなければ、分割したソースコード(コンパイルできる一式)を見せていただけますか?
また、デバッガが使える環境であれば、デバッグ情報をつけるモードでコンパイルし、デバッガ上で実行することで、
アクセス違反などで強制終了した場所がわかる可能性があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#24

投稿記事 by プログラマ見習い » 4年前

 みけCATさん。ありがとうございます。

 実は、あれから何度もソースコードを書き直しているうちに、正常にさせる事が出来ました。
 「ビルドが正常に終了しているのに、すぐにフリーズしてしまう」原因についてですが、成功したソースコードと一緒に、コメント分として、手元に残っている限りの過去のソースコートを投稿します。
 使用しているコンパイラはVisualStudio2017communityです。

コード:

 

#include <DxLib.h>

#define MAPSIZE 32 //マップサイズを決めます。

#define HEIGHT 15 //Y座標の最大値を決めます
#define WIDTH 40 //X座標の最大値を決めます

 //キャラクターの数の最大値を決めます。念のために多めにします。今回はマップデータの数に合わせます。
#define CHARA HEIGHT*WIDTH

 //画像データの構造体を作ります。
 //画像データは無理に配列やポインタで整理しようとすると、エラーやフリーズの原因になります。
struct ImageData{

 int kabe01; //
 int teki0A[2]; //

};

struct ImageData im; //

 //各キャラクターのデータの構造体を作ります。
struct CharaData{

 //int *ghandle; //アニメーションさせるために画像データハンドル。
 //ポインタ設定をしたが、これが原因の一つでした。

 char kind; //キャラクターの種類を格納。
 int anime_pattern; //アニメパーン数
 float x; //座標はfloatにします。
 float y;
 int body; //体力

};

struct CharaData charadata[CHARA]; //今回はcharadataと名づけます。
 //キャラクターは複数出現させるので、配列内に各キャラクターの最大値CHMAXを格納します。

//struct CharaData im[2]; //画像を描画するための変数。
//or//struct CharaData im[CHARA]; //画像を描画するための変数。

 //アニメーションカウンター用の変数を作ります。
unsigned int g_anime_counter=0;

 //マップデータを作ります。
char mapdata[HEIGHT][WIDTH]{

 /*00*/{'0','0','0','0','0','1','1','1','1','1'/*00*/,'1','1','1','1','1','1','1','1','1','1'/*00*/},
 /*01*/{'0','0','0','0','0','0','0','0','0','0'/*01*/,'0','A','0','0','0','0','0','0','0','0'/*01*/},
 /*02*/{'0','0','0','0','0','0','0','A','0','0'/*02*/,'A','0','0','0','0','0','A','0','0','A'/*02*/},
 /*03*/{'0','0','0','0','0','0','0','0','0','0'/*03*/,'0','0','0','0','A','0','0','0','0','A'/*03*/},
 /*04*/{'0','0','0','0','0','0','0','0','A','0'/*04*/,'0','0','0','0','A','0','0','0','0','0'/*04*/},
 /*05*/{'0','0','0','0','0','0','0','0','0','0'/*05*/,'0','0','A','0','0','0','0','0','0','0'/*05*/},
 /*06*/{'0','0','0','0','0','0','0','0','0','0'/*06*/,'0','0','A','0','0','0','0','0','0','0'/*06*/},
 /*07*/{'0','0','0','0','0','0','0','0','0','0'/*07*/,'0','0','0','1','1','1','1','1','1','0'/*07*/},
 /*08*/{'0','0','0','0','0','0','0','0','0','0'/*08*/,'0','0','A','0','0','0','0','0','0','0'/*08*/},
 /*09*/{'0','0','0','0','0','0','0','0','A','0'/*09*/,'0','0','A','0','0','0','0','0','0','0'/*09*/},
 /*10*/{'0','0','0','0','0','0','0','0','0','0'/*10*/,'0','0','0','0','A','0','0','0','0','0'/*10*/},
 /*11*/{'0','0','0','0','0','0','0','A','0','0'/*11*/,'0','0','0','0','A','0','0','0','0','A'/*11*/},
 /*12*/{'0','0','0','0','0','0','0','0','0','0'/*12*/,'A','0','0','0','0','0','A','0','0','A'/*12*/},
 /*13*/{'0','0','0','0','0','0','0','0','0','0'/*13*/,'0','A','0','0','0','0','0','0','0','0'/*13*/},
 /*14*/{'0','0','0','0','0','1','1','1','1','1'/*14*/,'1','1','1','1','1','1','1','1','1','1'/*14*/}

};



 //画像をロードする関数を作ります。
void Load(){

 im.kabe01=LoadGraph("media/kabe01.png");

 LoadDivGraph("media/teki0A.png",2,2,1,32,32,im.teki0A);

  //ポインタと配列を使って画像用のコードを少なくしようとしたら、フリーズしてしまいました。
 //*(im['1'].ghandle)=LoadGraph("kabe01.png");
 //LoadDivGraph("teki0A.png",2,2,1,32,32,im['A'].ghandle);

}



 //初期化用の関数を作ります。
void Init(){

  //キャラクターをカウントする変数を作ります。必要な変数の一つです。
  //キャラクターをカウントする変数はローカル変数でも問題ありませんでした。
 int counter=0;

 for(int y=0;y<HEIGHT;y++){
  for(int x=0;x<WIDTH;x++){

  char c=mapdata[y][x];

   //初期化してマップデータから、キャラクターのデータを取り出します。

   //kindにマップデータを代入します。
   //これも必要な変数の一つです。
  charadata[counter].kind=c;

  charadata[counter].x=(float)x*MAPSIZE;
  charadata[counter].y=(float)y*MAPSIZE;

  int charaValid=0;
   //この変数を利用しないと初期化関数Init();をwhile文に入れた場合に適切に描画されません。
   //Validは英語で「有効、根拠の確実な、確かな、正当な」などの意味です。

   //キャラクターごとに異なるものはswicth文を使います。
  switch(c){ //なお、ここにcounterを入れてしまうと、フリーズしてしまいました。
   case '1':
    charadata[counter].body=1;
    charaValid=1; //case毎にcv=1;と代入します。
    break;

   case 'A':
    charadata[counter].anime_pattern=2; //アニメーションさせる場合はここで代入します。
    charadata[counter].body=1;
    charaValid=1; //
    break;

  }

    //このif文がないと初期化関数Init();をwhile文に入れた場合に適切に描画されません。
   if(charaValid){
   mapdata[y][x]='0'; //マップデータを'0'にする事で、データの取り出しは終わりです。
    //ここでキャラクターの数を一つずつ増やしていきます。
   counter++;
   }

  }
 }

}


 //描画と移動処理用の関数を作ります
void Move(){

 for(int i=0;i<CHARA;i++){

  char c=charadata[i].kind;

  switch(c){
   //ここにcharadata[i].kindではなくiを入れると、一つしか描画されませんでした。
   //また、フリーズしてまった場合もあります。

   case '1':
    DrawGraph(charadata[i].x,charadata[i].y,im.kabe01,TRUE);
    //DrawGraph(charadata[i].x,charadata[i].y,*(im.ghandle),TRUE);
     //ポインタと配列を利用したら、フリーズしてしまいました。
    break;

   case 'A':
    int a=g_anime_counter/20%charadata[i].anime_pattern;
    DrawGraph(charadata[i].x,charadata[i].y,im.teki0A[a],TRUE);
    //DrawGraph(charadata[i].x,charadata[i].y,im.ghandle[a],TRUE);
     //ポインタと配列を利用したら、フリーズしてしまいました。
    break;

  }

   //キャラクター単位で動かす方法でマップスクロールを行います。
  charadata[i].x=charadata[i].x-1;

 }

}



 //WinMain関数の中に、先ほど作った関数を入れます。//Move();だけwhile内に入れます。
int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){

 if(ChangeWindowMode(TRUE)!=0) return -1; //ウィンドウモードの変更
 if(DxLib_Init()!=0) return -1; //DXライブラリ初期化処理
 if(SetDrawScreen(DX_SCREEN_BACK)!=0) return -1; //描画先を裏画面に設定


 //ロードの関数は、ここではここに入れます。

 Load(); //画像のロード 

 //Init(); //初期化。//if(charaValid)に関するコードを書いていない時は、ここに置かないで、while文の中に置くと、適切に描画されません。



 while(ProcessMessage()==0&&CheckHitKey(KEY_INPUT_ESCAPE)==0){
  //メッセージ処理(XキーかAlt+F4キーが押されたら終了)
  //ESCキーが押されたら終了
 if(ClearDrawScreen()!=0) return -1; //裏画面を消す


  Init(); //初期化。//if(charaValid)に関するコードを書いていないでwhile文の中に初期化関数Init();置くと、適切に描画されません。

  Move(); //画像の描画と移動用の関数をここに置きます。

  g_anime_counter++; //



  if(ScreenFlip()!=0) return -1; //裏画面を表画面に反映

 }

 if(DxLib_End()!=0) return -1; //DXライブラリの終了処理
 return 0; //ソフトの終了

}

 
 失敗の主な原因としては、やはり、私がソースコードの書き間違えて、それに気づかなかった事にあります。
 例えば画像データハンドルの作成にポインタを使った事や配列に格納する変数を間違えてしまった事などがあります。
 ただ、何度ソースコードを読み返してた上で問題がないと判断しているのに、いざ実行すると、「ビルドが正常に終了しているのに、すぐにフリーズしてしまう」事が起こり、もう一度読み返して、時には修正して実行してフリーズを何度も繰り返す事になったので、自分が最後まで把握出来なかった原因もあるのでないかと思います。
 過去のソースコードで残っていないものの中に原因があるのであれば、残っていない事が悔やまれます。
 また、コンパイラでも警告されない隠れた分かりにくい間違いが原因となっている場合もある事も、把握出来なかった原因があるのではないかと考える理由です。

 ともあれ、トピックの主題である複数の異なる種類の画像を複数描画する事に限って言えば、以上のソースコードでは一応、成功しました。
 これもミクプラの皆さんが適切なアドバイスをして頂いたおかげです。自力でいろいろと調べたりもしたのですが、皆様の協力がなければ、成功する事は出来ませんでした。皆さん、ありがとうございます。

 ただ、以上のソースコードでも、これからの本格的なゲーム制作の課題は山ほどある事から見て、このソースコードで解決したと言い切る事は出来ません。それについては、自分が勉強していく中で見つけていくつもりです。
 もしも、以上のソースコードの中で、私が気が付いていない問題点があるのなら、指摘して頂ければ幸いです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#25

投稿記事 by みけCAT » 4年前

「初期化」のはずなのに毎フレーム呼び出してしまっているため、
最初のキャラクターの種類と情報が破壊されるはずだと思います。
本当にこのソースコードで正常に動作していますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

プログラマ見習い
記事: 44
登録日時: 4年前

Re: 配列とfor文を使っているのに画像が一つしか表示されない。

#26

投稿記事 by プログラマ見習い » 4年前

失礼しました。
初期化用の関数Init();は、while文の中に入れてしまうと、一番最初の画像が消えてしまう事を確認しました。私の観察力不足でした。
初期化用の関数Init();は、ロード用の関数Load();の直後の段に入れると正常に動作しました。
ご指摘ありがとうございます。

返信

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