自由帳:Cページ

自由帳:Cページ

プログラム学習記:このブログは、管理人葉月によるゲーム研究の場です。

ここにあるソースは、実験的な物や研究的なものを多大に含んでいます。

たとえ何か問題が発生しても責任は負いません。

Amebaでブログを始めよう!
自由帳:Cページ-積んでる

ようやくブロックを押せるようになりました。
で、嬉々として動かしていたのですが、こうなってしまい、
(黄土色の場所は行けない部分なため)積みました。
ブロックを引く処理も検討してみたものの、今回書いた方法とは違う方法を考えないと駄目みたいです。

なので、とりあえず整理する意味で押す処理を書いておきます。

// 中略済みマップデータ
int M_Active[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
{ 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,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,0,0,2,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,1,1,1,1,1,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 }
} ;

0:行ける場所
1:行けない場所
2
:ブロック

//物体の位置の初期化
for( i = 0 ; i < MAP_HEIGHT ; i ++ ){
for( j = 0 ; j < MAP_WIDTH ; j ++ ){
if( M_Active[ i ][ j ] == 2 ){y=i,x=j;}
}
}
2の位置を数えるのがめんどくさかったために作った処理だが、
2の位置を複数使うときに問題があるため改良の余地がある。
 //ブロックを動かす上でのメイン処理。
//ブロックの前でZ+十字キーで使用可能になる。
obj_select=can_or_cannot(ch.x,ch.y,ch.muki);
if(obj_select==1)  walking_flag=0;
if(obj_select==2) {
if(KeyBuf[KEY_INPUT_Z ]){
if (KeyBuf[ KEY_INPUT_UP ]&& M_Active[ y-1 ][ x ]!=1){ //上向きy--
y--;
M_Active[ y+1 ][ x ]=0;
}
     if(KeyBuf[ KEY_INPUT_RIGHT ] && M_Active[ y ][ x+1 ]!=1){ //右向きx++
x++;
M_Active[ y ][ x-1 ]=0;
}
if(KeyBuf[ KEY_INPUT_DOWN ]&& M_Active[ y+1 ][ x ]!=1) { //下向きy++
y++;
M_Active[ y-1 ][ x ]=0;
}
if(KeyBuf[ KEY_INPUT_LEFT ]&& M_Active[ y ][ x-1 ]!=1){ //左向きx--
x--;
M_Active[ y ][ x+1 ]=0;
}
}
M_Active[ y ][ x ]=2;
}
DrawGraph( x* MAP_SIZE, y*MAP_SIZE , dra[1] , FALSE ) ;

処理は、
・十字キーが押されていて、移動先が通行可能ならば、
例:if(KeyBuf[ KEY_INPUT_UP ]&& M_Active[ y-1 ][ x ]!=1)
・ブロックを押す。
例:y--;
・そして、移動前のブロックの位置を消去。
例:M_Active[ y+1 ][ x ]=0;
・後は、移動後のブロックの位置を書き加える。
M_Active[ y ][ x ]=2;
・それだけである。

全ソース
http://members3.jcom.home.ne.jp/strolling/zukai/mainGame.txt

本編と関係のない後記。
以前の記事で、関数化のことに触れたが、
この計画は、もう少し作りこんでからにしようと思った。
なぜなら、どの処理情報がどこで必要になるかの予測が難しかったからである。
今回、関数化がゲームプログラミングの邪魔になってしまったことからも、
そのことをつくづく感じた。

http://ameblo.jp/shaold/entry-10175943359.html

で考えた仕様をもう少し細かくしてみた。

メモ:秒数指定に関して。
物の重さを表現するために入れようかとも思ったのだが、
処理がめんどくさくなりそうなら省くかもしれない。

IF Enterが押されているか?{ //物を掴む処理
  IF ↑(上)
    IF   10秒以下 何もしない
    ELSE 10秒以上 上に移動
  IF →(右)
    IF   10秒以下 何もしない
    ELSE 10秒以上 右に移動
  IF ↓(下)
    IF   10秒以下 何もしない
    ELSE 10秒以上 下に移動
  IF ←(左)
    IF   10秒以下 何もしない
    ELSE 10秒以上 左に移動
}
ELSE{
  押されていない場合はここ。
}

