モンスターの種類を増やす

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

モンスターの種類を増やす

#1

投稿記事 by megaman » 4年前

こんにちは、横スクロールアクション制作も終わりに近づいてきました。
またお世話になります。
今回はタイトル通りモンスターの種類を増やす処理です。
(サンプルのマップデータは0~3までの数値)

コード:

void DrawMap(){
	int sc = (int)(g_stagedata.scrollx / IMG_CHIPSIZE);
	int shiftx = (int)g_stagedata.scrollx % IMG_CHIPSIZE;
	for (int y = 0; y < MAP_HEIGHT; y++){
		for (int x = 0; x < SCR_WIDTH + 5; x++){
			if (x + sc >= g_stagedata.mapwidth) break;
			if (g_mapdata[y][x + sc] == '1'){
				DrawRotaGraph2(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE,
				0,0,0.8,0,g_imghandles.block, TRUE);//マップの数値が1ならブロックを表示
			}
			//モンスター検出
			if (g_mapdata[y][x + sc] > '1') SetEnemy(x + sc, y);	//1(マップのブロック)以外の場合
		}
	}
}

コード:

void SetEnemy(int mx, int my){
	char c = g_mapdata[my][mx];	//マップにいるモンスター判別
	//空きを探す
	int i;
	for (i = 0; i < MAX_ENEMY; i++){
		if (g_stagedata.enemies[i].living == FALSE) break;
	}
	if (i < MAX_ENEMY){
		g_stagedata.enemies[i].living = TRUE;
		g_stagedata.enemies[i].x = (float)mx * IMG_CHIPSIZE;
		g_stagedata.enemies[i].y = (float)my * IMG_CHIPSIZE;
		g_stagedata.enemies[i].turn = FALSE;
		g_stagedata.enemies[i].noground = FALSE;
		g_stagedata.enemies[i].jumping = FALSE;
		g_stagedata.enemies[i].jumppower = 0;
		g_stagedata.enemies[i].jumpforward = 0;
		g_stagedata.enemies[i].type = (EnemyType)(c - '0');
		//生命力
		switch (g_stagedata.enemies[i].type)
		{
		case ET_CRAB:
			g_stagedata.enemies[i].life = 4;
			break;
		case ET_OCT:
			g_stagedata.enemies[i].life = 5;
			break;
		}
		//マップデータを空に
		g_mapdata[my][mx] = '0';
	}
}
今の処理だと(g_mapdata[y][x + sc] > '1')だったら(2か3だったら)
SetEnemyにいきそれぞれのモンスターに情報を渡しているのですが、
このままだと数値でfor文の処理をしていて、2~9までしかモンスターとして処理できません。
for文以外の方法で読み込むしかないのでしょうか?よろしくお願いします。

Ryo

Re: モンスターの種類を増やす

#2

投稿記事 by Ryo » 4年前

g_mapdataを、1ケタの数字(数や値ではなく、文字として)扱っていて
そのせいで0~9しか扱えないということでしょうか?

megaman

Re: モンスターの種類を増やす

#3

投稿記事 by megaman » 4年前

>Ryoさん
返信ありがとうございます。またお世話になります。
はい、0~9までしか読み込んでくれません。
if (g_mapdata[y][x + sc] > '1') SetEnemy(x + sc, y);
の'1'が文字コードで比較しているとしたら、条件を変えれば
できそうですが・・・どうなのでしょうか?

Ryo

Re: モンスターの種類を増やす

#4

投稿記事 by Ryo » 4年前

比較条件よりも前にまずg_mapdataに入れて管理する情報を
数字(文字)から、数(値)に変えれば、最低でも0~255まで扱えるようになります

megaman

Re: モンスターの種類を増やす

#5

投稿記事 by megaman » 4年前

Ryo さんが書きました: 数字(文字)から、数(値)に変えれば、最低でも0~255まで扱えるようになります
現状、読み込むマップデータが
「10002010005」のような連続した数値でつくってあるので、残念ですが2桁の数値は読み込むことが
出来ないです。

hide

Re: モンスターの種類を増やす

#6

投稿記事 by hide » 4年前

そりゃあ何も作り替えれる気がないなら何も変わりませんよ

megaman

Re: モンスターの種類を増やす

#7

投稿記事 by megaman » 4年前

>hideさん
作り替える気がないわけではないです。
ただ、どうすればいいのかわからないんです。
2桁の数値を読み込むという処理が一番動かしやすいと思うのですが、
いまいち考えがまとまらないです。

セネ
記事: 2
登録日時: 4年前

Re: モンスターの種類を増やす

#8

投稿記事 by セネ » 4年前

単純な解決法としては、マップデータのモンスターを'A','B'のような文字や記号で扱えば扱える数が数十は増えます

参照:アスキー文字コード
http://e-words.jp/p/r-ascii.html


モンスターを100種類以上扱うなどといった場合
データの扱いを文字列から数値に変更する、など根本的に変更しないと無理そうです

アバター
Tatu
記事: 440
登録日時: 8年前
住所: 北海道

Re: モンスターの種類を増やす

#9

投稿記事 by Tatu » 4年前

0001020304
1011121314
2021222324
3031323334
4041424344

