|
 |
|
2020/2/16(Sun) 17:43:24|NO.89492
どうもこんにちは。
いつもどおりhspdxfix.asプラグインで作った、STGゲームの質問になります。
*「くっついている物体」のことを「グレイズ」とします。
またグレイズなんだ・・すまない。
敵の座標によって、グレイズの中心が敵弾の中心からずれてしまい困っております。
敵のX座標が「350」の時は発生し、「50」のときは発生しないので原因がまったくわかっておりません。
今回も画像が不要なソースにしたかったのですが、弾とグレイズが重なるので視覚的に分かりづらいため、画像付きのソースになります。
実行ソースと画像を私のアップローダーにおいたのでDLしてくださいませ。
https://ux.getuploader.com/UGI_55/download/52
「;グレイズが中心に来ない座標」
グレイズの中心が敵弾の右上に少しずれた位置になります
「;グレイズが中心に来る敵座標」
グレイズの中心と敵弾の中心が同じ位置になります
■仕様■
・グレイズは円形の当たり判定で、敵弾の中心を座標とする
・グレイズは自機と接触したら点数が加算され消える(今回この問題とは関係ないので、当たり判定はなし)
※画像ファイルがないと実行できませんので注意(一応ソースをおいておきます)
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 640,480,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1 ;スクリーン
;システム画像
buffer 2
picload "G_sisu-3.bmp"
es_buffer 2,,$00ff00,,1
;---敵弾グレイズ---
es_size 59,59, 50
es_pat 600, 0,0
;自機関連
buffer 4
picload "jiki-2.bmp"
es_buffer 4,,$00ff00,,1
;---自機---
es_size 28,42, 100
es_pat 350, 0, 0
JIKI_x = 380 : JIKI_y = 390 ;自機位置
;---自機の中心---
es_size 9,9, 50
es_pat 70, 46,43
TE_x = 216 : TE_y = 406 ;低速位置
;敵関連
buffer 5
picload "teki-2.bmp"
es_buffer 5,,$00ff00,,1
;---敵---
es_size 50,38, 100
es_pat 320, 0,0
;---敵弾---
es_size 34,34, 25
es_pat 75, 50,0
gsel 0,1
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
;グレイズが中心に来ない座標
TEKI_x = 350
TEKI_y = 160
;グレイズが中心に来る敵座標
/*
TEKI_x = 50
TEKI_y = 250
*/
;■■■敵配置■■■
es_exnew TEKI, 320,320 ;新規スプライトNo
es_set TEKI, TEKI_x,TEKI_y, 320 ;スプライトNo, X,Y座標 ,キャラNo
;*********メインループ*********
*メイン
es_cls ;画面クリア
es_draw ;スプライト描画
;************カウンター******************
pos 520,130 : es_mes "TAIM " + TEKI_TAIM
;*****************ゲーム枠外***************
;自機
es_set 350, JIKI_x,JIKI_y, 350
;低速移動
TE_x = JIKI_x+10 : TE_y = JIKI_y+16
es_set 70, TE_x,TE_y, 70
;************gosub************
gosub *自機の移動
gosub *敵弾移動
gosub *敵弾グレイズ
;*************低速移動******************
getkey Skey,16 ;シフトキー
if Skey{
JIKISpd = 2 ;自機の低速スピード
} else {
JIKISpd = 4 ;自機の通常スピード
}
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 TEKI_TM_f = 0 { ;敵弾フラグが立っていないときに実行
es_get TEKI_TM_x,320,3 ;敵弾X
es_get TEKI_TM_y,320,5 ;敵弾Y
es_ang TEKI_TM_x,TEKI_TM_y,TE_x-12,TE_y-12;角度取得
TEKI_TM_ang = stat ;自機の方向
;*******敵弾発射*******
es_exnew TEKI_TM_hs, 340,341 ;新規スプライト取得
es_set TEKI_TM_hs, TEKI_TM_x,TEKI_TM_y,75 ;スプライト設定
es_adir TEKI_TM_hs, TEKI_TM_ang,300 ;スプライト移動方向
TEKI_TM_f = 1 ;敵弾フラグ【立てる】
}
return
;*************敵弾グレイズ****************
*敵弾グレイズ
es_get GURE_x,340,3 ;敵弾グレイズX
es_get GURE_y,340,5 ;敵弾グレイズY
es_set 600, GURE_x-10,GURE_y-12, 600
return