こうやって考えてみると、
前後左右に動かす処理は、歩く処理と似ている部分がある事に気づく。
主にこの辺。

if(walking_flag==1){    //歩くフラグが立っていたら
  if (ch->muki==0)    //上向きならch->y座標を減らす
    ch->y--;
  else if(ch->muki==1) //右向きならch->x座標を増やす
    ch->x++;
  else if(ch->muki==2) //下向きならch->y座標を増やす
    ch->y++;
  else if(ch->muki==3) //左向きならch->x座標を減らす
    ch->x--;
}
else{
  break;
}

で、現在この十字キー部分をうまく利用して、汎用的な関数にできないものか?と考えている。

以前、こういう風にキャラを歩かせるように作った。
http://ameblo.jp/shaold/entry-10118548934.html


が、RPGではこういう風に歩かないことに気づいた。
では、どこを歩いているのか?

答えは、常に真ん中を歩いているということだ。
つまり、キャラは歩く動作のみで背景が動いているのである。

これをどうプログラムするのか分からないのでもう少し煮詰めてみようかと思う。

上記の問題を含みながらも完成した関数
http://members3.jcom.home.ne.jp/strolling/zukai/walk.txt
http://members3.jcom.home.ne.jp/strolling/zukai/walk_h.txt

前回のプログラム (2008-07-25)との違いは、
1キャラが歩いているアニメーションを追加

2データと処理の分離
関数へは、キャラ画像(画像は12分割限定)とキャラの位置を渡すだけでOK!

3立ち止まり時に、歩く途中の画像で止まらないように補正する関数を追加

の3点。
マップに関しては、後ほど。
だんだんこのブログがバージョン管理のためにupするようになってきているような…。


追記
キャラを常に真ん中に配置するには、

DrawGraph( ch->x , ch->y , ch->c , TRUE ) ; と言う関数を、
DrawGraph( 250 , 250 , ch->c , TRUE ) ; に変更すればいいと言うことが判明した。

(ちなみに250と言うのは暫定。使用するときは、#defineで数値を固定したほうが良さそう。)

追記その2
この関数内に背景を入れる処理も一緒に書かないといけないことが分かった。
背景と歩く処理を別に書いた場合、背景をロード後歩く処理に移り、
歩いている間は背景が消えてしまう。
そして、歩き終わったら背景画像が再びロードされると言った具合になった。
改良の余地があるが、歩かせるだけと言う意味では完成してるので、そのままにしておく。
(けっしてめんどくさかった訳ではない。)
自由帳:Cページ

上画面のようなプログラムを作りたいと考えています。

動きは、
1,パネルを動かす
2,1を繰り返してパネルを完成させる
3,チャラリラリラリr…じゃなかった。謎解き完了!

もう少しこの動きを細かく考えてみると…


キャラが歩いてきてパネルにぶつかる。
判定基準
IF ぶつかっているか?{
何秒間ぶつかっているかを調べる()
 IF 10秒以上
  パネルを一マス前へ

 ELSE 10秒以下
  そのまま
}

う~ん。こんな感じだろうか…
で、くっつけたパネルが正しいのかどうかを調べるには…

自由帳:Cページ

上画面のように、
マップ位置と、パネル画像に数値を持たせて、指定した位置に来ているのかをチェック。
それが全て一致していることを確認したら、初めて謎解き音が鳴る。

そして魔王降臨!

こんな感じか。
ふぅ。こうやって見ると、普段何気なくやってるゲームが凄いものに見えてくるよ。
長い事、プログラムを書く前に設計を行うというのはどういうことか分からなかった。
いくら設計が必要だといわれても…だ。

だが、あるときその意味に気づいた。
それは……

設計とは、

処理を細分化し、複数の関数に分けたとき、
それをどう組み合わせて、一つのソフトウェアを作るのか?

を考えるときに初めて必要になるものだということだ。

…ちなみに、この答えで正解かどうかは分からない(爆