これらの”クォーター視点のステージをキャラが縦横無尽に動き回る”
それの当たり判定とスクロール方法ってどうなっているんだろう?
今回はそんな質問をしに来ました。
ついこの前、クォーターでの描画方法をここで教えてもらい、その後、教えてもらった方法で描画したマップの上をキャラが走るようにしてみました。
これがそのプログラムです。
#include"DxLib.h"
#include"Key.h"
//画面の大きさ
#define SCREEN_WIDTH 640;
#define SCREEN_HEIGHT 480;
//チップの枚数
#define CHIP_NUMBER_X 20
#define CHIP_NUMBER_Y 16
//プレイヤー構造体
typedef struct{
bool walkflag;//歩きフラグ
int img,cnt,muki;//画像、カウンタ、向き
int x,y;//座標
}PLAY;
//マップデータ
int MapData[ CHIP_NUMBER_Y ][ CHIP_NUMBER_X ] =
{
{ 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, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 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, 0, 0, 0, 0, 0, 0, 0, 0 }
};
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
//構造体宣言
PLAY p;
//画像変数
int player[54];
int map;
//画像の読み込み
map = LoadGraph("img/mapchip01.bmp");
LoadDivGraph("img/player.png",54,9,6,64,64,player);
//構造体要素の初期化
memset(&p,0,sizeof(PLAY));
//プレイヤー座標の初期化
p.x=160;
p.y=80;
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && updatekey()==0 ){
//プレイヤー移動アニメーションのためのカウント
p.cnt++;
//移動プログラム
if( checkkey(KEY_INPUT_LEFT)>0 ){//左
p.muki=1;
p.walkflag=true;
}else if( checkkey(KEY_INPUT_RIGHT)>0 ){//右
p.muki=2;
p.walkflag=true;
}else if( checkkey(KEY_INPUT_UP)>0 ){//上
p.muki=3;
p.walkflag=true;
}else if( checkkey(KEY_INPUT_DOWN)>0 ){//下
p.muki=4;
p.walkflag=true;
}else{
p.walkflag=false;//上記以外
}
//歩きフラグ分岐
if(p.walkflag==true){//歩きフラグがたってる時
if(p.muki==1){//左
p.x-=4;//左へ
p.img=10+(p.cnt/4)%8;//左へ走るアニメーション
}if(p.muki==2){//右
p.x+=4;
p.img=19+(p.cnt/4)%8;
}if(p.muki==3){//上
p.y-=4;
p.img=28+(p.cnt/4)%8;
}if(p.muki==4){//下
p.y+=4;
p.img=1+(p.cnt/4)%8;
}
}if(p.walkflag==false){//歩きフラグがたってない時
if(p.muki==1){//左だったら
p.img=9;//左向いて立っている画像
}if(p.muki==2){//右
p.img=18;//右向いて
}if(p.muki==3){//上
p.img=27;
}if(p.muki==4){//下
p.img=0;
}
}
//マップ描画
for(int y=0;y<CHIP_NUMBER_Y;y++){
for(int x=0;x<CHIP_NUMBER_X;x++){
if(MapData[y][x]==1){//1なら表示
DrawGraph(32*(x-y), 17*(x+y), map,TRUE);//ここの部分
}
}
}
//プレイヤー描画
DrawGraph(p.x,p.y,player[p.img],TRUE);
}
DxLib_End();
return 0;
}
”クォーター視点のステージをキャラが縦横無尽に動き回る”
この際の当たり判定はゲームプログラミングの館にある「行けないところを作る」のようなものなのでしょうか?
もしそうだと仮定してそこに載ってる
MapData[x/32-1][y/32]
のカッコ内の計算式がどう変わるのか?
ヒントをください。
スクロールについてはアクションゲームに実装はした経験はありますが、サンプルを流用しただけで理解はまったくできていません。
よくわからず放置してます……