| 
					 
							
						
								
									  | 
								 
							 							 
							
						 
						
 
 | 
 | 
 
2021/12/15(Wed) 09:39:37|NO.94702 
どうもお久し振りです。 
hspdxfix.asプラグインで作ったSTGゲームになります。
 
■やりたいこと 
敵の自機狙いを自機がどこにいても正確な位置に出したい
 
■仕様 
・敵の自機狙いは、自分の自機の中心を狙ってくる 
・自機の中心は「TE_x」「TE_y」で管理しており、自機からx+10、y+16している 
・敵を倒すと画面中心に移動する(エンターキーで再現) 
(できれば正確な位置にもしたい。例えば右端でエンター押すとちょっと座標ずれる)
 
es_ang REIMU_TM_x,REIMU_TM_y,TE_x-2,TE_y-16	;角度取得 
このあたりの数値をいじくれば中心によせることができるが、 
ボスが中央に移動すると少しずれてしまう傾向があります。
 
ボスが中央にしたら別処理とかもあると思うのですが、 
なるべくボスが中央になる前と同じ処理にしたいです。
  
#include "hspogg.as"	;音のために入れる
#include "hspdxfix.as"	;DXライブラリ使用
	width ,,130,200		;ウィンドウの位置
	es_ini 7100,7100,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
	es_screen 640,480 ,0,0,1,1
	es_window -13,-43, 640,480	;スプライト表示エリア設定
	es_area -36,-430, 600,498	;スプライト有効エリア設定
;---敵中央---
	es_size 5,30
	es_pat 100, 310,888
;---自機---
	es_size 28,42, 100
	es_pat 4000, 0, 0
	JIKI_x = 206 : JIKI_y = 390
	TE_x = 206+10 : TE_y = 390+16	;低速位置
	JIKISpd = 4		;自機のスピード(4)
;---低速(自機の中心)---
	es_size 9,9, 50
	es_pat 70, 46,43
	es_type 70,2
;---敵---
	es_size 27,59, 100
	es_pat 2201, 66,61
;明るい札
	es_size 13,15, 50
	es_pat 1000, 14,0
;自機が動ける範囲
;--上--
	es_size 383,3
	es_pat 10, 0,0
	es_set 10, 30,11, 10
;--左--
	es_size 3,450
	es_pat 11, 0,0
	es_set 11, 30,11, 11
;--下--
	es_size 383,3, 100
	es_pat 12, 0,0
	es_set 12, 30,460, 12
;--右--
	es_size 3,450
	es_pat 13, 0,0
	es_set 13, 411,11, 13
;************メインループ***************
*メイン
es_cls
es_draw
;*************カウンター****************
es_get REIMU_pos_x,2201,3	;X
es_get REIMU_pos_y,2201,5	;Y
	pos 500,50 : es_mes "REIMU_TAIM " + REIMU_TAIM
	pos 500,70 : es_mes "REIMU_pos_x " + REIMU_pos_x
	pos 500,90 : es_mes "REIMU_pos_y " + REIMU_pos_y
;********************************
;自機
	es_set 4000, JIKI_x,JIKI_y, 4000
;低速移動
	TE_x = JIKI_x+10 : TE_y = JIKI_y+16
	es_set 70, TE_x,TE_y, 70
;************gosub************
gosub *自機の移動
gosub *敵の処理
gosub *敵自機狙い
gosub *デバッグツール
es_sync	;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15	;キー取得
	if key & 1 : JIKI_x = JIKI_x - JIKISpd	;←の移動
	if key & 2 : JIKI_y = JIKI_y - JIKISpd	;↑の移動
	if key & 4 : JIKI_x = JIKI_x + JIKISpd	;→の移動
	if key & 8 : JIKI_y = JIKI_y + JIKISpd	;↓の移動
return
;****************敵の処理*************
*敵の処理
	if REIMU_f = 0 {
		REIMU_f = 1
		REIMU_x = 208 : REIMU_y = 70
		es_set 2201, REIMU_x,REIMU_y, 2201
		es_type 2201,4096
	}
;---行動処理---
	if REIMU_TAIM <= 800 : REIMU_TAIM++
	es_get REIMU_X, 2201, 3	;X座標取得
	es_get REIMU_Y, 2201, 5	;Y座標取得
	if HAKU_STO_f = 0 {	;敵を中央に移動させるフラグ
		if REIMU_IDO_F = 0 {	;停止中の処理
			es_pos 2201, REIMU_x, REIMU_y		;念のために位置を調整
			if REIMU_TAIM <= 99 : REIMU_x = 208 : REIMU_y = 70	;初期位置
			if REIMU_TAIM = 200 : es_aim 2201, 315, 177,200 : REIMU_IDO_F = 1	;→↓に移動(フラグ1)
			if REIMU_TAIM = 400 : es_aim 2201, 208, 70,200 : REIMU_IDO_F = 2	;←↑に移動(フラグ2)
			if REIMU_TAIM = 600 : es_aim 2201, 101, 177,200 : REIMU_IDO_F = 3	;←↓に移動(フラグ3)
			if REIMU_TAIM = 800 : es_aim 2201, 208, 70,200 : REIMU_IDO_F = 4	;→↑に移動(フラグ4)
		} else {
;フラグ1
			if REIMU_IDO_F = 1 {		;←↑に移動
				if (REIMU_X >= 315) && (REIMU_Y >= 177) {	;目的の座標に到着した場合
					es_apos 2201, 0, 0	;動きを止める
					REIMU_x = 315 : REIMU_y = 177	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
				}
			}
;フラグ2
			if REIMU_IDO_F = 2 {		;←↑に移動
				if (REIMU_X <= 208) && (REIMU_Y <= 70) {;目的の座標に到着した場合
					es_apos 2201, 0, 0	;動きを止める
					REIMU_x = 208 : REIMU_y = 70	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
				}
			}
;フラグ3
			if REIMU_IDO_F = 3 {		;←↓に移動
				if (REIMU_X <= 101) && (REIMU_Y >= 177) {;目的の座標に到着した場合
					es_apos 2201, 0, 0	;動きを止める
					REIMU_x = 101 : REIMU_y = 177	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
				}
			}
;フラグ4
			if REIMU_IDO_F = 4 {		;→↑に移動
				if (REIMU_X >= 208) && (REIMU_Y <= 70) {;目的の座標に到着した場合
					es_apos 2201, 0, 0;動きを止める
					REIMU_x = 208 : REIMU_y = 70	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
					REIMU_TAIM = 0		;時間を【リセット】
				}
			}
		}
	}
;敵中央
	es_set 100, 212,247, 100
	es_type 100,1024
;敵中央に移動
	if HAKU_STO_f = 1 {	;敵を中央に移動させるフラグ
		if REIMU_SP_IDO_F = 0 {		;スペカ移動フラグ
			es_aim 2201, 208, 190 ,150
			REIMU_SP_IDO_F = 1		;スペカ移動フラグ
		}
		es_check TEKI_VS_TAMA ,2201,1024	;敵(2201)、中央(1024)
		if TEKI_VS_TAMA != -1 {
			es_apos 2201, 0, 0				;動きを止める
			REIMU_x = 208 : REIMU_y = 190	;念のため停止中の座標を記録
		}
	}
return
;***********敵自機狙い***********
*敵自機狙い
	es_get REIMU_TM_x,2201,3	;敵X
	es_get REIMU_TM_y,2201,5	;敵Y
	if (REIMU_TM_x > 30-15) AND (REIMU_TM_y > 10-13) AND (REIMU_TM_x < 412+13) AND (REIMU_TM_y < 460+15) {
		if REIMU_TM_f = 0 {
			REIMU_TM_f = 1		;フラグ
			es_ang REIMU_TM_x,REIMU_TM_y,TE_x-2,TE_y-16	;角度取得
			REIMU_ang2 = stat	;自機の方向
;*******弾発射*******
			es_set 1000, REIMU_x,REIMU_y,1000	;スプライト設定
			es_adir 1000, REIMU_ang2,300		;スプライト移動方向設定
			es_type 1000,32
		}
	}
;---画面外判定---
	es_get REIMU_TM_x,1000,3	;敵弾X
	es_get REIMU_TM_y,1000,5	;敵弾Y
	if (REIMU_TM_x < 30-15) or (REIMU_TM_y < 10-13) or (REIMU_TM_x > 412+13) or (REIMU_TM_y > 460+15) {
		es_kill 1000			;敵弾【削除】
		REIMU_TM_f = 0			;敵弾フラグ【初期化】
	}
;---当たり判定---
	es_check JIKI_VS_REIMU_JIKITAMA ,70,32
	if JIKI_VS_REIMU_JIKITAMA != -1 {
		es_clear 1000,1	;敵弾【削除】
		REIMU_TM_f = 0	;敵弾フラグ【初期化】
	}
return
;*************デバッグツール************
*デバッグツール
getkey key_ENT,13	;エンターキー
	if key_ENT : HAKU_STO_f = 1	;敵を中央に移動させるフラグ
return
 
 
 
  |    |   
  
 
 | 
 | 
 
2021/12/16(Thu) 17:40:43|NO.94710 
es_iniで設定する周の精度を10倍くらいに上げてみてください。 
360だと精度が粗すぎて自機に当たらない位置が出てきてしまいます。 
 
 |   
  
| 
 | 
 
2021/12/17(Fri) 01:27:58|NO.94713 
私もhsp3dish.asになってしまうのですが、サンプル作ってたので投稿しました。 
(kの字さんが仰る通り、角度の精度が低いのが問題かと) 
あと、たしかhspdxfix.asでもes_aimが使えたかと思うので、自機狙いならこっち使った方が楽かもです。
  
#include "hsp3dish.as"
	screen 0,640,480
	button "精度64", *seido64
	button "精度360", *seido360
	button "精度4096", *seido4096
	es_ini
