
ようやくブロックを押せるようになりました。
で、嬉々として動かしていたのですが、こうなってしまい、
(黄土色の場所は行けない部分なため)積みました。
ブロックを引く処理も検討してみたものの、今回書いた方法とは違う方法を考えないと駄目みたいです。
なので、とりあえず整理する意味で押す処理を書いておきます。
// 中略済みマップデータ//ブロックを動かす上でのメイン処理。
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
本編と関係のない後記。
以前の記事で、関数化のことに触れたが、
この計画は、もう少し作りこんでからにしようと思った。
なぜなら、どの処理情報がどこで必要になるかの予測が難しかったからである。
今回、関数化がゲームプログラミングの邪魔になってしまったことからも、
そのことをつくづく感じた。