| |
|
2020/2/16(Sun) 19:29:02|NO.89493
敵弾の座標が、取得した座標と実際に表示されている場所とで
1フレーム分ずれているようです。
そのずれた分を考慮して、グレイズの表示位置を調節してみたら
中心に表示されるようになりました。
修正箇所だけソースを貼っておきます。
;*************敵弾グレイズ****************
*敵弾グレイズ
es_get GURE_x,340,3 ;敵弾グレイズX
es_get GURE_y,340,5 ;敵弾グレイズY
es_get move_x,340,7 ;敵弾が1フレームに移動する距離X 追加
es_get move_y,340,9 ;敵弾が1フレームに移動する距離Y 追加
es_set 600, GURE_x-12+move_x,GURE_y-12+move_y, 600 ;修正
return
解説:
・グレイズのサイズ 縦横59ドット
(エラーにはなりませんでしたが、画像の横幅が58ドットになっていました)
・敵弾のサイズ 縦横34ドット
グレイズと敵弾のサイズの差は25ドット
表示位置としては12.5ドット(これは無理なので12ドット)ずらし
敵弾の1フレームの移動量を足してみたのが上記のソースです。
|
|
2020/2/16(Sun) 20:47:00|NO.89494
大して読まずに横レス
敵弾が発生するときに初期座標を設定するじゃないですか。
そのときに同じ初期座標を使ってかすり判定用のグレイズも
同時に作ったらずれないのでは?
と思ったり。
|
|
2020/2/17(Mon) 22:12:12|NO.89503
あらやさん、返答ありがとうございます。
>1フレーム分ずれているようです。
まじですか・・・そんなことがおきてたとは・・・
es_getで1フレーム移動する距離を見るんですね。なるほど。
>(エラーにはなりませんでしたが、画像の横幅が58ドットになっていました)
あぁああああああ。画像を用意している段階で横に1ドットかけてしまってました。
ただし大きさは59です!
確かにこれなら誤差をなくして中心にできますね。ありがとうございます!
|
|
2020/2/17(Mon) 22:13:52|NO.89504
ZAPさん。返答ありがとうございます。
>>敵弾が発生するときに初期座標を設定するじゃないですか。
>>そのときに同じ初期座標を使ってかすり判定用のグレイズも
>>同時に作ったらずれないのでは?
確かに!
弾の処理が終わってからじゃないとグレイズ処理にいかない状態になってますね。
敵の数分遅れるのと、ソースの構成上で後ろの方でグレイズを処理した場合、もっとずれそうですね・・・
ちょっと工夫してきます。
|
|
2020/2/20(Thu) 21:40:38|NO.89520
グレイズ処理を同時にしてみました。
弾とグレイズを同時にする処理するソースと、1フレームを取得するソースを比較してみたのですが、
わかりやすさやソース処理を考えると「1フレームを取得するソース」の方がいいと判断しました。
弾とグレイズを同時にする処理するソースは以下のとおりになりますが、
グレイズは弾の座標にいればいいので「es_adir」して動かす必要あるのかなっていうのがありますね。
また、修正しやすいのが1フレームの方なので、一旦これで様子を見てみます。
もしやばそうなら、同時に処理するようにしてみようかと思います。
返答とソースありがとうございます!
#include "hspdxfix.as" ;DXライブラリ使用
width ,,130,200 ;ウィンドウの位置
es_ini 640,480,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2)
es_screen 640,480 ,0,0,1,1 ;スクリーン
;システム画像
buffer 2
picload "G_sisu-3.bmp"
es_buffer 2,,$00ff00,,1
;---敵弾グレイズ---
es_size 59,59, 50
es_pat 600, 0,0
;自機関連
buffer 4
picload "jiki-2.bmp"
es_buffer 4,,$00ff00,,1
;---自機---
es_size 28,42, 100
es_pat 350, 0, 0
JIKI_x = 380 : JIKI_y = 390 ;自機位置
;---自機の中心---
es_size 9,9, 50
es_pat 70, 46,43
TE_x = 216 : TE_y = 406 ;低速位置
;敵関連
buffer 5
picload "teki-2.bmp"
es_buffer 5,,$00ff00,,1
;---敵---
es_size 50,38, 100
es_pat 320, 0,0
;---敵弾---
es_size 34,34, 25
es_pat 75, 50,0
gsel 0,1
;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼
;グレイズが中心に来ない座標
TEKI_x = 350
TEKI_y = 160
;グレイズが中心に来る敵座標
/*
TEKI_x = 50
TEKI_y = 250
*/
;■■■敵配置■■■
es_exnew TEKI, 320,320 ;新規スプライトNo
es_set TEKI, TEKI_x,TEKI_y, 320 ;スプライトNo, X,Y座標 ,キャラNo
;*********メインループ*********
*メイン
es_cls ;画面クリア
es_draw ;スプライト描画
;************カウンター******************
pos 520,20 : es_mes "TEKI_TM_ang " + TEKI_TM_ang
;*****************ゲーム枠外***************
;自機
es_set 350, JIKI_x,JIKI_y, 350
;低速移動
TE_x = JIKI_x+10 : TE_y = JIKI_y+16
es_set 70, TE_x,TE_y, 70
;************gosub************
gosub *自機の移動
gosub *敵弾移動
;gosub *敵弾グレイズ
;*************低速移動******************
getkey Skey,16 ;シフトキー
if Skey{
JIKISpd = 2 ;自機の低速スピード
} else {
JIKISpd = 4 ;自機の通常スピード
}
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 TEKI_TM_f = 0 { ;敵弾フラグが立っていないときに実行
es_get TEKI_TM_x,320,3 ;敵X
es_get TEKI_TM_y,320,5 ;敵Y
es_ang TEKI_TM_x,TEKI_TM_y,TE_x-12,TE_y-12;角度取得
TEKI_TM_ang = stat ;自機の方向
;*******敵弾発射*******
es_exnew TEKI_TM_hs, 340,341 ;新規スプライト取得
es_set TEKI_TM_hs, TEKI_TM_x,TEKI_TM_y,75 ;スプライト設定
es_adir TEKI_TM_hs, TEKI_TM_ang,300 ;スプライト移動方向
;*******グレイズ*******
es_get GURE_x,340,3 ;敵弾X
es_get GURE_y,340,5 ;敵弾Y
es_exnew GURE_hs, 600,601
es_set GURE_hs, GURE_x-12,GURE_y-12, 600 ;スプライト設定
es_adir GURE_hs, TEKI_TM_ang,300 ;スプライト移動方向
TEKI_TM_f = 1 ;敵弾フラグ【立てる】
}
return
;*************敵弾グレイズ****************
/*
*敵弾グレイズ
es_get GURE_x,340,3 ;敵弾グレイズX
es_get GURE_y,340,5 ;敵弾グレイズY
es_get GURE_MV_x,340,7 ;敵弾が1フレームに移動する距離X
es_get GURE_MV_y,340,9 ;敵弾が1フレームに移動する距離Y
;敵弾34 - グレイズ59 = 25→半分は12.5だがそれは無理なので12
es_set 600, GURE_x-12+GURE_MV_x,GURE_y-12+GURE_MV_y, 600
*/
return

| |
|
2020/3/3(Tue) 08:05:52|NO.89606
hspdxfixはもとから間違いが混入しているので困りますよね
sin cosの命令も逆になっていると書き込みをみたことありますけど
あれはどうなったのかな
|
|