*INIT
	buffer 1, 2,2
	es_size 2,2: es_pat 0, 0, 0
	gsel 0
*MAIN
	redraw 1: await 16:redraw 0
	color: boxf
	es_draw
	es_new a,1,1024
	es_set a,320,240,0
	es_aim a,mousex,mousey,1000
	goto *MAIN
*seido64
	es_ini ,,64: goto *INIT
*seido360
	es_ini ,,360: goto *INIT
*seido4096
	es_ini ,,4096: goto *INIT
 
こっちは精度のイメージです。
  
screen 0, 640, 480
div = 36 ; ココを変えてみて(周の精度)
x = ginfo_sx/2:y = ginfo_sy/2
*MAIN
	stick pad,15
	x += (pad>>2&1)-(pad>>0&1)
	y += (pad>>3&1)-(pad>>1&1)
	div+=mousew: div=limit(div,0,3600)
	color 255,255,255: boxf: color 192,192,255
	repeat div
		line x,y,800.0*cos(2.0*M_PI/div*cnt)+x,800.0*sin(2.0*M_PI/div*cnt)+y
	loop
	color 255: circle x-2,y-2,x+2,y+2
	pos 0,0
	mes "周の精度:"+div+"マウスホイールで変更"
	mes "青い線は、自機狙いで撃てる方法(白い所には精度が低く撃てない)\n十字キーで移動"
	redraw 1: await 16: redraw 0
	goto *MAIN
 
 
 
  |    |   
  
| 
 | 
 
2021/12/17(Fri) 10:19:11|NO.94714 
kの字さん、usagiさんお答えありがとうございます! 
なるほど「es_ini」の数値が低かったせいだったんですね。 
4096が一番精密になりそうなので数値でいきます。
 
確かに「es_aim」でもいいのですが、 
過去に色々やりとりして「es_adir」にしたような記憶があるような内容な・・・ 
グレイズっていう弾に追尾するやつを作った際に変更したような・・・思い出せない・・・
 
そのグレイズっていうのが「es_aim」だとうまくいかないんですよねー。 
グレイズは弾と同じ場所にあって、弾と同じ方向に移動するっていう仕様。 
当たると点数が加算されるだけで、弾をぎりぎりで避けたご褒美みたいなもんです。
 
画像がないとわかりにくいと思うのでおいておきました 
パス:hsp
 https://ux.getuploader.com/UGI_55/download/59
 
#include "hspogg.as"	;音のために入れる
#include "hspdxfix.as"	;DXライブラリ使用
	width ,,130,200		;ウィンドウの位置
	es_ini 7100,7100,4096;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
	es_screen 640,480 ,0,0,1,1
	es_window -13,-43, 640,480	;スプライト表示エリア設定
	es_area -36,-430, 600,498	;スプライト有効エリア設定
	buffer 2
	picload "G_sisu-2.bmp"	;ゲーム中のシステム画像
	es_buffer 2,,$00ff00,,1
;---敵弾グレイズ---
	es_size 59,59, 50
	es_pat 600, 0,632
;---得点、残機、スペカ、霊力、グレイズ---
	es_size 515,462
	es_pat 5, 0,0
	es_set 5, 0,0, 5
;---敵中央---
	es_size 5,30
	es_pat 100, 310,888
;---------
	buffer 4
	picload "jiki.bmp"	;自機
	es_buffer 4,,$00ff00,,1
;---自機---
	es_size 28,42, 100
	es_pat 4000, 0, 0
	JIKI_x = 330 : JIKI_y = 255
	TE_x = 206+10 : TE_y = 390+16	;低速位置
	JIKISpd = 4		;自機のスピード(4)
;---低速(自機の中心)---
	es_size 9,9, 50
	es_pat 70, 46,43
	es_type 70,2
;-------
	buffer 6
	picload "reimu.bmp"
	es_buffer 6,,$00ff00,,1
;---敵---
	es_size 27,59, 100
	es_pat 2201, 66,61
;弾
	es_size 13,15, 50
	es_pat 1000, 14,0
;************メインループ***************
*メイン
es_cls
es_draw
;*************カウンター****************
es_get REIMU_pos_x,2201,3	;X
es_get REIMU_pos_y,2201,5	;Y
es_get JIKI_pos_x,4000,3	;X
es_get JIKI_pos_y,4000,5	;Y
	pos 500,50 : es_mes "REIMU_TAIM " + REIMU_TAIM
	pos 500,70 : es_mes "REIMU_pos_x " + REIMU_pos_x
	pos 500,90 : es_mes "REIMU_pos_y " + REIMU_pos_y
	pos 500,110 : es_mes "JIKI_pos_x " + JIKI_pos_x
	pos 500,130 : es_mes "JIKI_pos_y " + JIKI_pos_y
;********************************
;自機
	es_set 4000, JIKI_x,JIKI_y, 4000
;低速移動
	TE_x = JIKI_x+10 : TE_y = JIKI_y+16
	es_set 70, TE_x,TE_y, 70
;************gosub************
gosub *自機の移動
gosub *敵の処理
gosub *敵自機狙い
gosub *デバッグツール
es_sync	;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15	;キー取得
	if key & 1 : JIKI_x = JIKI_x - JIKISpd	;←の移動
	if key & 2 : JIKI_y = JIKI_y - JIKISpd	;↑の移動
	if key & 4 : JIKI_x = JIKI_x + JIKISpd	;→の移動
	if key & 8 : JIKI_y = JIKI_y + JIKISpd	;↓の移動
return
;****************敵の処理*************
*敵の処理
	if REIMU_f = 0 {
		REIMU_f = 1
		REIMU_x = 208 : REIMU_y = 70
		es_set 2201, REIMU_x,REIMU_y, 2201
		es_type 2201,4096
	}
;---行動処理---
	if REIMU_TAIM <= 800 : REIMU_TAIM++
	es_get REIMU_X, 2201, 3	;X座標取得
	es_get REIMU_Y, 2201, 5	;Y座標取得
	if HAKU_STO_f = 0 {	;敵を中央に移動させるフラグ
		if REIMU_IDO_F = 0 {	;停止中の処理
			es_pos 2201, REIMU_x, REIMU_y		;念のために位置を調整
			if REIMU_TAIM <= 99 : REIMU_x = 208 : REIMU_y = 70	;初期位置
			if REIMU_TAIM = 200 : es_aim 2201, 315, 177,200 : REIMU_IDO_F = 1	;→↓に移動(フラグ1)
			if REIMU_TAIM = 400 : es_aim 2201, 208, 70,200 : REIMU_IDO_F = 2	;←↑に移動(フラグ2)
			if REIMU_TAIM = 600 : es_aim 2201, 101, 177,200 : REIMU_IDO_F = 3	;←↓に移動(フラグ3)
			if REIMU_TAIM = 800 : es_aim 2201, 208, 70,200 : REIMU_IDO_F = 4	;→↑に移動(フラグ4)
		} else {
;フラグ1
			if REIMU_IDO_F = 1 {		;←↑に移動
				if (REIMU_X >= 315) && (REIMU_Y >= 177) {	;目的の座標に到着した場合
					es_apos 2201, 0, 0	;動きを止める
					REIMU_x = 315 : REIMU_y = 177	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
				}
			}
;フラグ2
			if REIMU_IDO_F = 2 {		;←↑に移動
				if (REIMU_X <= 208) && (REIMU_Y <= 70) {;目的の座標に到着した場合
					es_apos 2201, 0, 0	;動きを止める
					REIMU_x = 208 : REIMU_y = 70	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
				}
			}
;フラグ3
			if REIMU_IDO_F = 3 {		;←↓に移動
				if (REIMU_X <= 101) && (REIMU_Y >= 177) {;目的の座標に到着した場合
					es_apos 2201, 0, 0	;動きを止める
					REIMU_x = 101 : REIMU_y = 177	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
				}
			}
;フラグ4
			if REIMU_IDO_F = 4 {		;→↑に移動
				if (REIMU_X >= 208) && (REIMU_Y <= 70) {;目的の座標に到着した場合
					es_apos 2201, 0, 0;動きを止める
					REIMU_x = 208 : REIMU_y = 70	;念のため停止中の座標を記録
					REIMU_IDO_F = 0		;フラグを0(停止)
					REIMU_TAIM = 0		;時間を【リセット】
				}
			}
		}
	}
;敵中央
	es_set 100, 212,247, 100
	es_type 100,1024
;敵中央に移動
	if HAKU_STO_f = 1 {	;敵を中央に移動させるフラグ
		if REIMU_SP_IDO_F = 0 {		;移動フラグ
			es_aim 2201, 208, 190 ,150
			REIMU_SP_IDO_F = 1		;移動フラグ
		}
		es_check TEKI_VS_TAMA ,2201,1024	;敵(2201)、中央(1024)
		if TEKI_VS_TAMA != -1 {
			es_apos 2201, 0, 0				;動きを止める
			REIMU_x = 208 : REIMU_y = 190	;念のため停止中の座標を記録
		}
	}
return
;***********敵自機狙い***********
*敵自機狙い
	es_get REIMU_TM_x,2201,3	;敵X
	es_get REIMU_TM_y,2201,5	;敵Y
	if (REIMU_TM_x > 30-15) AND (REIMU_TM_y > 10-13) AND (REIMU_TM_x < 412+13) AND (REIMU_TM_y < 460+15) {
		if REIMU_TM_f = 0 {
			REIMU_TM_f = 1		;フラグ
/*
;新規
			es_new REIMU_TM, 1000	;新規スプライト取得
			es_set REIMU_TM, REIMU_x,REIMU_y, 1000	;スプライト設定
			es_aim REIMU_TM, TE_x,TE_y, 300
*/
;以前の
			es_ang REIMU_TM_x,REIMU_TM_y,TE_x-4,TE_y-12	;角度取得
			REIMU_ang = stat	;自機の方向
;*******弾発射*******
			es_set 1000, REIMU_x,REIMU_y,1000	;スプライト設定
			es_adir 1000, REIMU_ang,300		;スプライト移動方向設定
			es_type 1000,32
;---グレイズ情報---
			GURE_TYPE = 1	;グレイズタイプ
			gosub *グレイズ処理
		}
	}
