あれのmove_boss_pos関数などを使って「ある一定の範囲になったら方向転換」といった感じにしたいのですが、
上手くいきません。もっと具体的に言えば、「常に直線で動き続けていて画面の端っこに来ると跳ね返るを繰り返す」ような動きにしたいのです。
(すみません、編集して付け加えます。上記の「」の中の主語が抜けていました。それぞれ、「『ボスが』ある一定の範囲に来たら」、「常に直線で動き続けていて『ボスが』画面の端っこに来る」と、です。すみません)
とりあえず、ここまで描きました
50章改のものを元に書いています。
--boss_shotH.cppを変更--
void boss_shot_bulletH000(){
#define H303t 10//移動時間
#define H303d 1000.0//移動範囲
int i,k,c,e,t=boss_shot.cnt,t2=boss_shot.cnt;
static double dist;//移動距離
static int move_flag; //動けるかどうかのフラグ
if(t2==0)boss.endtime=6000;
if(t2==0){
move_flag=1;
move_straight=1;//boss_shot.cppのmove_boss_posで使う。真っ直ぐ移動します
dist=590;
move_angle=PI/2;//上に同じ。事前に移動する角度を決めておきます。
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
}
if(t2%2==0)
move_flag=1;
//「~域」と書いてあるのは、「その領域に入ったらこの角度に変更」の意味です
//主人公機体が動けるゲーム画面を中心に、3×3の四角マスに分けてあります
if(boss.x<=0 && 0<boss.y && boss.y<FMY && move_flag==1){//左域
move_straight=0;
move_detail=1;
move_angle=0;
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
if(FMX<=boss.x && 0<boss.y && boss.y<FMY && move_flag==1){//右
move_straight=0;
move_detail=1;
move_angle=PI;
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
if(boss.y<=0 && 0<boss.x && boss.x<FMX && move_flag==1){//上
move_straight=0;
move_detail=1;
move_angle=PI/2;
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
if(FMY<=boss.y && 0<boss.x && boss.x<FMX && move_flag==1){//下
move_straight=0;
move_detail=1;
move_angle=PI+PI/2;
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
if(boss.x<=0 && boss.y<=0 && move_flag==1){//左上
move_detail=0;
move_straight=1;
move_angle=PI/4+rang(PI/9);
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
if(FMX<=boss.x && boss.y<=0 && move_flag==1){//右上
move_detail=0;
move_straight=1;
move_angle=PI/2+PI/4+rang(PI/9);
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
if(boss.x<=0 && FMY<=boss.y && move_flag==1){//左下
move_detail=0;
move_straight=1;
move_angle=-PI/4+rang(PI/9);
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
if(FMX<=boss.x && FMY<=boss.y && move_flag==1){//右下
move_detail=0;
move_straight=1;
move_angle=-PI/2-PI/4+rang(PI/9);
move_boss_pos(-H303d,-H303d,FMX+H303d,FMY+H303d,dist,H303t);
move_flag=0;
}
}
--GV.cppに以下の変数を追加--
GLOBAL int move_straight;
GLOBAL double move_angle;
GLOBAL int move_detail;
--boss_shot.cppのmove_boss_posに付け加え--
int move_boss_pos(double x1,double y1,double x2,double y2,double dist, int t){
int i;
double x,y;
static double angle;
if(move_straight==0 && move_ch==0 && move_detail==0){
for(i=0;i<1000;i++){
x=boss.x,y=boss.y;//今のボスの位置をセット
angle=PI/2;//適当に向かう方向を決める
x+=cos(angle)*dist;//そちらに移動させる
y+=sin(angle)*dist;
if(x1<=x&&x<=x2 && y1<=y&&y<=y2){//その点が移動可能範囲なら
input_phy_pos(x,y,t);
return 0;
}
}
}
//付け加えここから、
if(move_straight==1){//真っ直ぐ動く
for(i=0;i<1000;i++){
x=boss.x,y=boss.y;//今のボスの位置をセット
angle=move_angle;//事前に決めた角度を代入
x+=cos(angle)*dist;//そちらに移動させる
y+=sin(angle)*dist;
if(x1<=x&&x<=x2 && y1<=y&&y<=y2){//その点が移動可能範囲なら
input_phy_pos(x,y,t);
return 0;
}
}
}
if(move_detail==1){//事前に決めた角度+ランダム
for(i=0;i<1000;i++){
x=boss.x,y=boss.y;//今のボスの位置をセット
angle=move_angle+rang(PI/4+PI/9);
x+=cos(angle)*dist;//そちらに移動させる
y+=sin(angle)*dist;
if(x1<=x&&x<=x2 && y1<=y&&y<=y2){//その点が移動可能範囲なら
input_phy_pos(x,y,t);
return 0;
}
}
}
//ここまで
return -1;//1000回試してダメならエラー
}
ここからが問題なのですが、
これで一応、跳ね返るような動きはするのですが、ある一定の位置に来ると止まってしまいます。
ある一定の位置というのは、それぞれの四っつの角すみ辺りというだけしかわかりません。しかしあくまでも「辺り」で、座標を調べて見ましたが、停止位置は安定しませんでした(差10px辺り?)。なので、座標は関係ないかもしれません。確認したのがその場所と言うだけで、もしかしたら画面の中央あたりでも止まるかもしれません。
ともかくも、どうして止まってしまうのでしょうか? 見にくいコードになってるかもしれませんが、どうか教えてください、お願いしますm(_ _)m
(因みに、何でいちいちmove_flagというのを立てているかと言うと、こうしないと動いてくれないからです。何で動いてくれないのか解りませんが……。しかし、これが立っていないから動かない、というわけではないようです)