キャラxが画面真ん中にきたら移動量を0にし、背景をスクロールさせるというプログラム
を組んだのですが、背景のスクロール最中の当たり判定のつけ方は
どうしたらいいでしょうか?
#define SCREEN_WIDTH (3840) // 画面の横幅
#define SCREEN_HEIGHT (480) // 画面の縦幅
#define CHIP_SIZE (32) // 一つのチップのサイズ
#define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅
#define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅
#define CHAR_SIZE (30)
#define G (0.3F) // キャラに掛かる重力加速度
#define speed (3.0F)
#define p_jump (7.0F) //キャラのジャンプ力
#define h_speed (4.0F) //背景のスピード
int pr;//プレイヤーハンドル
float px=0.0,py=420.0;//キャラ用変数
float Movex=0.0F,Movey=0.0F;//移動量
int ph,pw;//キャラ画像の高さと幅
float p_downsp=4.0F;
bool p_flag=false;//ジャンプフラグ
char Key[256];
int wall;//床ハンドル
int stage_haikei,sh_x=0;//背景用変数
// マップとの当たり判定( 戻り値 0:当たらなかった 1:左辺に当たった 2:右辺に当たった
// 3:上辺に当たった 4:下辺に当たった
// 注意:MoveX と MoveY 、どっちか片方が0じゃないと動作しない
int MapHitCheck(float cx,float cy,float *Movex,float *Movey);
char hantei[MAP_HEIGHT][MAP_WIDTH] ={
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,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,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,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,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, 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,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,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,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,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, 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,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,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,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,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, 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,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,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,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,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, 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,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,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,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,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, 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,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,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,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,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, 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,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,1, 1,1,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,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,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,0, 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,0, 0,0,0,0,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,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,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,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,0,0, 0,0,0,1,1, 0,0,0,0,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,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,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,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,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,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,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,2,2,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,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,0,0, 0,0,0,0,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,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,0, 0,0,2,2,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,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,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, 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,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, 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,0,0,0,
0,0,0,0,0, 0,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, 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,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, 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,0,0,0,
1,1,1,1,1, 0,1,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,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,0,0,0, 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,
} ;
int GetChipParam(float x,float y){
int cx,cy;
cx=(int)x/CHIP_SIZE;
cy=(int)y/CHIP_SIZE;
if(cx>=MAP_WIDTH || cy>=MAP_HEIGHT || cx<0 || cy<0){
return 0;
}
return hantei[cy][cx];
}
// キャラクタをマップとの当たり判定を考慮しながら移動する
int CharMove(float *cx,float *cy,float *DownSP,float Movex,float Movey,float size,bool *p_flag){
float Dummy = 0.0F ;
float hsize ;
// キャラクタの左上、右上、左下、右下部分が当たり判定のある
// マップに衝突しているか調べ、衝突していたら補正する
// 半分のサイズを算出
hsize=size*0.5F ;
// 先ず上下移動成分だけでチェック
{
// 左下のチェック、もしブロックの上辺に着いていたら落下を止める
if( MapHitCheck(*cx-hsize,*cy+hsize,&Dummy,&Movey)==3){
*DownSP=0.0F;
}
// 右下のチェック、もしブロックの上辺に着いていたら落下を止める
if(MapHitCheck(*cx+hsize,*cy+hsize,&Dummy,&Movey)==3){
*DownSP=0.0F;
}
// 左上のチェック、もしブロックの下辺に当たっていたら落下させる
if( MapHitCheck(*cx-hsize,*cy-hsize,&Dummy,&Movey)==4){
*DownSP=-1.0F;
}
// 右上のチェック、もしブロックの下辺に当たっていたら落下させる
if(MapHitCheck(*cx+hsize,*cy-hsize,&Dummy,&Movey)== 4){
*DownSP=-1.0F;
}
// 上下移動成分を加算
*cy+=Movey;
}
// 後に左右移動成分だけでチェック
{
// 左下のチェック
MapHitCheck(*cx-hsize,*cy+hsize,&Movex,&Dummy);
// 右下のチェック
MapHitCheck(*cx+hsize,*cy+hsize,&Movex,&Dummy);
// 左上のチェック
MapHitCheck(*cx-hsize,*cy-hsize,&Movex,&Dummy);
// 右上のチェック
MapHitCheck(*cx+hsize,*cy-hsize,&Movex,&Dummy);
// 左右移動成分を加算
*cx+=Movex;
}
// 接地判定
{
// キャラクタの左下と右下の下に地面があるか調べる
if(GetChipParam(*cx-size*0.5F,*cy+size*0.5F+1.0F)==0 && GetChipParam(*cx+size*0.5F,*cy+size*0.5F+1.0F)==0){
// 足場が無かったらジャンプ中にする
*p_flag=true;
}
else{
// 足場が在ったら接地中にする
*p_flag=false;
}
}
return 0 ;
}
int MapHitCheck(float cx,float cy,float *Movex,float *Movey){
float afX,afY;
// 移動量を足す
afX=cx+*Movex;
afY=cy+*Movey;
// 当たり判定のあるブロックに当たっているかチェック
if(GetChipParam(afX,afY)==1){
float blx,bty,brx,bby;
// 当たっていたら壁から離す処理を行う
// ブロックの上下左右の座標を算出
blx=(float)((int)afX/CHIP_SIZE)*CHIP_SIZE; // 左辺の X 座標
brx=(float)((int)afX/CHIP_SIZE+1)*CHIP_SIZE; // 右辺の X 座標
bty=(float)((int)afY/CHIP_SIZE)*CHIP_SIZE; // 上辺の Y 座標
bby=(float)((int)afY/CHIP_SIZE+1)*CHIP_SIZE; // 下辺の Y 座標
// 上辺に当たっていた場合
if(*Movey>0.0F){
// 移動量を補正する
*Movey=bty-cy-1.0F ;
// 上辺に当たったと返す
return 3;
}
// 下辺に当たっていた場合
if(*Movey<0.0F){
// 移動量を補正する
*Movey=bby-cy+1.0F;
// 下辺に当たったと返す
return 4;
}
// 左辺に当たっていた場合
if(*Movex>0.0F){
// 移動量を補正する
*Movex=blx-cx-1.0F;
// 左辺に当たったと返す
return 1;
}
// 右辺に当たっていた場合
if(*Movex<0.0F){
// 移動量を補正する
*Movex=brx-cx+1.0F;
// 右辺に当たったと返す
return 2;
}
// ここに来たら適当な値を返す
return 4;
}
// どこにも当たらなかったと返す
return 0;
}
void pmove(){
{
//左キーが押されたとき
if(Key[KEY_INPUT_LEFT]==1){
muki=1;
key_flag=true;
r_flag=1;
Movex-=speed;
if(Movex<=-3.0F){
Movex=-3.0F;
}
if(px>=320-32){
px-=(int)4*speed;
if(px<=320-32){
px=320-32;
Movex=0;
sh_x+=h_speed;
}
}
if(sh_x>=0){
sh_x=0;
if(px<=320-32){
Movex-=speed;
}
}
}
//右キーが押されたとき
if(Key[KEY_INPUT_RIGHT]==1){
muki=3;
key_flag=true;
r_flag=3;
Movex+=speed;
if(Movex>=3.0){
Movex=3.0;
}
if(px>=320-32){
px=320-32;
Movex=0;
sh_x-=h_speed;
}
if(sh_x<=-3200){
sh_x=-3200;
if(px>=320-32){
Movex+=speed;
}
}
}
//上キーが押されたとき
if(Key[KEY_INPUT_UP]==1 && p_flag==false){
muki=4;
p_downsp=-p_jump;
p_flag=true;
}
p_downsp+=G;
Movey=p_downsp;
CharMove(&px,&py,&p_downsp,Movex,Movey,CHAR_SIZE,&p_flag);
}
みずらく、ぐちゃぐちゃになって申し訳ございません。。。