;---画面外判定---
	es_get REIMU_TM_x,1000,3	;敵弾X
	es_get REIMU_TM_y,1000,5	;敵弾Y
	if (REIMU_TM_x < 30-15) or (REIMU_TM_y < 10-13) or (REIMU_TM_x > 412+13) or (REIMU_TM_y > 460+15) {
		es_kill 1000			;敵弾【削除】
		REIMU_TM_f = 0			;敵弾フラグ【初期化】
	}
;---当たり判定---
	es_check JIKI_VS_REIMU_JIKITAMA ,70,32
	if JIKI_VS_REIMU_JIKITAMA != -1 {
		es_clear 1000,1	;敵弾【削除】
		REIMU_TM_f = 0	;敵弾フラグ【初期化】
	}
return
;***********グレイズ処理***********
*グレイズ処理
	;自機狙い
	if GURE_TYPE = 1 {
;新規
		GURE_no = 5500
		es_set GURE_no, REIMU_x-21,REIMU_y-21, 600
		es_adir GURE_no, REIMU_ang,300
/*
;以前の
		es_new GURE, 5500	;新規スプライト取得
		es_set GURE, REIMU_x-21,REIMU_y-21, 600	;スプライト設定
		es_aim GURE, TE_x,TE_y, 300
*/
	}
	es_type GURE_no, 128
return
;*************デバッグツール************
*デバッグツール
getkey key_ENT,13	;エンターキー
	if key_ENT : HAKU_STO_f = 1	;敵を中央に移動させるフラグ
return
 
 
 
  |    |   
  
| 
 | 
 
2021/12/18(Sat) 13:19:17|NO.94716 
>確かに「es_aim」でもいいのですが 
そういった理由があったのですね。es_adirでも問題はないと思います。 
混乱させてすみません。
 
・ある角度に弾を打ちたい=es_adir 
・ある座標に弾を打ちたい=es_aim
 
と使い分けると命令の数が少なくなるので、簡単+処理負荷軽減と思いました。
 
ソースを見ると、おそらく表示座標と個々のスプライトサイズによるのオフセットがズレているように感じました。 
まずは中心座標を意識すると簡単にソースが書けるかもしれないです。 
※一例ですが、敵自機狙い〜グレイズ処理までを差し替え
  
;***********敵自機狙い***********
*敵自機狙い
	es_get REIMU_TM_x,2201,3	;敵X
	es_get REIMU_TM_y,2201,5	;敵Y
	if (REIMU_TM_x > 30-15) AND (REIMU_TM_y > 10-13) AND (REIMU_TM_x < 412+13) AND (REIMU_TM_y < 460+15) {
		if REIMU_TM_f = 0 {
			REIMU_TM_f = 1		;フラグ		
;*******弾発射*******
			;★敵のサイズ27,59なので中心は13.5,29.5
			;★弾のサイズは13,15なので中心は6.5,7.5
			;★つまりオフセットは13.5-6.5=7, 29.5-7.5=22
			es_set 1000, REIMU_x+7,REIMU_y+22,1000	;スプライト設定
			;★自機の中心のサイズは9,9なので中心は4.5,4.5
			;★弾のサイズは13,15なので中心は6.5,7.5
			;★つまりオフセットは4.5-6.5=-2, 4.5-7.5=-3
			es_aim 1000, TE_x-2,TE_y-3, 300	; 中心に向かって撃つ
			es_type 1000,32
;---グレイズ情報---
			GURE_TYPE = 1	;グレイズタイプ
			gosub *グレイズ処理
		}
	}
;---画面外判定---
	es_get REIMU_TM_x,1000,3	;敵弾X
	es_get REIMU_TM_y,1000,5	;敵弾Y
	if (REIMU_TM_x < 30-15) or (REIMU_TM_y < 10-13) or (REIMU_TM_x > 412+13) or (REIMU_TM_y > 460+15) {
		es_kill 1000			;敵弾【削除】
		REIMU_TM_f = 0			;敵弾フラグ【初期化】
	}
;---当たり判定---
	es_check JIKI_VS_REIMU_JIKITAMA ,70,32
	if JIKI_VS_REIMU_JIKITAMA != -1 {
		es_clear 1000,1	;敵弾【削除】
		REIMU_TM_f = 0	;敵弾フラグ【初期化】
	}
return
;***********グレイズ処理***********
*グレイズ処理
	;自機狙い
	if GURE_TYPE = 1 {
		es_new GURE, 5500	;新規スプライト取得
		;★敵のサイズ27,59なので中心は13.5,29.5
		;★グレイズのサイズは59,59なので中心は29.5,29.5
		;★つまりオフセットは13.5-29.5=-16, 29.5-29.5=0
		es_set GURE, REIMU_x-16,REIMU_y+0, 600	;スプライト設定
		;★自機の中心のサイズは9,9なので中心は4.5,4.5
		;★グレイズのサイズは59,59なので中心は29.5,29.5
		;★つまりオフセットは4.5-29.5=-25, 4.5-29.5=-25
		es_aim GURE, TE_x-25,TE_y-25, 300	; 中心に向かって撃つ
	}
	es_type GURE_no, 128
return
 
>グレイズは弾と同じ場所にあって、弾と同じ方向に移動する 
あるスプライトと同じ位置にスプライトを置きたいのであれば、hsp3dish.asであれば 
es_setparentが使えるので楽かもですね。 
※今後複雑な動きをするケツイ弾のような弾幕があるならですが(角度に加速度があるなど)
 
余談:いまはグレイズって言うんですねぇ。脳みそアプデしました。 
私がアーケードシューティング遊んでいた頃はよくバズるって呼ばれてました。懐かしいですねぇ。
  
 
  |    |   
  
| 
 | 
 
2021/12/18(Sat) 23:47:18|NO.94722 
ちなみにグレイズが弾と一緒の位置なら、弾の当たり判定をグレイズ分大きくして、 
es_distをつかい、弾との距離が近ければ=”当たり”遠ければ=”グレイズ” 
とすると、グレイズ用のスプライトが不要になりますので制御がしやすくなると思います。 
一例ですが ※掲示板に投稿するにはスクリプトが長いので、確認に不要な部分を少し削除しました。
  
#include "hspogg.as"	;音のために入れる
#include "hspdxfix.as"	;DXライブラリ使用
	width ,,130,200		;ウィンドウの位置
	es_ini 7100,7100,4096;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
	es_screen 640,480 ,0,0,1,1
	es_window -13,-43, 640,480	;スプライト表示エリア設定
	es_area -36,-430, 600,498	;スプライト有効エリア設定
	buffer 2 : picload "G_sisu-2.bmp"	;ゲーム中のシステム画像
	es_buffer 2,,$00ff00,,1
;---得点、残機、スペカ、霊力、グレイズ---
	es_size 515,462 : es_pat 5, 0,0 : es_set 5, 0,0, 5
;---敵中央---
	es_size 5,30 : es_pat 100, 310,888
;---------
	buffer 4 : picload "jiki.bmp"	;自機
	es_buffer 4,,$00ff00,,1
;---自機---
	es_size 28,42, 100 : es_pat 4000, 0, 0
	JIKI_x = 330 : JIKI_y = 255
	TE_x = 206+10 : TE_y = 390+16	;低速位置
	JIKISpd = 4		;自機のスピード(4)
;---低速(自機の中心)---
	es_size 9,9, 50 : es_pat 70, 46,43 : es_type 70,2
;-------
	buffer 6 : picload "reimu.bmp"
	es_buffer 6,,$00ff00,,1
;---敵---
	es_size 27,59, 100 : es_pat 2201, 66,61
;弾
	es_size 13,15, 500;★ココをグレイズ含めたぶん大きくする
	es_pat 1000, 14,0
;---★グレイズエフェクト仮---
	es_size 3,3, 100 : es_pat 700, 14,0
;************メインループ***************
*メイン
es_cls : es_draw
;********************************
;自機
	es_set 4000, JIKI_x,JIKI_y, 4000
;低速移動
	TE_x = JIKI_x+10 : TE_y = JIKI_y+16
	es_set 70, TE_x,TE_y, 70
;************gosub************
gosub *自機の移動
gosub *敵の処理
gosub *敵自機狙い
es_sync	;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15	;キー取得
	JIKI_x += JIKISpd * ((key>>2&1)-(key>>0&1))
	JIKI_y += JIKISpd * ((key>>3&1)-(key>>1&1))
return
;****************敵の処理*************
*敵の処理
	if REIMU_f = 0 {
		REIMU_f = 1
		REIMU_x = 208 : REIMU_y = 70
		es_set 2201, REIMU_x,REIMU_y, 2201
		es_type 2201,4096
	}
	return
return
;***********敵自機狙い***********
*敵自機狙い
	es_get REIMU_TM_x,2201,3	;敵X
	es_get REIMU_TM_y,2201,5	;敵Y
	if (REIMU_TM_x > 30-15) AND (REIMU_TM_y > 10-13) AND (REIMU_TM_x < 412+13) AND (REIMU_TM_y < 460+15) {
		if REIMU_TM_f = 0 {
			REIMU_TM_f = 1		;フラグ		
;*******弾発射*******
			es_set 1000, REIMU_x+7,REIMU_y+22,1000	;スプライト設定
			es_aim 1000, TE_x-2,TE_y-3, 300			; 中心に向かって打つ
			es_type 1000,32
		}
	}
