現在、横スクロールアクションを製作中で、地形との当たり判定を計算する関数を作成しています。関数の中身はこうなっています。
/*----------------------------------------------
arx は、キャラクタのx座標,aryはキャラクタのy座標,キャラの当たり判定は64*64の正方形です。
ari,arjはマップ配列map[i][j]を参照するためのものです,マップ配列は64*64のフィールドを1要素としており、そのフィールドの地形情報を持っています。
CMapはマップのクラスです
*/----------------------------------------------
void Control(int* arx,int* ary,int* ari,int*arj,CMap* M)
{
/*map配列の1要素は64*64のフィールドを表しています*/
*arj=int(*arx/64),*ari=int(*ary/64);
/*MXはフィールドのX座標の最大値です。*/
/*ここから当たり判定
当たり判定の判定の仕方は、移動先のmap要素の状態を調べて、陸地なら移動しないようにしています*/
if(Key[KEY_INPUT_RIGHT]>=1 && *arx<MX)
{
*arx += RUN;
*arj=int(*arx/64),*ari=int(*ary/64);
/*右上と右下の角を調べています Maprffect関数はmap配列の地形情報を返してくれます、1であれば陸地です*/
if((*M).Mapeffect(ari,&(*arj=int((*arx+63)/64)) ) == 1 || (*M).Mapeffect(&(*ari = int((*ary+63)/64)),&(*arj =int((*arx+63)/64))) == 1 ) *arx -= RUN;
}
if(Key[KEY_INPUT_LEFT]>=1 && *arx>0)
{
*arx -= RUN;
*arj=int(*arx/64),*ari=int(*ary/64);
/*左上と左下の角をしらべます*/
if((*M).Mapeffect(ari,arj) == 1 || (*M).Mapeffect(&(*ari = int((*ary+63)/64)),arj) == 1 ) *arx += RUN;
}
if(Key[KEY_INPUT_DOWN]>=1 && *ary<MY)
{
*ary += RUN;
*arj=int(*arx/64),*ari=int(*ary/64);
/*左下と右下の角を調べます*/
if( (*M).Mapeffect(&(*ari = int((*ary+63)/64)),&(*arj =int((*arx+63)/64))) == 1 || (*M).Mapeffect(&(*ari = int((*ary+63)/64)),arj) == 1) *ary -= RUN;
}
if(Key[KEY_INPUT_UP]>=1 && *ary>0)
{
*ary -= RUN;
*arj=int(*arx/64),*ari=int(*ary/64);
/*左上と右上の角を調べます*/
if((*M).Mapeffect(ari,arj) == 1 ||(*M).Mapeffect(ari,&(*arj =int((*arx+63)/64)) ) == 1) *ary += RUN;
}
}
現に、右、左、上の判定は正しく行われています。
しかし下の判定が上手く行きません。
左下の角が地面に触れていて、右下の角が地面に触れていないときに、陸地にめり込んでしまいます。
コードを同様に書いたのにこんなことになってしまったので、よくわからなくなり投稿しました。
なにかアドバイスがありましたら返答願います。
お願いします。