と書かれたファイルを読んで
data[0][0]=0,data[0][1]=1,…,data[0][4]=4,data[1][0]=10,…,data[4][4]=44
となるようにするプログラムを書いてくださいと言われたらどこまで書けますか?

cross-eyes

Re: モンスターの種類を増やす

#10

投稿記事 by cross-eyes » 4年前

極単純にカンマ(,)区切りのデータを読み込むようにするなど、
それが賢いかはともかくやり方はいくらでもあるような気がします。

cross-eyes

Re: モンスターの種類を増やす

#11

投稿記事 by cross-eyes » 4年前

オフトピック
大変申し訳ありません…
暗闇でスマホから入力したせいか、誤って解決ボタンを押してしまっていました。

取り消す方法をご存知の方がいらっしゃいましたらご教示いただけると幸いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: モンスターの種類を増やす

#12

投稿記事 by softya(ソフト屋) » 4年前

解決は外しておきました。管理人にご依頼ください。
なお、全部で100種類いたとしても1ステージに10種類以内に納めれば0-9で事足りますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

cross-eyes

Re: モンスターの種類を増やす

#13

投稿記事 by cross-eyes » 4年前

softyaさん、早急な対応ありがとうございます。
お手数おかけしまして申し訳ありませんでした。
softya(ソフト屋) さんが書きました:管理人にご依頼ください。
了解致しました。

megaman

Re: モンスターの種類を増やす

#14

投稿記事 by megaman » 4年前

皆さん返信ありがとうございます。連絡遅れて申し訳ありません。
チームと相談し試行錯誤した結果、いまのボリューム、制作期限を考えるとセネさんの
セネ さんが書きました: 単純な解決法としては、マップデータのモンスターを'A','B'のような文字や記号で扱えば扱える数が数十は増えます
を使ってみようと思います。
リンク先のアスキー文字コードを見ると、数値<大文字<小文字なので
マップデータを小文字で処理した方が幅が広がりそうですね。

megaman

Re: モンスターの種類を増やす

#15

投稿記事 by megaman » 4年前

ご無沙汰しております。
すいません、やはり文字列だと

コード:

void SetEnemy(int mx, int my){
	char c = g_mapdata[my][mx];	//マップにいるモンスター判別
	//空きを探す
	int i;
	for (i = 0; i < MAX_ENEMY; i++){
		if (g_stagedata.enemies[i].living == FALSE) break;
	}
	if (i < MAX_ENEMY){
		g_stagedata.enemies[i].living = TRUE;
		g_stagedata.enemies[i].x = (float)mx * IMG_CHIPSIZE;
		g_stagedata.enemies[i].y = (float)my * IMG_CHIPSIZE;
		g_stagedata.enemies[i].turn = FALSE;
		g_stagedata.enemies[i].noground = FALSE;
		g_stagedata.enemies[i].jumping = FALSE;
		g_stagedata.enemies[i].jumppower = 0;
		g_stagedata.enemies[i].jumpforward = 0;
		g_stagedata.enemies[i].type = (EnemyType)(c - '0');
		//モンスターの生命力
		switch (g_stagedata.enemies[i].type)
		{
		case ET_KURI:
			g_stagedata.enemies[i].life = 4;
			break;
		case ET_OCT:
			g_stagedata.enemies[i].life = 5;
			break;
		case ET_WADO:
			g_stagedata.enemies[i].life = 3;
			break;
		case ET_AKA:
			g_stagedata.enemies[i].life = 5;
			break;
		case ET_PAKKU:
			g_stagedata.enemies[i].life = 8;
			break;
		case ET_ICE:
			g_stagedata.enemies[i].life = 6;
			break;
		case ET_BAT:
			g_stagedata.enemies[i].life = 2;
			break;
		}
		//マップデータを空に
		g_mapdata[my][mx] = '0';
	}
}
ここでつまってしまいました。
本にも「数字+小文字+大文字」=62種類まで用意できると書いていたため、
すこし改変すればいいだろうと軽い気持ちでいました・・・
皆さんには迷惑をかけます。申し訳ありませんが、もう一度考えていただきませんか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: モンスターの種類を増やす

#16

投稿記事 by softya(ソフト屋) » 4年前

g_stagedata.enemies.type = (EnemyType)(c - '0');
ここの部分で、cからifで条件分けして番号を作りだす関数を用意するだけだと思いますよ。
g_stagedata.enemies.type = getEnemyType(c);
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

megaman

Re: モンスターの種類を増やす

#17

投稿記事 by megaman » 4年前

>softya(ソフト屋) さん
助言ありがとうございます。おかげで完成できました!

コード:

int getEnemyType(char c){
	switch(c)
	{
		case '1':
			return 1;
			break;
		case '2':
			return 2;
			break;
		case '3':
			return 3;
			break;
		case '4':
			return 4;
			break;
		case '5':
			return 5;
			break;
		case '6':
			return 6;
			break;
		case '7':
			return 7;
			break;
		case '8':
			return 8;
			break;
		case '9':
			return 9;
			break;
		case 'A':
			return 10;
			break;
		case 'B':
			return 11;
			break;
		case 'C':
			return 12;
			break;
		case 'D':
			return 13;
			break;
		case 'E':
			return 14;
			break;
		case 'F':
			return 15;
			break;
		default:
			return 0;
			break;
	}
}
本来は各項目にモンスターのコメントを書いています。

閉鎖

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