;---画面外判定---
	es_get REIMU_TM_x,1000,3	;敵弾X
	es_get REIMU_TM_y,1000,5	;敵弾Y
	if (REIMU_TM_x < 30-15) or (REIMU_TM_y < 10-13) or (REIMU_TM_x > 412+13) or (REIMU_TM_y > 460+15) {
		es_kill 1000			;敵弾【削除】
		REIMU_TM_f = 0			;敵弾フラグ【初期化】
	}
;---当たり判定---
	es_check JIKI_VS_REIMU_JIKITAMA ,70,32
	if JIKI_VS_REIMU_JIKITAMA != -1 {
		;★ 当たった距離でダメージがグレイズかを分ける
		es_get x1, 70, 3 : es_get y1, 70, 5
		x1+=4 : y1+=4 ; 自機の中心位置
		es_get x2, 1000, 3 : es_get y2, 1000, 5
		x2+=6 : y2+=7 ; 敵弾の中心位置
		es_dist kyori,x1,y1,x2,y2 : kyori = kyori>>8 ; 固定小数部をシフトして削除
		
		if kyori < 8 { ; 距離が8以下は当たった
			es_clear 1000,1	;敵弾【削除】
			REIMU_TM_f = 0	;敵弾フラグ【初期化】
		} else { 		; それ以外はグレイズした
			es_new GURE_FX, 0			;新規スプライト取得
			es_set GURE_FX, x2,y2, 700	;スプライト設定
			es_flag GURE_FX, 32			;エフェクトなので自動で消す
			; 弾の移動方向と逆にグレイズエフェクトを出す
			es_get x3, 1000, 7 : es_get y3, 1000, 9 : es_ang x3,y3,0,0
			es_adir GURE_FX, stat+(256-rnd(512)), rnd(100)+50
			;pos 0,20:es_mes "グレイズ距離:"+GURE_FX
		}
		;★ここまで
	}
return
 
 
 
  |    |   
  
| 
 | 
 
2021/12/21(Tue) 09:43:29|NO.94735 
usagiさんお答えいただきありがとうございます! 
 
 
>>まずは中心座標を意識すると簡単にソースが書けるかもしれないです。 
ああーなるほど両方とも中心で計算しないとダメだったんですね。 
 
>>es_setparentが使えるので楽かもですね。 
初めて聞くやつだー 
「hspdxfix.as」が現在使っているやつだけど、「hsp3dish.as」でもいいのかな。 
今からプラグインを方向転換できそうもないから時間あるときに調べてみます。 
 
>>私がアーケードシューティング遊んでいた頃はよくバズるって呼ばれてました。懐かしいですねぇ。 
もしかしたら東方だけかもですw 
東方以外だと「かする」とかたまに「グレイズ」って言われているような気がします。 
 
 
ソースもありがとうございます! 
どうやればいいのかおかげでわかりました! 
 
 |   
  
| 
 | 
 
2021/12/22(Wed) 19:42:15|NO.94740 
usagiさん2つ目もありがとうございます! 
>>es_distをつかい、弾との距離が近ければ=”当たり”遠ければ=”グレイズ”
なるほどこんなことができるんですね。
 
kyori = kyori >> 8 
これは自機の半分+半分=8だから8っていうことですかね。 
相手の弾が34の半分のとき試しに作ってみたのですがうまくいかず・・・ 
シフト計算めっさ苦手でこんな機能やろ!っていう大雑把な理解です
 http://masudahp.web.fc2.com/hsp3/kiso/hspk001.html
 
;---でかい敵---
	es_size 50,38, 100
	es_pat 320, 37, 0
;---でかい敵弾---
	es_size 34,34, 250	;サイズはグレイズ含めたぶん大きくする(10倍)
	es_pat 75, 196,0
〜〜省略〜〜
;****************でかい敵*************
*でかい敵
	if TEKI_f = 0 {
		TEKI_f = 1
		TEKI_x = 108 : TEKI_y = 70
		es_set 320, TEKI_x,TEKI_y, 320
	}
return
;**************でかい敵弾移動*************
*でかい敵弾移動
	es_get TEKI_TM_x,2201,3	;敵X
	es_get TEKI_TM_y,2201,5	;敵Y
	if (TEKI_TM_x > 30-15) AND (TEKI_TM_y > 10-13) AND (TEKI_TM_x < 412+13) AND (TEKI_TM_y < 460+15) {
		if TEKI_TM_f = 0 {
			TEKI_TM_f = 1	;フラグ	
			es_set 75, TEKI_x+7,TEKI_y+22,75	;スプライト設定
			es_aim 75, TE_x-2,TE_y-3, 300		;中心に向かって打つ
			es_type 75,32
		}
	}
;---画面外判定---
	es_get TEKI_TM_x,75,3	;敵弾X
	es_get TEKI_TM_y,75,5	;敵弾Y
	if (TEKI_TM_x < 30-15) or (TEKI_TM_y < 10-13) or (TEKI_TM_x > 412+13) or (TEKI_TM_y > 460+15) {
		es_kill 75			;敵弾【削除】
		TEKI_TM_f = 0		;敵弾フラグ【初期化】
		GURE_HIT_f = 0		;グレイズヒットフラグ
	}
;---当たり判定---
	es_check JIKI_VS_REIMU_JIKITAMA ,70,32
	if JIKI_VS_REIMU_JIKITAMA != -1 {
;自機の中心位置
		es_get JIKI_TYUS_x, 70, 3
		es_get JIKI_TYUS_y, 70, 5
		JIKI_TYUS_x += 4	;自機の半分
		JIKI_TYUS_y += 4	;自機の半分
;---でかい敵弾の中心位置---
		es_get DK_JIKI_TYUS_x, 75, 3
		es_get DK_JIKI_TYUS_y, 75, 5
		DK_JIKI_TYUS_x += 17	;敵弾の半分(34)
		DK_JIKI_TYUS_y += 17	;敵弾の半分(34)
		es_dist DK_kyori, DK_JIKI_TYUS_x,DK_JIKI_TYUS_y, DK_JIKI_TYUS_x,DK_JIKI_TYUS_y	;2点間距離算出
		DK_kyori = DK_kyori >> 8 ; 固定小数部をシフトして削除(右シフト)
		;8:1000 → 100:4
		if DK_kyori < 8 { ;距離が8以下は弾に当たった(自機の半分+自機の半分)
			es_clear 75,1	;でかい敵弾【削除】
			TEKI_TM_f = 0	;でかい敵弾フラグ【初期化】
			DK_GURE_HIT_f = 0	;グレイズヒットフラグ【初期化】
		} else { 		;それ以外はグレイズした
			if DK_GURE_HIT_f = 0 {	;グレイズヒットフラグ
				DK_GURE_HIT += 1	;グレイズヒット
				DK_GURE_HIT_f = 1	;グレイズヒットフラグ
			}
/*
			;グレイズエフェクト
			es_new GURE_FX, 0	;新規スプライト取得
			es_set GURE_FX, DK_JIKI_TYUS_x,DK_JIKI_TYUS_y, 700	;スプライト設定
			es_flag GURE_FX, 8	;エフェクトなので自動で消す
			;弾の移動方向と逆にグレイズエフェクトを出す
			es_get GURE_EF_x, 75, 7
			es_get GURE_EF_y, 75, 9
			es_ang GURE_EF_x,GURE_EF_y, 0,0
			es_adir GURE_FX, stat+(16-rnd(300)), rnd(50)+20
*/
		}
	}
return
 
 
 
  |    |   
  
| 
 | 
 
2021/12/23(Thu) 00:34:21|NO.94742 
>これは自機の半分+半分=8だから8っていうことですかね。 
いいえ、半分の半分ではなくes_distのマニュアルが8bit固定小数点で値が取得されるとの仕様なので、 
8bitシフトする事により小数部を削除して整数部を取り出しております。 
ですから、仕様にあわせてシフトした感じなので特に自機にあわせてシフトしたわけではないです。 
距離が1離れていた場合は256 
距離が2離れていた場合は512 
距離が8離れていた場合は2048 
という値が返ってくるのがhspdxfixの仕様だからです。
 
"DK_kyori = DK_kyori >> 8"の部分で整数部の距離が代入されておりますから、 
"if DK_kyori < 8"の部分を距離が32以下でヒットにしたければ"if DK_kyori < 32"でよいです。
 
ご存じでしたら申し訳ないですが、 
★ステップ1 
ビットシフトは2の倍数で掛ける、割ることと同じ 
シフト<<1:であれば2掛ける 
シフト<<2:であれば4掛ける 
シフト>>1:であれば2割る 
シフト>>2:であれば4割る 
ですからシフト>>8:であれば256で割るということです。
 
★ステップ2 
固定小数点は、整数しか使えない場合どうやって小数を表すか考えられたもので、 
たとえば、0.01は100倍したら100と表せるんじゃないか?という感じです。 
そうすると100は1として、1は0.01と考えることができます。
 
8bit固定小数点であれば、256倍して表そうという考えなので、 
256が1, 1が0.0039という事になります。 
ですから、256で割ってあげれば整数部分が取り出せる訳です。 
256で割るにはビットシフトが効率がよいので>>8と記載してますが、/256と同じ意味です。
 
ざっくり言うと固定小数点しか使えなかった時代に1より少なく動かしたいという時などに生み出された考え方ですね。
 
★ステップ3 
2点間の距離というのは小数でかえってくることが多いです。 
x=1, y=1 であれば距離は√2 = 1.4142.... 
ですらhspdxfixを作られた方は小数部分が使いたい人の為に256倍して362と値を返すようにしました。 
256で割ると1と整数部が得られ、100倍してから256で割ると141と1.41を100倍した値を扱える訳なので、 
小数がないのに、小数を扱えるのです。
 
ざっりいうと1より小さい値を扱いたいから数倍して計算して、使う時数倍した値で割ったらよくない?という感じです。
 
サンプル1固定小数2bitで表した場合の
  
*MAIN
	redraw 1: await 16: redraw 0 :color :boxf: color 255,255,255
	pos x,0 :mes "●固定小数無し";1づつ動いてしまう
	pos x>>2,32  : mes "●固定小数2bit";1より小さく動かしたい
	x++
	goto *MAIN
 
