村の処理ラスト

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

村の処理ラスト

投稿記事 by Tatu » 14年前

5回にわたって続いた村の処理も今回でいったん終わりとします。
描画・効果音などについては自分で変更してください。


今回の内容は

1.村のオープニングの追加
2.初期化
3.斧とキコリの処理の追加
4.移動処理
です。

1.村のオープニングの追加
起動後初めて村に入ったときのみオープニングを流すことにします。
これを判定するため、mura_opening_flagを追加します。0のときのみオープニングにします。

村の状態にMURA_OPENINGとCUTを追加。CUTはキコリが木を倒している状態を表すことにしています。

CODE:

enum{
MURA_OPENING,
WALK,
TALK,
SHOP,
MENU,
CUT,
}mura_state;
オープニングの処理を追加。
ここでは5秒経過かESCキーが押されるとWALKになるというようにしておきます。

また、オープニングでは文字以外は描画する内容がmura_graphと同様なので
そちらで5秒かけて村が明るくなっていくようにしておきます。

CODE:

//オープニングの処理
void control_mura_opening(){
	if(mura_count==300 || CheckStateKey(KEY_INPUT_ESCAPE)==1){
		mura_state=WALK;
	}
}
graph_mura()の最初と最後のほうに
それぞれ

CODE:

	if(mura_state==MURA_OPENING){
		SetDrawBlendMode(DX_BLENDMODE_ALPHA,255*mura_count/300);
	}

CODE:

	if(mura_state==MURA_OPENING){
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
	}
を追加。


2.初期化
前回は村人の位置を固定にしていましたが今回はキコリを除き、ランダムに配置します。
村人のいる位置は移動不可能にします。これで重なりやすり抜けが起こらなくなります。
キコリのメッセージのみ斧の状態に合わせて変化させます。この変化は
斧購入時にも行います。
当たり判定をつけるようにしたのでマップの初期化も行うようにします。
さらに、1.でかいたオープニングの処理に移るかの分岐も行います。

マップデータについて以下のように変更。

CODE:

//判定用データ 0:通過可能 1:通過不可 2:ノーマルスタート
//3:アイテムショップ 4:雑貨屋 5:鍵屋 6:EXスタート
//コピー用のデータ
int mura_map_first_data[17][20]={
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1},
	{1,0,0,0,1,1,1,1,0,0,0,1,4,1,1,0,0,0,0,1},
	{1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1},
	{1,0,0,0,1,3,1,1,0,0,0,0,1,1,1,1,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,1,5,1,1,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};

//ゲーム中に使用するデータ
int mura_map_data[17][20];
初期化の処理を書きます。

CODE:

//初期化
void mura_ini(){
	int x,y;//マップデータの初期化、村人の位置決定に使用。
	for(y=0;y0 && ch.money>=shop_price[shop_knd][shop_select]){
			item_state[shop_knd][shop_select]=1;
			ch.money-=shop_price[shop_knd][shop_select];
			//斧のみキコリのセリフの変化を起こす
			if(shop_knd==1 && shop_select==0){
				murabito[6].message_knd=28;
			}
		}
	}
キコリのセリフの処理を書きます。

control_mura_talk()の以下を変更

CODE:

			else{
				if(murabito[m_ch.talk].message_knd==28){
					item_state[1][0]=2;
					mura_map_data[16][1]=6;
					mura_map_data[16][2]=6;
					mura_map_data[15][1]=0;
					mura_map_data[15][2]=0;
					mura_map_data[14][1]=0;
					mura_map_data[14][2]=0;
					murabito[m_ch.talk].message_knd++;
					murabito[m_ch.talk].state=0;
					mura_count=0;
					mura_state=CUT;
				}
				else{
					murabito[m_ch.talk].state=0;
					mura_state=WALK;
				}
			}
CUTの状態の処理の追加
ここでは「キコリが木を切っています。しばらくお待ちください」という文字を表示させ、
5秒経過でWALKに戻すというようにします。
以下を追加

CODE:

//キコリが木を切っているときの処理
void control_mura_cut(){
	if(mura_count>300){
		mura_state=WALK;
	}
	else DrawStringToHandle(150,240,"キコリが木を切っています。しばらくお待ちください",color[0],font[0]);
}
4.移動処理
キコリだけは向きの変更しかしませんのでここでは無視しています。

アイシャも村人も移動するときに足元の判定を移動可能にし、行き先の判定を移動不可能にします。

このとき、ショップなどが機能するようにアイシャは行き先が0のときのみ行き先を移動不可能にし、
村人は行き先が0の時のみ移動することができるようにします。

村人の移動中の動きは高速移動がない以外はアイシャと同様です。

移動処理の前にEXスタート用の処理を追加。今回は5面に出るようにしています。
m_ch_moveに以下を追加

CODE:

		case 6:
			mura_count=-1;
			practice=0;
			stage=4;
			boss.boss_num=stage_boss_num[stage-1]+1;
			boss.knd=boss.danmaku_num[boss.boss_num-1];//enter_bossで1足されるため
			func_state=GAME_INI;
			return;
足元の判定が1なら0にし、行き先の判定が0なら1にするという処理を追加。
また、前回のままでは移動できない時にその方向に向きを変えられないというバグがあったので修正。

m_ch_move()の以下を変更。

