障害物(座標はjamax,jamayです)の判定で悩んでいます。
常に落ちるように常にかかり続ける重力(Gravity)と、それを止める地面(jimen)を作り、
なんとか障害物の上に乗れるよう調整したところ、次のようなコードになりました。
これでなんとか障害物の判定は作れました。
しかし、このコードには致命的なバグがあります。
障害物に触れている状態で障害物の方向にキーを入れ、ジャンプするとキャラがポーンと画面外に飛んで行ってしまうのです。
また障害物をたくさん空中に置いたりするとなるとこれではいけない…と思うのですが、どうしたらよいかわかりません…
将来的には落ちる人をSHIFTで遅くして助けるというゲームにしたいです。(ここにも問題があるのですが…)
よろしくお願いします!
#include "Dxlib.h"
using namespace DxLib;
int Playerx,Playery;
int Gravity;
int jamax,jamay;
int jimen;
char Buf[256];
int jiki;
int haikei;
int Cr;
double enemyx,enemyy;
double enemyg;
int enemypic;
int kasoku;
void load()
{
//Cr = GetColor(0,0,255) ;
jiki = LoadGraph( "test.bmp" ) ;
enemypic = LoadGraph( "teki.bmp" ) ;
haikei = LoadGraph( "haikei.bmp" ) ;
Cr = GetColor(0,0,255 ) ;
SetDrawScreen(DX_SCREEN_BACK);
}
void hyoji()
{
DrawGraph(0,0,haikei, FALSE) ;
DrawGraph(Playerx-32,Playery-32,jiki, true) ;
DrawGraph(enemyx-32,enemyy-32,enemypic, true) ;
DrawBox( jamax , jamay , jamax+32 , jamay+32, Cr , TRUE) ;
DrawFormatString(0 , 0 , GetColor(0,255,0) , "x = %d y = %d" , Playerx , Playery);
}
void sousa()
{
GetHitKeyStateAll( Buf ) ;
if(Buf[KEY_INPUT_RIGHT])
{
Playerx+=5;
}
if(Buf[KEY_INPUT_LEFT])
{
Playerx-=5;
}
}
void juryoku()
{
Playery-=Gravity;
Gravity-=1;
//問題の場所です
if(Buf[KEY_INPUT_Z]&&( (Playery >= jimen && (jamax-32>=Playerx || jamax+64<=Playerx) ) || (Playery>=jamay-32&&(jamax-32<Playerx && jamax+64>Playerx))))
{
Gravity+=20;
}
}
void slow()
{
if(Buf[KEY_INPUT_LSHIFT])
{
enemyg = 0.1;
Gravity = -2;
}
}
void kabe()
{
if(0>Playerx)
{
Playerx =0;
}
//おそらく問題のある場所です↓
if(Playery > jimen && (jamax-32>=Playerx || jamax+64<=Playerx))
{
Playery = jimen;
Gravity = 0;
}
//おそらく問題のある場所です↓
if(Playery>jamay-32 && (jamax-32<Playerx && jamax+64>Playerx))
{
Playery=jamay-32;
Gravity=0;
}
}
void block()
{
//おそらく問題のある場所です↓
/*if(jamax-32<Playerx && jamax+64>Playerx && Playery<jamay-32)
//上のほうの当たり判定
{
//if(){
//Playery = jamay-32;
//}
}*/
if(jamax-32<Playerx && jamax-32>Playerx-32 && jamay-32<Playery)
//左のほうの当たり判定
{
Playerx = jamax-32;
}
if(jamax+64>Playerx && jamax+64<Playerx+32 && jamay-32<Playery)
//右のほうの当たり判定
{
Playerx = jamax+64;
}
}
void teki()
{
enemyy -= enemyg;
enemyg -= 0.1;
if(enemyy > jimen)
{
enemyy = jimen;
enemyg = 0;
}
if((Playerx-32 < enemyx <Playerx+32) && (Playery-32 < enemyy < Playery+32))
{
DrawCircle( 320 , 240 , 150 , Cr , FALSE ) ;
}
}
int end()
{
if(ProcessMessage() == -1)
{
return -1;
}
return 0;
}
int loop()
{
sousa();
juryoku();
//かえたとこ↓(順番入れ替え)
block();
kabe();
teki();
ClearDrawScreen() ;
slow();
hyoji();
ScreenFlip();
if(end() == -1)
{
return -1;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(1);
if(DxLib_Init()== -1)
{
return -1;
}
Gravity=0;
Playerx=0;
jimen=368;
jamax=200;
enemyx=500;
enemyy=0;
enemyg = 0;
kasoku = 0;
Playery=jimen;
jamay=jimen;
load();
while(1)
{
if(loop() == -1)
{
break;
}
}
DxLib_End();
return 0;
}