ページ 11

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

Posted: 2014年11月26日(水) 12:15
by megaman
こんにちは、横スクロールアクション制作も終わりに近づいてきました。
またお世話になります。
今回はタイトル通りモンスターの種類を増やす処理です。
(サンプルのマップデータは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文以外の方法で読み込むしかないのでしょうか?よろしくお願いします。

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

Posted: 2014年11月26日(水) 12:34
by Ryo
g_mapdataを、1ケタの数字(数や値ではなく、文字として)扱っていて
そのせいで0~9しか扱えないということでしょうか?

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

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

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

Posted: 2014年11月27日(木) 12:32
by Ryo
比較条件よりも前にまずg_mapdataに入れて管理する情報を
数字(文字)から、数(値)に変えれば、最低でも0~255まで扱えるようになります

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

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

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

Posted: 2014年11月28日(金) 10:50
by hide
そりゃあ何も作り替えれる気がないなら何も変わりませんよ

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

Posted: 2014年11月28日(金) 11:40
by megaman
>hideさん
作り替える気がないわけではないです。
ただ、どうすればいいのかわからないんです。
2桁の数値を読み込むという処理が一番動かしやすいと思うのですが、
いまいち考えがまとまらないです。

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

Posted: 2014年11月28日(金) 11:55
by セネ
単純な解決法としては、マップデータのモンスターを'A','B'のような文字や記号で扱えば扱える数が数十は増えます

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


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

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

Posted: 2014年11月28日(金) 22:33
by Tatu
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
となるようにするプログラムを書いてくださいと言われたらどこまで書けますか?

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

Posted: 2014年11月29日(土) 00:37
by cross-eyes
極単純にカンマ(,)区切りのデータを読み込むようにするなど、
それが賢いかはともかくやり方はいくらでもあるような気がします。

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

Posted: 2014年11月29日(土) 00:42
by cross-eyes
オフトピック
大変申し訳ありません…
暗闇でスマホから入力したせいか、誤って解決ボタンを押してしまっていました。

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

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

Posted: 2014年11月29日(土) 00:52
by softya(ソフト屋)
解決は外しておきました。管理人にご依頼ください。
なお、全部で100種類いたとしても1ステージに10種類以内に納めれば0-9で事足りますよ。

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

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

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

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

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

Posted: 2014年12月09日(火) 11:46
by megaman
ご無沙汰しております。
すいません、やはり文字列だと

コード:

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種類まで用意できると書いていたため、
すこし改変すればいいだろうと軽い気持ちでいました・・・
皆さんには迷惑をかけます。申し訳ありませんが、もう一度考えていただきませんか?

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

Posted: 2014年12月09日(火) 11:50
by softya(ソフト屋)
g_stagedata.enemies.type = (EnemyType)(c - '0');
ここの部分で、cからifで条件分けして番号を作りだす関数を用意するだけだと思いますよ。
g_stagedata.enemies.type = getEnemyType(c);

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

Posted: 2014年12月12日(金) 10:16
by megaman
>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;
	}
}
本来は各項目にモンスターのコメントを書いています。