CODE:

		//歩く
		if(CheckStatePad(configpad.slow)){
			m_ch.shift=2;
		}
		else m_ch.shift=1;

		if(CheckStatePad(configpad.right)){
			m_ch.muki=0;
			if(mura_map_data[m_ch.y/32][m_ch.x/32+1]!=1){
				if(mura_map_data[m_ch.y/32][m_ch.x/32]==1){
					mura_map_data[m_ch.y/32][m_ch.x/32]=0;
				}
				if(mura_map_data[m_ch.y/32][m_ch.x/32+1]==0){
					mura_map_data[m_ch.y/32][m_ch.x/32+1]=1;
				}
				m_ch.x+=2*m_ch.shift;
			}
		}
		else if(CheckStatePad(configpad.down)){
			m_ch.muki=1;
			if(mura_map_data[m_ch.y/32+1][m_ch.x/32]!=1){
				if(mura_map_data[m_ch.y/32][m_ch.x/32]==1){
					mura_map_data[m_ch.y/32][m_ch.x/32]=0;
				}
				if(mura_map_data[m_ch.y/32+1][m_ch.x/32]==0){
					mura_map_data[m_ch.y/32+1][m_ch.x/32]=1;
				}
				m_ch.y+=2*m_ch.shift;
			}
		}
		else if(CheckStatePad(configpad.left)){
			m_ch.muki=2;
			if(mura_map_data[m_ch.y/32][m_ch.x/32-1]!=1){
				if(mura_map_data[m_ch.y/32][m_ch.x/32]==1){
					mura_map_data[m_ch.y/32][m_ch.x/32]=0;
				}
				if(mura_map_data[m_ch.y/32][m_ch.x/32-1]==0){
					mura_map_data[m_ch.y/32][m_ch.x/32-1]=1;
				}
				m_ch.x-=2*m_ch.shift;
			}
		}
		else if(CheckStatePad(configpad.up)){
			m_ch.muki=3;
			if(mura_map_data[m_ch.y/32-1][m_ch.x/32]!=1){
				if(mura_map_data[m_ch.y/32][m_ch.x/32]==1){
					mura_map_data[m_ch.y/32][m_ch.x/32]=0;
				}
				if(mura_map_data[m_ch.y/32-1][m_ch.x/32]==0){
					mura_map_data[m_ch.y/32-1][m_ch.x/32]=1;
				}
				m_ch.y-=2*m_ch.shift;
			}
		}
これでアイシャのほうは終了です。

次に村人の移動です。
以下を追加。

CODE:

//村人の移動
void murabito_move(){
	int i;
	for(i=0;i<6;i++){
		if(murabito[i].state==1) continue;//会話中は動かない
		if(murabito[i].state==0 && murabito[i].x==m_ch.x+32 && murabito[i].y==m_ch.y){
			if(GetRand(180)==0){//180フレームに一回の確率で移動
				switch(GetRand(3)){
				case 0:
					murabito[i].muki=0;
					if(mura_map_data[murabito[i].y/32][murabito[i].x/32+1]==0){
						mura_map_data[murabito[i].y/32][murabito[i].x/32]=0;
						mura_map_data[murabito[i].y/32][murabito[i].x/32+1]=1;
						murabito[i].x+=2;
					}
					break;
				case 1:
					murabito[i].muki=1;
					if(mura_map_data[murabito[i].y/32+1][murabito[i].x/32]==0){
						mura_map_data[murabito[i].y/32][murabito[i].x/32]=0;
						mura_map_data[murabito[i].y/32+1][murabito[i].x/32]=1;
						murabito[i].y+=2;
					}
					break;
				case 2:
					murabito[i].muki=2;
					if(mura_map_data[murabito[i].y/32][murabito[i].x/32-1]==0){
						mura_map_data[murabito[i].y/32][murabito[i].x/32]=0;
						mura_map_data[murabito[i].y/32][murabito[i].x/32-1]=1;
						murabito[i].x-=2;
					}
					break;
				case 3:
					murabito[i].muki=3;
					if(mura_map_data[murabito[i].y/32-1][murabito[i].x/32]==0){
						mura_map_data[murabito[i].y/32][murabito[i].x/32]=0;
						mura_map_data[murabito[i].y/32-1][murabito[i].x/32]=1;
						murabito[i].y-=2;
					}
					break;
				}
			}
		}
		else{
			switch(murabito[i].muki){
			case 0:
				murabito[i].x+=2;
				break;
			case 1:
				murabito[i].y+=2;
				break;
			case 2:
				murabito[i].x-=2;
				break;
			case 3:
				murabito[i].y-=2;
				break;
			}
		}
	}
}
最後にmura_main()の変更です。

CODE:

void mura_main(){
	if(mura_count==0) mura_ini();
	switch(mura_state){
	case MURA_OPENING:
		control_mura_opening();
		mura_graph();
		break;
	case WALK:
		m_ch_move();
		murabito_move();
		mura_graph();
		break;
	case SHOP:
		graph_shop();
		break;
	case MENU:
		control_mura_menu();
		graph_mura_menu();
		break;
	case TALK:
		murabito_move();
		mura_graph();
		graph_mura_talk();
		control_mura_talk();
		break;
	case CUT:
		control_mura_cut();
		break;
	}
	mura_count++;
}
これで村関連の処理は終わりです。

次はどの処理にしましょうか。



前回の日記のDixqさんのコメントに対して
あの挑戦的なセリフは印象に残っていたので。

SAIさんのアンケート結果に対して
見事に互角でしたね。


MNSさんのRTSは今どうなっているんだろう。

DecentLavaさんの改名理由はいったい?
釣り師、最近minecraftにはまっている、沖さんも同様だったはず、lavaは溶岩、
釣竿が追加されたらしい、釣竿でキャラクターを引き寄せることも可能であるらしい、
まさか!?

アバター
MNS
記事: 35
登録日時: 14年前

Re: 村の処理ラスト

投稿記事 by MNS » 14年前

試験やら風邪やらで停滞しています。
きっと試験休み+春休みの長期休暇できっと進展を果たすはず…!