本文長いです、スミマセン…
ソースまるごとはチト恥ずかしいので、勘弁してください…
あと、無駄に絵とか貼っちゃってモウシワケナイ…
>え、マジですか!配布していないゲームを持っていらっしゃるとは結構こちらも存じている可能性が・・。
友人が以前ここでC言語のお勉強をしてました。私自身は確かにはじめましてです。
ちなみに来月から大学生の予定です。(まだ受かってませんが)
管理人さんが言わんとしている事が分かるような分からないような…
すみませんが、こっちが解像度320x240、1ブロック16x16でやってるので、
それで話を進めさせてください。
まず、マップのデータは
unsigned char STAGE_MAP_DATA[20*15]={
0,0,0,0,0,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,0, 0,0,0,0,0,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 0,0,0,0,0,
0,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,0,0,0,0,0,0,0,0, 0,0,0,0,0
};
という感じで作ってます。0が通れないブロック、1が通れるブロックです。
で、どんなマップでも同じ動きをするよう汎用性を持たせたかったので、
キャラクタの上下左右を調べて、そこに該当するブロックが何か調べたりしてます。
画像の淡灰色の■がキャラで、赤い点が調べる位置です。
//キャラの上側のブロック当たり判定。0:動けない 1:動ける
unsigned char BlockJudge_U(int x,int y,unsigned char *map){
if( map[ ((y+16)/16)*20 + (x+8)/16 ] == 0 ) return 0;
else return 1;
};
こんな感じで上下左右作ってます。それで、
if( Key[ KEY_INPUT_UP ] ){ //上ボタンが押されたら
if(BlockJudge_U((int)ch.x,(int)ch.y,STAGE_MAP_DATA)==1){ //上が動けるブロックで
if( (int)ch.x%16!=0 ){ //微妙な位置のとき、
if( BlockJudge_L((int)ch.x,(int)ch.y-16,STAGE_MAP_DATA)==1 ) //左上が動けるなら(-16は1ブロック上の意)
ch.x-=(0.5+ch.speed*0.5); //xの値を1減らす
if( BlockJudge_R((int)ch.x,(int)ch.y-16,STAGE_MAP_DATA)==1 ) //右上が動けるなら
ch.x+=(0.5+ch.speed*0.5); //xの値を1増やす
}
ch.y-=(0.5+ch.speed*0.5); //yの値を1減らす
}
}
そうそう、 ch.x と ch.y はdouble型、ch.speed はint型です。けど、こうやって書いちゃえばいいかなぁなんて…
元々整数値にしてたんですが、それだけだと急激に速くなるので、小数を使ってみました。
そうすると、「ch.x+=1」とかと等しい値になるとちゃんと画像のように行ってくれますが、
やっぱり3とか5とかX.5になると移動しすぎで右側のブロックにズボッとなります。(ならない場合もあったりしちゃう)
…なんか16の約数の問題っぽい気もしてきましたが。うまく思いつかない…