STGのボスの移動のさせ方について(館の26章について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ptepe2h
記事: 7
登録日時: 11年前

STGのボスの移動のさせ方について(館の26章について

#1

投稿記事 by ptepe2h » 11年前

龍神録プログラミングの館26章にあるボスの移動のさせ方について質問です
あれの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というのを立てているかと言うと、こうしないと動いてくれないからです。何で動いてくれないのか解りませんが……。しかし、これが立っていないから動かない、というわけではないようです)

“C言語何でも質問掲示板” へ戻る