■余談ですが、ちょっと難しいですが、例えば背景に流れる星を表示したい場合 
固定小数点8bitで考えるとなめらかに星が流すことができます。 
※実数が使えるのであればこういったことは考えなくてもよいです。
 
サンプル2固定小数点の考えを使わない(1より小さな動きが表現できないので斜めや小さな移動ができない)
  
#define STAR_MAX 256
dim x, STAR_MAX : dim y, STAR_MAX : dim c, STAR_MAX
repeat STAR_MAX : x.cnt=rnd(ginfo_sx): y.cnt=rnd(ginfo_sy) : loop
*MAIN
	redraw 1: await 16: redraw 0 :color :boxf: color 255,255,255
	repeat STAR_MAX
		color c.cnt,c.cnt,c.cnt
		pos x.cnt, y.cnt
		sx = x.cnt-mousex
		sy = y.cnt-mousey
		x.cnt += sx/64
		y.cnt += sy/64
		c.cnt = limit(c.cnt+4, 0, 255)
		line x.cnt, y.cnt
		if x.cnt<0 or x.cnt>ginfo_sx or y.cnt<0 or y.cnt>ginfo_sy {
			x.cnt=rnd(ginfo_sx) : y.cnt=rnd(ginfo_sy) : c.cnt=32
		}
	loop
	goto *MAIN
 
サンプル3固定小数点8bitで考える(星がなめらかに動く)
  
#define STAR_MAX 256
dim x, STAR_MAX : dim y, STAR_MAX : dim c, STAR_MAX
repeat STAR_MAX : x.cnt=rnd(ginfo_sx)<<8: y.cnt=rnd(ginfo_sy)<<8 : loop
*MAIN
	redraw 1: await 16: redraw 0 :color :boxf: color 255,255,255
	repeat STAR_MAX
		color c.cnt,c.cnt,c.cnt
		pos x.cnt>>8, y.cnt>>8
		sx = x.cnt-(mousex<<8)
		sy = y.cnt-(mousey<<8)
		x.cnt += sx/64
		y.cnt += sy/64
		c.cnt = limit(c.cnt+4, 0, 255)
		line x.cnt>>8, y.cnt>>8 
		if x.cnt<0 or x.cnt>ginfo_sx<<8 or y.cnt<0 or y.cnt>ginfo_sy<<8 {
			x.cnt=rnd(ginfo_sx)<<8 : y.cnt=rnd(ginfo_sy)<<8 : c.cnt=32
		}
	loop
	goto *MAIN
 
 
 
  |    |   
  
| 
 | 
 
2021/12/23(Thu) 09:45:37|NO.94743 
usagiさんありがとうございます! 
ひぇーー難しそうな話ばかりだ。 
実は独学で勉強してて学生の頃は色々嫌な思い出があって、 
そこら辺で習うであろうことは全て抜けてます。
 >>8bitシフトする事により小数部を削除して整数部を取り出しております。
「小数部」「整数部」っていうのはちょっとよくわからなかったのですが、 
下のサイトのようにシフト数が8の場合、7以下が「小数部」8以上は「整数部」 
もしシフト数が9の場合、8以下が「小数部」9以上は「整数部」ってことですかね。
 
「小数部」「整数部」は理解しておいたほうがいいかな?
 http://www.sage-p.com/compone/toda/fixdec.htm
>>距離が1離れていた場合は256
>>距離が2離れていた場合は512
>>距離が8離れていた場合は2048
>>という値が返ってくるのがhspdxfixの仕様だからです。
なるほど。 
8ビット計算になってしまうので1離れていると256になるってことですね 
(2の8乗で256になる。後は離れている分256を掛け算する) 
自分用: https://my-terrace.com/2_8_calc/
>>★ステップ1
>>if DK_kyori < 8"の部分を距離が32以下でヒットにしたければ
>>if DK_kyori < 32"でよいです。
32にしたけどグレイズのタイミングで弾が消えてしまうので、 
色々やって理解してきます!
 >>★ステップ2
>>256が1, 1が0.0039という事になります。
なんで1.1が出てきたのかわからなかったけど、 
普段小数点だと不便だから10倍にしてやろうっていうのと同じってことですね。
 >>256で割るにはビットシフトが効率がよいので>>8と記載してますが、/256と同じ意味です
なるほどそういうことでしたか。
 
返答はいったんここまで。
  
 |   
  
| 
 | 
 
2021/12/23(Thu) 10:38:26|NO.94744 
ちょっと文章にすると難しくなってしまうかもですね。 
使う側としては”hspdxfixを使って距離を出す場合は>>8すると整数の距離がわかる”という事だけでも良いと思います。
 >もしシフト数が9の場合、8以下が「小数部」9以上は「整数部」ってことですかね
その通りでございます。
 >8ビット計算になってしまうので1離れていると256になるってことですね
はい、ですから256で割る訳です。おそらくもうご理解されると思います。
 >なんで1.1が出てきたのかわからなかったけど、
実質、256が1 で 1が0.0039 という例でした。見づらくてすみません。(.ではなく,)
 >32にしたけどグレイズのタイミングで弾が消えてしまうので、
もしかしたら別の部分に問題があるかもですねぇ。 
スクリプトが動かせないので、わからないのですが 
得られた距離をデバックでlogを出すか、画面に出力したらよいかと思います。
 
