描画・効果音などについては自分で変更してください。
今回の内容は
1.村のオープニングの追加
2.初期化
3.斧とキコリの処理の追加
4.移動処理
です。
1.村のオープニングの追加
起動後初めて村に入ったときのみオープニングを流すことにします。
これを判定するため、mura_opening_flagを追加します。0のときのみオープニングにします。
村の状態にMURA_OPENINGとCUTを追加。CUTはキコリが木を倒している状態を表すことにしています。
オープニングの処理を追加。
ここでは5秒経過かESCキーが押されるとWALKになるというようにしておきます。
また、オープニングでは文字以外は描画する内容がmura_graphと同様なので
そちらで5秒かけて村が明るくなっていくようにしておきます。
//オープニングの処理
void control_mura_opening(){
if(mura_count==300 || CheckStateKey(KEY_INPUT_ESCAPE)==1){
mura_state=WALK;
}
}
それぞれ を追加。
2.初期化
前回は村人の位置を固定にしていましたが今回はキコリを除き、ランダムに配置します。
村人のいる位置は移動不可能にします。これで重なりやすり抜けが起こらなくなります。
キコリのメッセージのみ斧の状態に合わせて変化させます。この変化は
斧購入時にも行います。
当たり判定をつけるようにしたのでマップの初期化も行うようにします。
さらに、1.でかいたオープニングの処理に移るかの分岐も行います。
マップデータについて以下のように変更。
//判定用データ 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];
//初期化
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()の以下を変更
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;
}
}
ここでは「キコリが木を切っています。しばらくお待ちください」という文字を表示させ、
5秒経過でWALKに戻すというようにします。
以下を追加
//キコリが木を切っているときの処理
void control_mura_cut(){
if(mura_count>300){
mura_state=WALK;
}
else DrawStringToHandle(150,240,"キコリが木を切っています。しばらくお待ちください",color[0],font[0]);
}
キコリだけは向きの変更しかしませんのでここでは無視しています。
アイシャも村人も移動するときに足元の判定を移動可能にし、行き先の判定を移動不可能にします。
このとき、ショップなどが機能するようにアイシャは行き先が0のときのみ行き先を移動不可能にし、
村人は行き先が0の時のみ移動することができるようにします。
村人の移動中の動きは高速移動がない以外はアイシャと同様です。
移動処理の前にEXスタート用の処理を追加。今回は5面に出るようにしています。
m_ch_moveに以下を追加
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;
また、前回のままでは移動できない時にその方向に向きを変えられないというバグがあったので修正。
m_ch_move()の以下を変更。
//歩く
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;
}
}
次に村人の移動です。
以下を追加。
//村人の移動
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;
}
}
}
}
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は溶岩、
釣竿が追加されたらしい、釣竿でキャラクターを引き寄せることも可能であるらしい、
まさか!?