とりあえず、コーディングしてみたのですが、バグが出来てしまいました。
テーブルを参照する形にしたのですが、上手くいきませんでした。
どう上手くいかなかったかというと、逆に斜め方向が飛ばなくなったばかりか、
上下左右しか弾が飛ばなくなりました。
int smooth(int i,int j,int count)
{
//up:0 down:1 left:2 right:3
/*
00,01,02,03
10,11,12,13
20,21,22,23
30,31,32,33
*/
float Table[16][4]={
{90,90,90,90},{90,90-22.5,90-22.5*2,90-22.5*3},{90,120,150,180},{90,60,30,0},
{270,200,150,90},{270,270,270,270},{270,240,210,180},{270,300,330,0},
{180,150,120,90},{180,210,240,270},{180,180,180,180},{180,120,60,0},
{0,30,60,90},{0,330,300,270},{0,60,120,180},{0,0,0,0}
};
return Table[i+j*4][count];
}
int SmoothAngle()
{
static int prevkey[4]={0};
static int angle=0;
static int count[4][4]={0};
static int count2[4][4]={0};
int up[4]={0};
int i,j;
up[0]=CheckHitKey(KEY_INPUT_UP);
up[1]=CheckHitKey(KEY_INPUT_DOWN);
up[2]=CheckHitKey(KEY_INPUT_LEFT);
up[3]=CheckHitKey(KEY_INPUT_RIGHT);
//前回キーがXXXで、今回キーがXXXだったら
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(!prevkey
&& up[j])
{
return smooth(i,j,count2[j]);
}else if(!prevkey && !up[j])
{
count2[j]=0;
}
count[j]++;
if(count[j]>7)
{
count2[j]++;
if(count2[j]>3)count2[j]=3;
count[j]=0;
}
}
}
prevkey[0]=CheckHitKey(KEY_INPUT_UP);
prevkey[1]=CheckHitKey(KEY_INPUT_DOWN);
prevkey[2]=CheckHitKey(KEY_INPUT_LEFT);
prevkey[3]=CheckHitKey(KEY_INPUT_RIGHT);
return angle;
}
これらの関数を
メインループで
angle2=SmoothAngle();
CreateBullet(Player.x,Player.y+10,0,20,angle2);
として呼び出しています。 