サンプル以下ifの部分を差し替え
  
	logmes "グレイズ距離:"+DK_kyori ; log出力(私はこちら派)
	pos 0,0 : es_mes "グレイズ距離:"+DK_kyori ; 画面出力(デバックウインドを表示したくなければこちら)
	if DK_kyori < 8 { ;距離が8以下は弾に当たった(自機の半分+自機の半分)
 
 
 |   
  
| 
 | 
 
2021/12/23(Thu) 23:06:48|NO.94746 
>>使う側としては”hspdxfixを使って距離を出す場合は>>8すると整数の距離がわかる”という事だけでも良いと思います。
やっぱそうなりますよね。 
実際そんな感じで使ってますw
 >>実質、256が1 で 1が0.0039 という例でした。見づらくてすみません。(.ではなく,)
あ、なるほどですね。
 >>もしかしたら別の部分に問題があるかもですねぇ。
原因は「es_dist」で取ってくる変数名を間違えてました。 
残りのステップは他の作業が発生しちゃったので来月返答になりそうです。
  
;---当たり判定---
	es_check JIKI_VS_DKTEKI_JIKITAMA ,70,64
	if JIKI_VS_DKTEKI_JIKITAMA != -1 {
;自機の中心位置
		es_get JIKI_TYUS_x, 70, 3
		es_get JIKI_TYUS_y, 70, 5
		JIKI_TYUS_x += 4	;自機の半分
		JIKI_TYUS_y += 4	;自機の半分
;---でかい敵弾の中心位置---
		es_get DK_JIKI_TYUS_x, 75, 3
		es_get DK_JIKI_TYUS_y, 75, 5
		DK_JIKI_TYUS_x += 17	;敵弾の半分(34) → 17
		DK_JIKI_TYUS_y += 17	;敵弾の半分(34) → 17
		es_dist DK_kyori, JIKI_TYUS_x,JIKI_TYUS_y, DK_JIKI_TYUS_x,DK_JIKI_TYUS_y	;2点間距離算出
		DK_kyori = DK_kyori >> 8 ; 固定小数部をシフトして削除(右シフト)
		;8:1000 → 100:4
		;2進数だから2の自乗「>>:割り算」「<<:掛け算」
		logmes "グレイズ距離:"+DK_kyori ; log出力
		pos 0,20 : es_mes "でかいグレイズ距離:"+DK_kyori ; 画面出力(デバックウインドを表示したくなければこちら)
		if DK_kyori < 8 { ;距離が一定以下ならあたった
			es_clear 75,1	;でかい敵弾【削除】
			TEKI_TM_f = 0	;でかい敵弾フラグ【初期化】
			DK_GURE_HIT_f = 0	;グレイズヒットフラグ【初期化】
		} else { 		;それ以外はグレイズした
			if DK_GURE_HIT_f = 0 {	;グレイズヒットフラグ
				DK_GURE_HIT += 1	;グレイズヒット
				DK_GURE_HIT_f = 1	;グレイズヒットフラグ
			}
			;グレイズエフェクト
			es_new GURE_FX, 0	;新規スプライト取得
			es_set GURE_FX, DK_JIKI_TYUS_x,DK_JIKI_TYUS_y, 700	;スプライト設定
			es_flag GURE_FX, 8	;エフェクトなので自動で消す
			;弾の移動方向と逆にグレイズエフェクトを出す
			es_get GURE_EF_x, 75, 7
			es_get GURE_EF_y, 75, 9
			es_ang GURE_EF_x,GURE_EF_y, 0,0
			es_adir GURE_FX, stat+(16-rnd(300)), rnd(50)+20
		}
	}
 
 
 
  |    |   
  
| 
 | 
 
2021/12/25(Sat) 14:28:46|NO.94759 
>>★ステップ3
>>ざっりいうと1より小さい値を扱いたいから数倍して計算して、使う時数倍した値で割ったらよくない?という感じです。
なるほどですね。 
ざっくりいうと小数点で返ってくるから、8ビット計算して整数として扱うって感じですかね。
 
サンプルは今度時間があるときに触ってみます。
 
後は同じ「es_type」でも別々のグレイズと判定されるようにできれば完成です! 
違うtypeは効率悪い上に使用できる数も限られる。
  
;---当たり判定---
	es_check JIKI_VS_REIMU_JIKITAMA ,70,32
	if JIKI_VS_REIMU_JIKITAMA != -1 {
;自機の中心位置
		es_get JIKI_TYUS_x, 70, 3
		es_get JIKI_TYUS_y, 70, 5
		JIKI_TYUS_x += 4	;自機の半分
		JIKI_TYUS_y += 4	;自機の半分
;---敵弾の中心位置---
		es_get REI_JIKI_TYUS_x, 1000, 3
		es_get REI_JIKI_TYUS_y, 1000, 5
		REI_JIKI_TYUS_x += 6	;敵弾の半分(13)
		REI_JIKI_TYUS_y += 7	;敵弾の半分(15)
		es_dist kyori, JIKI_TYUS_x,JIKI_TYUS_y, REI_JIKI_TYUS_x,REI_JIKI_TYUS_y	;2点間距離算出
		kyori = kyori >> 8 ; 固定小数部をシフトして削除
		if kyori < 8 { ;距離が8以下は弾に当たった
			es_clear 1000,1	;敵弾【削除】
			REIMU_TM_f = 0	;敵弾フラグ【初期化】
			GURE_HIT_f = 0	;グレイズヒットフラグ【初期化】
		} else { 		;それ以外はグレイズした
			if GURE_HIT_f = 0 {	;グレイズヒットフラグ
				GURE_HIT += 1	;グレイズヒット
				GURE_HIT_f = 1	;グレイズヒットフラグ
			}
		}
;---でかい敵弾の中心位置---
		es_get DK_JIKI_TYUS_x, 75, 3
		es_get DK_JIKI_TYUS_y, 75, 5
		DK_JIKI_TYUS_x += 17	;敵弾の半分(34) → 17
		DK_JIKI_TYUS_y += 17	;敵弾の半分(34) → 17
		es_dist DK_kyori, JIKI_TYUS_x,JIKI_TYUS_y, DK_JIKI_TYUS_x,DK_JIKI_TYUS_y	;2点間距離算出
		DK_kyori = DK_kyori >> 8 ; 固定小数部をシフトして削除(右シフト)
		if DK_kyori < 8 { ;距離が一定以下ならあたった
			es_clear 75,1	;でかい敵弾【削除】
			TEKI_TM_f = 0	;でかい敵弾フラグ【初期化】
			DK_GURE_HIT_f = 0	;グレイズヒットフラグ【初期化】
		} else { 		;それ以外はグレイズした
			if DK_GURE_HIT_f = 0 {	;グレイズヒットフラグ
				DK_GURE_HIT += 1	;グレイズヒット
				DK_GURE_HIT_f = 1	;グレイズヒットフラグ
			}
		}
	}
 
 
 
  |    |   
  
| 
 | 
 
2021/12/26(Sun) 12:27:09|NO.94769 
ありがとうございます 
 
 |   
  
| 
 | 
 
2021/12/30(Thu) 21:47:28|NO.94828 
少し時間が空いてしまいましたが色々やってました 
同じ「es_type」でもそれぞれ別のグレイズと判定させたいんですが、 
いいアイディアが思い浮かびません。
 
フラグや別処理に持っていくのは「2点間距離算出」のメリット活かせそうもないなっていうところでなかなか思うようにいきません。 
とりあえず色々あがいてますが、少しのアドバイスでもあればお願いします!!
 
■やったことは当たり判定前にグレイズ判定しました。 
「es_check」で「32」で反応しちゃうので個別にしました(正直効率悪いと思う)
 
後、敵弾に当たったら数秒後に自機が死んで敵弾が消えるっていうシステムなので、 
「;---弾あたったら実行---」のところで再現しています。 
(こうすることで敵弾のフラグを一括で戻せる)
  
#include "hspdxfix.as"	;DXライブラリ使用
	width ,,130,200		;ウィンドウの位置
	es_ini 7100,7100,4096;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
	es_screen 640,480 ,0,0,1,1
	es_window -13,-43, 640,480	;スプライト表示エリア設定
	es_area -36,-430, 600,498	;スプライト有効エリア設定
	buffer 2
	picload "G_sisu-2.bmp"	;ゲーム中のシステム画像
	es_buffer 2,,$00ff00,,1
;---得点、残機、スペカ、霊力、グレイズ---
	es_size 515,462
	es_pat 5, 0,0
	es_set 5, 0,0, 5
;---敵中央---
	es_size 5,30
	es_pat 100, 310,888
;---------
	buffer 4
	picload "jiki.bmp"	;自機
	es_buffer 4,,$00ff00,,1
;---自機---
	es_size 28,42, 100
	es_pat 4000, 0, 0
	JIKI_x = 330 : JIKI_y = 255
	TE_x = 206+10 : TE_y = 390+16	;低速位置
	JIKISpd = 4		;自機のスピード(4)
;---低速(自機の中心)---
	es_size 9,9, 50
	es_pat 70, 46,43
	es_type 70,2
;------
	buffer 5
	picload "teki.bmp"
	es_buffer 5,,$00ff00,,1
;---でかい敵---
	es_size 50,38, 100
	es_pat 320, 37, 0
;---でかい敵弾---
	es_size 34,34, 250	;サイズはグレイズ含めたぶん大きくする(10倍)
	es_pat 75, 196,0
;-------
	buffer 6
	picload "reimu.bmp"
	es_buffer 6,,$00ff00,,1
;---敵---
	es_size 27,59, 100
	es_pat 2201, 66,61
;---弾---
	es_size 13,15, 500;サイズはグレイズ含めたぶん大きくする(10倍)
	es_pat 1000, 14,0
;---グレイズエフェクト---
	es_size 3,3, 100
	es_pat 700, 14,0
;************メインループ***************
*メイン
es_cls
es_draw
;*************カウンター****************
es_get REIMU_pos_x,2201,3	;X
es_get REIMU_pos_y,2201,5	;Y
es_get JIKI_pos_x,4000,3	;X
es_get JIKI_pos_y,4000,5	;Y
	pos 500,50 : es_mes "REIMU_TAIM " + REIMU_TAIM
	pos 500,70 : es_mes "REIMU_pos_x " + REIMU_pos_x
	pos 500,90 : es_mes "REIMU_pos_y " + REIMU_pos_y
	pos 500,110 : es_mes "JIKI_pos_x " + JIKI_pos_x
	pos 500,130 : es_mes "JIKI_pos_y " + JIKI_pos_y
	
	pos 500,160 : es_mes "GURE_HIT " + GURE_HIT
	pos 500,180 : es_mes "GURE_HIT_f " + GURE_HIT_f
	pos 500,200 : es_mes "TEKI_TM_HIT " + TEKI_TM_HIT
	pos 500,220 : es_mes "kyori " + kyori
	pos 500,250 : es_mes "DK_GURE_HIT " + DK_GURE_HIT
	pos 500,270 : es_mes "DK_GURE_HIT_f " + DK_GURE_HIT_f
	pos 500,290 : es_mes "DK_kyori " + DK_kyori
	
	pos 500,340 : es_mes "TAMA_HIT_f " + TAMA_HIT_f
	pos 500,360 : es_mes "MISU_c " + MISU_c
;********************************
;自機
	es_set 4000, JIKI_x,JIKI_y, 4000
;低速移動
	TE_x = JIKI_x+10 : TE_y = JIKI_y+16
	es_set 70, TE_x,TE_y, 70
;************gosub************
gosub *自機の移動
gosub *敵の処理
gosub *敵自機狙い
gosub *でかい敵
gosub *でかい敵弾移動
;---弾あたったら実行---
	if TAMA_HIT_f = 1 {
		MISU_c++			;ミスカウンター
		if MISU_c >= 50 {	;ミスカウンターが「50」になったら実行
;初期化
			TAMA_HIT_f = 0	;弾に当たったらフラグ
			MISU_c = 0		;ミスカウンター
			REIMU_TM_f = 0	;敵弾フラグ
			GURE_HIT_f = 0	;グレイズヒットフラグ
			DK_TEKI_TM_f = 0	;でかい敵弾フラグ
			DK_GURE_HIT_f = 0	;でかいグレイズヒットフラグ
;削除
			es_kill 1000
			es_kill 75
		}
	}
es_sync	;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15	;キー取得
	JIKI_x += JIKISpd * ((key>>2&1)-(key>>0&1))
	JIKI_y += JIKISpd * ((key>>3&1)-(key>>1&1))
return
;****************敵の処理*************
*敵の処理
	if REIMU_f = 0 {
		REIMU_f = 1
		REIMU_x = 208 : REIMU_y = 70
		es_set 2201, REIMU_x,REIMU_y, 2201
	}
return
;***********敵自機狙い***********
*敵自機狙い
	es_get REIMU_TM_x,2201,3	;敵X
	es_get REIMU_TM_y,2201,5	;敵Y
	if (REIMU_TM_x > 30-15) AND (REIMU_TM_y > 10-13) AND (REIMU_TM_x < 412+13) AND (REIMU_TM_y < 460+15) {
		if REIMU_TM_f = 0 {
			REIMU_TM_f = 1		;フラグ	
			es_set 1000, REIMU_x+7,REIMU_y+22,1000	;スプライト設定
			es_aim 1000, TE_x-2,TE_y-3, 100			;中心に向かって打つ
			es_type 1000,32
		}
	}
;---距離処理---
;自機の中心位置
	es_get JIKI_TYUS_x, 70, 3
	es_get JIKI_TYUS_y, 70, 5
	JIKI_TM_x += 4	;自機の半分
	JIKI_TM_y += 4	;自機の半分
;画面外判定
	es_get JIKI_TM_x, 75, 3
	es_get JIKI_TM_y, 75, 5
	if (JIKI_TM_x < 30-15) or (JIKI_TM_y < 10-13) or (JIKI_TM_x > 412+13) or (JIKI_TM_y > 460+15) {
		es_kill 75		;敵弾【削除】
		REIMU_TM_f = 0	;敵弾フラグ【初期化】
		GURE_HIT_f = 0	;グレイズヒットフラグ
	}
;敵弾の中心位置
	JIKI_TM_x += 6	;敵弾の半分(13)
	JIKI_TM_y += 7	;敵弾の半分(15)
;2点間距離算出
	es_dist kyori, JIKI_TYUS_x,JIKI_TYUS_y, JIKI_TM_x,JIKI_TM_y
	kyori = kyori >> 8	;固定小数部をシフトして削除
;グレイズ当たり判定
	if GURE_HIT_f = 0 {		;グレイズヒットフラグ
		if kyori < 64 { 	;距離が64以下はグレイズ
			GURE_HIT_f = 1	;グレイズヒットフラグ
			GURE_HIT += 1	;グレイズヒット数
		}
	}
;弾当たり判定
	if kyori < 8 { 	;距離が8以下は当たり判定
		es_check JIKI_VS_REIMU_JIKITAMA ,70,32	;低速(70),弾(32)
		if JIKI_VS_REIMU_JIKITAMA != -1 {
			TEKI_TM_HIT += 1;ヒット回数
			TAMA_HIT_f = 1	;弾に当たったらフラグ
		}
	}
return
;****************でかい敵*************
*でかい敵
	if DK_TEKI_f = 0 {
		DK_TEKI_f = 1
		DK_TEKI_x = 108 : DK_TEKI_y = 70
		es_set 320, DK_TEKI_x,DK_TEKI_y, 320
	}
return
;**************でかい敵弾移動*************
*でかい敵弾移動
	es_get DK_TEKI_TM_x,2201,3	;敵X
	es_get DK_TEKI_TM_y,2201,5	;敵Y
	if (DK_TEKI_TM_x > 30-15) AND (DK_TEKI_TM_y > 10-13) AND (DK_TEKI_TM_x < 412+13) AND (DK_TEKI_TM_y < 460+15) {
		if DK_TEKI_TM_f = 0 {
			DK_TEKI_TM_f = 1	;フラグ	
			es_set 75, DK_TEKI_x+8,DK_TEKI_y+2,75	;スプライト設定
			es_aim 75, TE_x-2,TE_y-3, 300		;中心に向かって打つ
			es_type 75,32
		}
	}
;---距離処理---
;自機の中心位置
	es_get JIKI_TYUS_x, 70, 3
	es_get JIKI_TYUS_y, 70, 5
	JIKI_TM_x += 4	;自機の半分
	JIKI_TM_y += 4	;自機の半分
;画面外判定
	es_get DK_JIKI_TM_x, 75, 3
	es_get DK_JIKI_TM_y, 75, 5
	if (DK_JIKI_TM_x < 30-15) or (DK_JIKI_TM_y < 10-13) or (DK_JIKI_TM_x > 412+13) or (DK_JIKI_TM_y > 460+15) {
		es_kill 75			;敵弾【削除】
		DK_TEKI_TM_f = 0	;敵弾フラグ【初期化】
		DK_GURE_HIT_f = 0	;グレイズヒットフラグ
	}
;敵弾の中心位置
	DK_JIKI_TM_x += 17	;敵弾の半分(34)
	DK_JIKI_TM_y += 17	;敵弾の半分(34)
;2点間距離算出
	es_dist DK_kyori, JIKI_TYUS_x,JIKI_TYUS_y, DK_JIKI_TM_x,DK_JIKI_TM_y
	DK_kyori = DK_kyori >> 8	;固定小数部をシフトして削除
;グレイズ当たり判定
	if DK_GURE_HIT_f = 0 {		;グレイズヒットフラグ
		if DK_kyori < 64 { 		;距離が64以下はグレイズ
			DK_GURE_HIT_f = 1	;グレイズヒットフラグ
			DK_GURE_HIT += 1	;グレイズヒット数
		}
	}
return
 
「ず」さんは誤爆かな。 
まぁアドレス見れば私じゃないってわかるし。 
私は独特の雰囲気あるからすぐにバレるとおもいますが・・・
  
 
  |    |   
  
| 
 | 
 
2022/1/1(Sat) 18:24:33|NO.94847 
>同じ「es_type」でもそれぞれ別のグレイズと判定させたいんですが、 
具体的にどの様な処理にしたいのか分からないので憶測ですか、 
もし、弾の種類(画像)によって分けたいのであれば、 
当たり判定時にそのスプライトのパターンを取得して処理をすれば良いかとは思います。 
es_getで取得できたかと思います。 
 
 
 
>後、敵弾に当たったら数秒後に自機が死んで敵弾が消えるっていうシステムなので、 
一案ですが、将来的には、弾幕シューティング的な作りを考えると、 
”弾消し”や”ボンバー”的なスプライトのタイプを用意しておいて 
何かを契機(被弾や中型機破壊など)にしてスプライト発射すると 
当たりの処理がまとめらますので楽かもですね。 
弾消し様の見えないスプライトを自分機から発射するイメージです。 
(東方みたいに透明な輪を広がる様にだしても演出的で良いかも) 
 
タイプは何と当たり判定を取りたいかで分けると良いと思います。 
弾消し:敵弾 、 ボンバー:敵、敵弾 
などです。 
 
もちろんフラグで一斉に管理しても良いと思います。※あくまで一案です。 
 
 |   
  
| 
 | 
 
2022/1/1(Sat) 19:48:31|NO.94848 
usagiさん、お答えいただきありがとうございます! 
ようやく処理ができたー!って思ったらちょうど返答が・・!ありがたや!
 >>もし、弾の種類(画像)によって分けたいのであれば、
>>当たり判定時にそのスプライトのパターンを取得して処理をすれば良いかとは思います。
>>es_getで取得できたかと思います。
そのとおりですね。
 
同じes_typeの32なので「下記の方法」だと、 
でかい敵弾でグレイズすると、敵弾でグレイズしてしまうことになってしまうので、 
別々の処理にするしかないかなーっていう感じですね。
  
	es_check JIKI_VS_REIMU_JIKITAMA ,70,32
	if JIKI_VS_REIMU_JIKITAMA != -1 {
;自機の中心位置
		es_get JIKI_TYUS_x, 70, 3
		es_get JIKI_TYUS_y, 70, 5
		JIKI_TYUS_x += 4	;自機の半分
		JIKI_TYUS_y += 4	;自機の半分
;---敵弾の中心位置---
		es_get REI_JIKI_TYUS_x, 1000, 3
		es_get REI_JIKI_TYUS_y, 1000, 5
		REI_JIKI_TYUS_x += 6	;敵弾の半分(13)
		REI_JIKI_TYUS_y += 7	;敵弾の半分(15)
		es_dist kyori, JIKI_TYUS_x,JIKI_TYUS_y, REI_JIKI_TYUS_x,REI_JIKI_TYUS_y	;2点間距離算出
		kyori = kyori >> 8 ; 固定小数部をシフトして削除
		if kyori < 8 { ;距離が8以下は弾に当たった
			es_clear 1000,1	;敵弾【削除】
			REIMU_TM_f = 0	;敵弾フラグ【初期化】
			GURE_HIT_f = 0	;グレイズヒットフラグ【初期化】
		} else { 		;それ以外はグレイズした
			if GURE_HIT_f = 0 {	;グレイズヒットフラグ
				GURE_HIT += 1	;グレイズヒット
				GURE_HIT_f = 1	;グレイズヒットフラグ
			}
 
es_getでスプライト値を取ってくる場合、この考え方であっているのかな。 
敵弾のスプライトはなるべく近くないとダメかなと思ってます。
 
例:敵弾:75、でかい敵弾:100 
ダメな例:敵弾:75、自機:80、でかい敵弾:100 
ダメな例:敵弾:75、でかい敵弾:2000
  
	TEKITM_no = 75;敵弾のスプライト値
repeat 100;敵弾の数分だけ実行する(75+100=175)
	es_get HANTEI_TM,TEKITM_no,13 ;type値 
	es_check JIKI_VS_TEKI_JIKITAMA ,70,HANTEI_TM	;低速(70),弾(32)
	TEKITM_no++
loop
 
>>当たりの処理がまとめらますので楽かもですね。
>>弾消し様の見えないスプライトを自分機から発射するイメージです。
まさにそれ実装してますね。
 
輪っかは色々難しそうだったので諦めて、 
画面下から赤いスプライト画像をおいて、自機が死んだら画像が上に移動して弾消しをしています。
 
ソースとしては汚くって効率悪いかと思いますが、 
距離を測って個別にグレイズ処理ができました!!
  
#include "hspdxfix.as"	;DXライブラリ使用
	width ,,130,200		;ウィンドウの位置
	es_ini 7100,7100,4096;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
	es_screen 640,480 ,0,0,1,1
	es_window -13,-43, 640,480	;スプライト表示エリア設定
	es_area -36,-430, 600,498	;スプライト有効エリア設定
	buffer 2
	picload "G_sisu-2.bmp"	;ゲーム中のシステム画像
	es_buffer 2,,$00ff00,,1
;---得点、残機、スペカ、霊力、グレイズ---
	es_size 515,462
	es_pat 5, 0,0
	es_set 5, 0,0, 5
;---敵中央---
	es_size 5,30
	es_pat 100, 310,888
;---------
	buffer 4
	picload "jiki.bmp"	;自機
	es_buffer 4,,$00ff00,,1
;---自機---
	es_size 28,42, 100
	es_pat 4000, 0, 0
	JIKI_x = 330 : JIKI_y = 255
	TE_x = 206+10 : TE_y = 390+16	;低速位置
	JIKISpd = 4		;自機のスピード(4)
;---低速(自機の中心)---
	es_size 9,9, 50
	es_pat 70, 46,43
	es_type 70,2
;------
	buffer 5
	picload "teki.bmp"
	es_buffer 5,,$00ff00,,1
;---でかい敵---
	es_size 50,38, 100
	es_pat 320, 37, 0
;---でかい敵弾---
	es_size 34,34, 250	;サイズはグレイズ含めたぶん大きくする(10倍)
	es_pat 75, 196,0
;-------
	buffer 6
	picload "reimu.bmp"
	es_buffer 6,,$00ff00,,1
;---敵---
	es_size 27,59, 100
	es_pat 2201, 66,61
;---弾---
	es_size 13,15, 500;サイズはグレイズ含めたぶん大きくする(10倍)
	es_pat 1000, 14,0
;---グレイズエフェクト---
	es_size 3,3, 100
	es_pat 700, 14,0
;************メインループ***************
*メイン
es_cls
es_draw
;*************カウンター****************
es_get REIMU_pos_x,2201,3	;X
es_get REIMU_pos_y,2201,5	;Y
es_get JIKI_pos_x,4000,3	;X
es_get JIKI_pos_y,4000,5	;Y
	pos 500,50 : es_mes "REIMU_TAIM " + REIMU_TAIM
	pos 500,70 : es_mes "REIMU_pos_x " + REIMU_pos_x
	pos 500,90 : es_mes "REIMU_pos_y " + REIMU_pos_y
	pos 500,110 : es_mes "JIKI_pos_x " + JIKI_pos_x
	pos 500,130 : es_mes "JIKI_pos_y " + JIKI_pos_y
	
	pos 500,160 : es_mes "GURE_HIT " + GURE_HIT
	pos 500,180 : es_mes "GURE_HIT_f " + GURE_HIT_f
	pos 500,200 : es_mes "TEKI_TM_HIT " + TEKI_TM_HIT
	pos 500,220 : es_mes "kyori " + kyori
	pos 500,250 : es_mes "DK_GURE_HIT " + DK_GURE_HIT
	pos 500,270 : es_mes "DK_GURE_HIT_f " + DK_GURE_HIT_f
	pos 500,290 : es_mes "DK_TEKI_TM_HIT " + DK_TEKI_TM_HIT
	pos 500,310 : es_mes "DK_kyori " + DK_kyori
	pos 500,340 : es_mes "TAMA_HIT_f " + TAMA_HIT_f
	pos 500,360 : es_mes "MISU_c " + MISU_c
;********************************
;自機
	es_set 4000, JIKI_x,JIKI_y, 4000
;低速移動
	TE_x = JIKI_x+10 : TE_y = JIKI_y+16
	es_set 70, TE_x,TE_y, 70
;************gosub************
gosub *自機の移動
gosub *敵の処理
gosub *敵自機狙い
gosub *でかい敵
gosub *でかい敵弾移動
;---弾あたったら実行---
	if TAMA_HIT_f = 1 {
		MISU_c++			;ミスカウンター
		if MISU_c >= 50 {	;ミスカウンターが「50」になったら実行
;初期化
			TAMA_HIT_f = 0	;弾に当たったらフラグ
			MISU_c = 0		;ミスカウンター
			TEKI_TM_f = 0	;敵弾フラグ
			GURE_HIT_f = 0	;グレイズヒットフラグ
			DK_TEKI_TM_f = 0	;でかい敵弾フラグ
			DK_GURE_HIT_f = 0	;でかいグレイズヒットフラグ
;削除
			es_kill 1000
			es_kill 75
		}
	}
es_sync	;画面更新
await 16
goto *メイン
;**************自機の移動*************
*自機の移動
stick key,15	;キー取得
	JIKI_x += JIKISpd * ((key>>2&1)-(key>>0&1))
	JIKI_y += JIKISpd * ((key>>3&1)-(key>>1&1))
return
;****************敵の処理*************
*敵の処理
	if TEKI_f = 0 {
		TEKI_f = 1
		TEKI_x = 208 : TEKI_y = 70
		es_set 2201, TEKI_x,TEKI_y, 2201
	}
return
;***********敵自機狙い***********
*敵自機狙い
	es_get TEKI_TM_x,2201,3	;敵X
	es_get TEKI_TM_y,2201,5	;敵Y
	if (TEKI_TM_x > 30-15) AND (TEKI_TM_y > 10-13) AND (TEKI_TM_x < 412+13) AND (TEKI_TM_y < 460+15) {
		if TEKI_TM_f = 0 {
			TEKI_TM_f = 1		;フラグ	
			es_set 1000, TEKI_x+7,TEKI_y+22,1000	;スプライト設定
			es_aim 1000, TE_x-2,TE_y-3, 200			;中心に向かって打つ
			es_type 1000,32
		}
	}
;画面外判定
	es_get TEKI_TM_x, 1000, 3
	es_get TEKI_TM_y, 1000, 5
	if (TEKI_TM_x < 30-15) or (TEKI_TM_y < 10-13) or (TEKI_TM_x > 412+13) or (TEKI_TM_y > 460+15) {
		es_kill 1000	;敵弾【削除】
		TEKI_TM_f = 0	;敵弾フラグ【初期化】
		GURE_HIT_f = 0	;グレイズヒットフラグ
	}
;---距離処理---
;自機の中心位置
	es_get JIKI_TYUS_x, 70, 3
	es_get JIKI_TYUS_y, 70, 5
	JIKI_TYUS_x += 4	;自機の半分(9)
	JIKI_TYUS_y += 4	;自機の半分(9)
;敵弾の中心
	es_get TEKI_TM_TYUS_x, 1000, 3
	es_get TEKI_TM_TYUS_y, 1000, 5
	TEKI_TM_TYUS_x += 6	;敵弾の半分(13)
	TEKI_TM_TYUS_y += 7	;敵弾の半分(15)
;2点間距離算出
	es_dist kyori, JIKI_TYUS_x,JIKI_TYUS_y, TEKI_TM_TYUS_x,TEKI_TM_TYUS_y
	kyori = kyori >> 8	;固定小数部をシフトして削除
;グレイズ当たり判定
	if GURE_HIT_f = 0 {		;グレイズヒットフラグ
		if kyori < 64 { 	;距離が64以下はグレイズ
			GURE_HIT_f = 1	;グレイズヒットフラグ
			GURE_HIT += 1	;グレイズヒット数
		}
	}
;弾当たり判定
	if kyori < 8 { 	;距離が8以下は当たり判定
		es_check JIKI_VS_TEKI_JIKITAMA ,70,32	;低速(70),弾(32)
		if JIKI_VS_TEKI_JIKITAMA != -1 {
			TEKI_TM_HIT += 1;ヒット回数
			TAMA_HIT_f = 1	;弾に当たったらフラグ
		}
	}
;■■■でかい■■■
;でかい敵弾の中心
	es_get DK_TEKI_TM_TYUS_x, 75, 3
	es_get DK_TEKI_TM_TYUS_y, 75, 5
	DK_TEKI_TM_TYUS_x += 17	;でかい敵の半分(34)
	DK_TEKI_TM_TYUS_y += 17	;でかい敵の半分(34)
;2点間距離算出
	es_dist DK_kyori, JIKI_TYUS_x,JIKI_TYUS_y, DK_TEKI_TM_TYUS_x,DK_TEKI_TM_TYUS_y
	DK_kyori = DK_kyori >> 8	;固定小数部をシフトして削除
;グレイズ当たり判定
	if DK_GURE_HIT_f = 0 {		;グレイズヒットフラグ
		if DK_kyori < 64 { 		;距離が64以下はグレイズ
			DK_GURE_HIT_f = 1	;グレイズヒットフラグ
			DK_GURE_HIT += 1	;グレイズヒット数
		}
	}
;弾当たり判定
	if DK_kyori < 8 { 	;距離が8以下は当たり判定
		es_check JIKI_VS_DK_TEKI_JIKITAMA ,70,32	;低速(70),弾(32)
		if JIKI_VS_DK_TEKI_JIKITAMA != -1 {
			DK_TEKI_TM_HIT += 1;ヒット回数
			TAMA_HIT_f = 1	;弾に当たったらフラグ
		}
	}
return
;****************でかい敵*************
*でかい敵
	if DK_TEKI_f = 0 {
		DK_TEKI_f = 1
		DK_TEKI_x = 108 : DK_TEKI_y = 70
		es_set 320, DK_TEKI_x,DK_TEKI_y, 320
	}
return
;**************でかい敵弾移動*************
*でかい敵弾移動
	es_get DK_TEKI_TM_x,2201,3	;敵X
	es_get DK_TEKI_TM_y,2201,5	;敵Y
	if (DK_TEKI_TM_x > 30-15) AND (DK_TEKI_TM_y > 10-13) AND (DK_TEKI_TM_x < 412+13) AND (DK_TEKI_TM_y < 460+15) {
		if DK_TEKI_TM_f = 0 {
			DK_TEKI_TM_f = 1	;フラグ	
			es_set 75, DK_TEKI_x+8,DK_TEKI_y+2,75	;スプライト設定
			es_aim 75, TE_x-2,TE_y-3, 300		;中心に向かって打つ
			es_type 75,32
		}
	}
;---距離処理---
;画面外判定
	es_get DK_JIKI_TM_x, 75, 3
	es_get DK_JIKI_TM_y, 75, 5
	if (DK_JIKI_TM_x < 30-15) or (DK_JIKI_TM_y < 10-13) or (DK_JIKI_TM_x > 412+13) or (DK_JIKI_TM_y > 460+15) {
		es_kill 75			;敵弾【削除】
		DK_TEKI_TM_f = 0	;敵弾フラグ【初期化】
		DK_GURE_HIT_f = 0	;グレイズヒットフラグ
	}
return
 
 
 
  |    |   
  
| 
 | 
 
2022/1/3(Mon) 12:53:10|NO.94861 
距離を測ってやる方法は色々考えたんですが、 
殆どのソースをマージしてしまっているため影響範囲が広いです。 
そのため今からそれらをデバッグしなおすのはちょっときついので、 
グレイズを別処理でいきます。 
 
2月までにほとんどマージ終わらせている目標で行きたいのと、 
別処理にする影響はそこまで大きくないことから解決とします。 
 
 
色々ありがとうございます! 
 
 |   
  
					 |