HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
1221
アイドル「hspdxfix.as」を使って敵を途中で方向転換したとき、自動削除するようにしたい6解決


アイドル

リンク

2017/12/21(Thu) 21:58:05|NO.82071

皆さんお久しぶりです。アイドルです。
あれからだいぶ時間経過しておりますが未だに「hspdxfix.as」と格闘しております。

 ■困っていること■
・114行目で処理すると、敵が画面外に行っても自動削除されない


さて、スプライトを使って「敵を途中で方向転換」しようと思ったのですが、
方向転換するためには「if TEKI_f(cnt) = 0 {」(86行目)の処理の中ではなく、
処理外で「es_get」と「es_apos」をやる必要があります(認識間違ってたら指摘して)

114行目である「es_apos TEKI, TEKI_HOUKO_x,TEKI_HOUKO_y, 200」を配置して実行した場合、
「特定の位置で移動:出来る」「敵が画面外に移動すると自動削除:出来ない」となってしまいました。
参考にしながら自分で改造しといてなんですが、なんで「自動削除」ができないのかわかりません。


「自動削除」は76行目の「es_flag TEKI_no, TEKI_flag & $ffffefff」で、
画面内に入ったら実行するはずなのですが、何か勘違いしているか、見落としているんだと思います。
他にツッコミどころあると思います・・・正直未だにコントロールしきれてないと大むので、
「困っていること」以外に気になる点がございましたらご指摘くださいませ。

なるべく理解には務めるようにしますが、
http://hsp.tv/play/pforum.php?mode=all&num=80729
「NO.81432〜NO.81435」あたりを参考にすれば、私のレベルが大体わかると思います・・・
----------

#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini ;システムの初期化 es_screen 640,480 ,0,0,1,1 ;スクリーン es_window 30,10, 412,460 ;スプライト表示エリア設定 es_area 10,-10, 432,480 ;スプライト有効エリア設定 buffer 2 ; picload "G_sisu.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;---境界線--- es_size 2,450 ;キャラクタNo、画像の中でそれがある場所の座標 KYOKAI_p = 455,456,457,458 KYOKAI_patx = 326,326,0,0 KYOKAI_paty = 0,0,451,451 ;表示する座標 KYOKAI_setx = 30,412,30,30 KYOKAI_sety = 10,10,10,460 repeat 4 if cnt >= 2 : es_size 384,2 ;キャラクタサイズ es_pat KYOKAI_p(cnt), KYOKAI_patx(cnt),KYOKAI_paty(cnt) es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt),1 loop buffer 5 ; picload "teki.bmp" es_buffer 5,,$00ff00,,1 gsel 0,1 ;---敵---60〜109 es_size 18,19, 50 es_pat 60, 0,0 TEKI_HOUKO_y = 1;敵の移動するY方向 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TEKI_x = 390,370,350,330,310 TEKI_y = -10,-50,-90,-130,-170 ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 420,70 : es_mes "TEKI " + TEKI ; pos 140〜180 : 使用中 ;************************************** gosub *敵弾移動 ;境界線 repeat 4 es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt) loop es_sync ;画面更新 await 16 goto *メイン ;*************敵弾移動**************** *敵弾移動 ;〜〜〜flag値〜〜〜 ;4096:画面内 ;8192:画面外 ;;〜〜〜〜〜〜〜〜〜 ;画面外検索 TEKI_no = 60 ;敵の検索開始ナンバ−(60) repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_no, 8192,TEKI_no,104 ;画面内のtype値を調べる es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y ;画面内に入ったら実行 ;KYOKAI_setx = 30,412 ;KYOKAI_sety = 10,460 if (TEKI_pos_x > 30-9) AND (TEKI_pos_y > 10-9) AND (TEKI_pos_x < 412-9) AND (TEKI_pos_y < 460-9) { es_get TEKI_flag,TEKI_no,0 ;敵のflag値 es_flag TEKI_no, TEKI_flag & $ffffefff ;敵のflag値設定 (自動削除ON) es_type TEKI_no,4096 } TEKI_no++ ;敵の検索開始ナンバ− loop ;敵の移動 TEKI_mes_x = 380 ;デバック用に表示させる座標 TEKI_no = 60 ;敵の検索開始ナンバ−(60) repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI ,60,109 ;スプライトNo (敵:60〜109) es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 60,1 ;スプライトNo, X,Y座標 ,キャラNo ;出現座標が画面外なら ;KYOKAI_setx = 30,412 ;KYOKAI_sety = 10,460 if (TEKI_x(cnt) < 30+19) OR (TEKI_y(cnt) < 10+19) OR (TEKI_x(cnt) > 412+19) OR (TEKI_y(cnt) > 460+19) { es_flag TEKI,$1100 ;自動削除OFF (スプライト表示ON+ボーダー消去無効ON) es_type TEKI,8192 /* 出現座標が画面内の敵はいないためコメントアウト } else { es_type TEKI,4096 */ } ;■ここに置く・・・「特定の位置で移動:出来ない」、「敵が自動的に消える:出来る」 ; es_apos TEKI, TEKI_HOUKO_x,TEKI_HOUKO_y, 200 ;200のスピードで↓に移動する } es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y es_get TEKI_type,TEKI_no,13 ;type値 /* ここのコメントアウトを外すと最後の敵(5匹目)が、Y座標300の位置で左に移動する if TEKI_pos_y >= 300+160 { ;なんで+160しないと300で曲がらないのかもわからないけど、前回のソースをよく読めば解決できると思うんですよ!! TEKI_HOUKO_x = -1 ;←に移動 TEKI_HOUKO_y = 0 ;↓に移動から、↓に移動しないに変更 } */ ;■ここに置く・・・「特定の位置で移動:出来る」、「敵が自動的に消える:出来ない」 es_apos TEKI, TEKI_HOUKO_x,TEKI_HOUKO_y, 200 ;200のスピードで↓に移動する ;デバック用に表示させる TEKI_mes_x += 40 ;敵を複数見るためにずらす pos TEKI_mes_x,140 : es_mes "" + TEKI_pos_x ;敵X pos TEKI_mes_x,160 : es_mes "" + TEKI_pos_y ;敵Y pos TEKI_mes_x,180 : es_mes "" + TEKI_type ;type値 TEKI_no++ ;敵の検索開始ナンバ− loop return



この記事に返信する


あらや

リンク

2018/6/7(Thu) 17:52:06|NO.84574

hspdxのバグですかね?

確認しましたが、60〜63は画面外に出た時点でフラグが0になっているのですが
64だけは$200(スプライト移動ON)だけが残り、表示自体は消えました。

es_windowに頼って自動削除に任せるのではなく
多少面倒ですが手動で画面外ならスプライト削除などの処理に変えてはいかがでしょうか。

このプラグイン自体がもう長いこと更新されていないので
今のHSPでは色々と不具合があってもしょうがないかと思います。



暇人

リンク

2018/6/7(Thu) 20:00:07|NO.84575

敵の移動のループ内でTEKIとTEKI_noが使われてる
TEKIは新規に作ったスプライトNOでTEKI_noは検索で該当したスプライトNOとして使ってるのに
敵の移動のループ内で検索はしてないので二回目以降は全て TEKI_no = 60 になってる

出現と移動を別けた方が良い

*敵弾移動
;〜〜〜type値〜〜〜
;2048:移動変更終了
;4096:画面内
;8192:画面外
;;〜〜〜〜〜〜〜〜〜
;画面外検索
TEKI_no = 60 ;敵の検索開始ナンバ−(60)
repeat
es_find TEKI_no, 8192,TEKI_no,104 ;画面外のtype値で検索
if TEKI_no<0 {break} //該当するスプライトがなかった
es_get TEKI_pos_x,TEKI_no,3 ;敵X
es_get TEKI_pos_y,TEKI_no,5 ;敵Y
;画面内に入ったら実行
;KYOKAI_setx = 30,412
;KYOKAI_sety = 10,460
if (TEKI_pos_x > 30-9) AND (TEKI_pos_y > 10-9) AND (TEKI_pos_x < 412-9) AND (TEKI_pos_y < 460-9) {
es_get TEKI_flag,TEKI_no,0 ;敵のflag値
es_flag TEKI_no, TEKI_flag & $ffffefff ;敵のflag値設定 (自動削除ON)
es_type TEKI_no,4096 //画面内のtype値設定
}
TEKI_no++ ;敵の検索開始ナンバ−
loop

;敵の出現
repeat TEKI_MAX ;敵の最大数(5)
if TEKI_f(cnt) = 0 {
TEKI_f(cnt) = 1
es_exnew TEKI ,60,109 ;スプライトNo (敵:60〜109)
es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 60,1 ;スプライトNo, X,Y座標 ,キャラNo
es_flag TEKI,$1100 ;自動削除OFF (スプライト表示ON+ボーダー消去無効ON)
es_type TEKI,8192
es_apos TEKI, TEKI_HOUKO_x,TEKI_HOUKO_y, 200 ;200のスピードで↓に移動する
TEKI_Move(TEKI)=1 // 1=移動の変更あり

}
loop

;敵の行動処理
TEKI_no = 60 ;敵の検索開始ナンバ−(60)
find_type=8192|4096 //検索するタイプ値
repeat ;敵の最大数(5)
es_find TEKI_no, find_type,TEKI_no,109
if TEKI_no<0 {break}

if TEKI_Move(TEKI_no)=1 {// 移動の変更あり
es_get TEKI_pos_x,TEKI_no,3 ;敵X
es_get TEKI_pos_y,TEKI_no,5 ;敵Y

if TEKI_pos_y >= 300 {
es_apos TEKI_no, -1,0, 200 ;200のスピードで←に移動する
TEKI_Move(TEKI_no)=0 // 0=移動の変更無し
}
}

TEKI_no++ ;敵の検索開始ナンバ−
loop

;デバック用に表示させる
TEKI_mes_x = 380 ;デバック用に表示させる座標
TEKI_no = 60 ;敵の検索開始ナンバ−(60)
find_type=8192|4096|2048
repeat ;敵の最大数(5)
es_find TEKI_no, find_type,TEKI_no,109
if TEKI_no<0 {break}
es_get TEKI_pos_x,TEKI_no,3 ;敵X
es_get TEKI_pos_y,TEKI_no,5 ;敵Y
es_get TEKI_type,TEKI_no,13 ;type値
TEKI_mes_x += 40 ;敵を複数見るためにずらす
pos TEKI_mes_x,120 : es_mes "" + TEKI_no ;敵no
pos TEKI_mes_x,140 : es_mes "" + TEKI_pos_x ;敵X
pos TEKI_mes_x,160 : es_mes "" + TEKI_pos_y ;敵Y
pos TEKI_mes_x,180 : es_mes "" + TEKI_type ;type値
TEKI_no++ ;敵の検索開始ナンバ−
loop

return




アイドル

リンク

2018/6/9(Sat) 17:12:45|NO.84581

いつまにかスレッドがあがっててびっくりしました、
あれからちょっと手を付けられない時期があって、ちまちまやってここまで長引いてしまいました。

変数名など一部おかしいなーって思って修正していて、
上の方の「;デバック用に表示させる」で数値を見ると敵が消えているけど、
下の方の「;デバック用に表示させる」で数値を見ると敵が消えていないから、
何か処理を間違えているなって感じで一旦止めて、時間ができたらやるつもりでした(´Д`)


ってかなんであがったんですかね・・・
あれの仕業だと思いますが、半年もずっとそのままにしていた私にも批があると思うので、
ここらでけりをつけます。


>>あらやさん
そうそう最後の敵られんがおかしかったので直してました。
上にも書いてあるとおり、変数名などに問題があったので、バグではなく処理ミスですね。

>>暇人さん
>>敵の移動のループ内でTEKIとTEKI_noが使われてる。
ソースと処理の解説ありがとうございます。
それに気がついて直してました><
ソース解読はしばしお待ちを!・・・しばし・しばしにします!


修正中だったソース。ちょっと待っててね

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 600,512,1024 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(256*4) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window 30,10, 412,460 ;スプライト表示エリア設定 es_area 10,-10, 432,480 ;スプライト有効エリア設定 buffer 2 ; picload "G_sisu.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;---境界線--- es_size 2,450 ;キャラクタNo、画像の中でそれがある場所の座標 KYOKAI_p = 455,456,457,458 KYOKAI_patx = 326,326,0,0 KYOKAI_paty = 0,0,451,451 ;表示する座標 KYOKAI_setx = 30,412,30,30 KYOKAI_sety = 10,10,10,460 repeat 4 if cnt >= 2 : es_size 384,2 ;キャラクタサイズ es_pat KYOKAI_p(cnt), KYOKAI_patx(cnt),KYOKAI_paty(cnt) es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt),1 loop buffer 5 ; picload "teki.bmp" es_buffer 5,,$00ff00,,1 gsel 0,1 ;---敵---60〜109 es_size 18,19, 50 es_pat 60, 0,0 TEKI_HOUKO_y = 1;敵の移動するY方向 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TEKI_x = 390,370,350,330,310 TEKI_y = -50,-90,-130,-170,-210 ;*********メインループ********* *メイン es_cls ;画面クリア gosub *敵移動 es_draw ;スプライト描画 ;************************************** TEKI_mes_x = 400 ;敵のX、Yを複数見るために宣言する TEKI_no = 1 ;敵の検索開始ナンバ− repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_no, 4096,TEKI_no,109 ;TEKI_noのtype値が8192のやつを探す es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y es_get TEKI_type,TEKI_no,13 ;type値 ;デバック用に表示させる TEKI_mes_x += 40 ;敵を複数見るためにずらす pos TEKI_mes_x,140 : es_mes "" + TEKI_pos_x ;敵X pos TEKI_mes_x,160 : es_mes "" + TEKI_pos_y ;敵Y pos TEKI_mes_x,180 : es_mes "" + TEKI_type ;type値 pos TEKI_mes_x,200 : es_mes "" + TEKI_no_nai TEKI_no++ ;敵の検索開始ナンバ− loop ;境界線 repeat 4 es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt) loop es_sync ;画面更新 await 16 goto *メイン ;*************敵移動**************** *敵移動 ;〜〜〜flag値〜〜〜 ;4096:画面内 ;8192:画面外 ;;〜〜〜〜〜〜〜〜〜 ;画面内検索 TEKI_no = 60 ;敵の検索開始ナンバ−(60) repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_no, 8192,TEKI_no,109 ;TEKI_noのtype値が8192のやつを探す es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y ;画面内に入ったら実行 ;KYOKAI_setx = 30,412 ;←→ ;KYOKAI_sety = 10,460 ;↑↓ if (TEKI_pos_x > 30-9) AND (TEKI_pos_y > 10-9) AND (TEKI_pos_x < 412-9) AND (TEKI_pos_y < 460-9) { es_get TEKI_flag,TEKI_no,0 ;敵のflag値を「取得」 es_flag TEKI_no, TEKI_flag & $ffffefff ;敵のflag値設定 (自動削除ON) es_type TEKI_no,4096 } TEKI_no++ ;敵の検索開始ナンバ− loop ;敵の移動 TEKI_mes_x = 170 ;デバック用に表示させる座標 TEKI_no = 60 ;敵の検索開始ナンバ−(60) repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI_no ,60,109 ;スプライトNo (敵:60〜109) (新規スプライト取得) es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y es_set TEKI_no, TEKI_x(cnt),TEKI_y(cnt), 60,1 ;スプライトNo, X,Y座標 ,キャラNo ;出現座標が画面外 ;KYOKAI_setx = 30,412 ;←→ ;KYOKAI_sety = 10,460 ;↑↓ if (TEKI_x(cnt) < 30+19) OR (TEKI_y(cnt) < 10+19) OR (TEKI_x(cnt) > 412+19) OR (TEKI_y(cnt) > 460+19) { es_flag TEKI_no,$1100 ;自動削除OFF (スプライト表示ON+ボーダー消去無効ON) ;スプライトNo,flag値 ;スプライト表示ON+ボーダー消去無効ON es_type TEKI_no,8192 /* 出現座標が画面内の敵はいないためコメントアウト } else { es_type TEKI_no,4096 */ ;es_area 10,-10, 432,480 ;スプライト有効エリア設定 es_apos TEKI_no, TEKI_HOUKO_x,TEKI_HOUKO_y, 200 } } ;該当するスプライトが見つかったらp1に結果を代入 es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y es_get TEKI_type,TEKI_no,13 ;type値 if TEKI_pos_y >= 300 { ;左に移動する ; if TEKI_pos_x >= 10 { ;左に移動するのをやめる es_apos TEKI_no, -1,0, 200 } ; } ;デバック用に表示させる TEKI_mes_x += 40 ;敵を複数見るためにずらす pos TEKI_mes_x,170 : es_mes "下" pos TEKI_mes_x,190 : es_mes "" + TEKI_no ;敵no pos TEKI_mes_x,210 : es_mes "" + TEKI_pos_x ;敵X pos TEKI_mes_x,230 : es_mes "" + TEKI_pos_y ;敵Y pos TEKI_mes_x,250 : es_mes "" + TEKI_type ;type値 TEKI_no++ ;敵の検索開始ナンバ− loop return



アイドル

リンク

2018/6/17(Sun) 16:05:31|NO.84631

暇人さんのソースを参考にして、ダメだったところがいくつかわかりました。
変更点、疑問点は下記にまとめておきます。


「type値2048」がどうしてもわからなかったです。
今は「5匹が右上から出現し、特定の場所に来たら左に移動する」という処理にしていますが、
複数管理する時に使うかな?って思っています。

別の疑問点もありますが、まずはここをしっかり抑えようと思います。

 ---質問から変更点---
■1
>>;敵の移動
>> TEKI_mes_x = 380 ;デバック用に表示させる座標
>> TEKI_no = 60 ;敵の検索開始ナンバ−(60)
から下にある「TEKI」を「TEKI_no」に変更(NO.84581がそうです)

■2
>>;デバック用に表示させる
のところで「es_find」でスプライトを調べていないせいで、消えていないように見えるだけだった

>>下の方の「;デバック用に表示させる」で数値を見ると敵が消えていないから、
これの原因が↑

 ---疑問点---
■1
>>type値2048
実はこれをどのように使うか、何でおいてあるのか考えてたら時間がかかりました。
「;敵の行動処理」にある「if TEKI_Move(TEKI_no) = 0 {」で判断していて、
特定の場所に来たらフラグをしまっているし、尚且画面外に行ったら消えるようになっているので、
どのタイミングで2048をうまく使う方法が思い浮かばなかったです。

■2
>>;敵の行動処理
find_type = 4096 AND 8192 ;検索するタイプ値
>>es_find TEKI_no, find_type,TEKI_no,109 ;type値が4096のやつを探す
出現してからすぐに動く敵の場合、8192も含めればいいのでしょうか。
今はそういう敵がいないので、4096だけでも問題ないと思うのですが、私の認識はあっていますでしょうか?


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 600,512,1024 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(256*4) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window 30,10, 412,460 ;スプライト表示エリア設定 es_area 10,-10, 432,480 ;スプライト有効エリア設定 buffer 2 ; picload "G_sisu.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;---境界線--- es_size 2,450 ;キャラクタNo、画像の中でそれがある場所の座標 KYOKAI_p = 455,456,457,458 KYOKAI_patx = 326,326,0,0 KYOKAI_paty = 0,0,451,451 ;表示する座標 KYOKAI_setx = 30,412,30,30 KYOKAI_sety = 10,10,10,460 repeat 4 if cnt >= 2 : es_size 384,2 ;キャラクタサイズ es_pat KYOKAI_p(cnt), KYOKAI_patx(cnt),KYOKAI_paty(cnt) es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt),1 loop buffer 5 ; picload "teki.bmp" es_buffer 5,,$00ff00,,1 gsel 0,1 ;---敵---60〜109 es_size 18,19, 50 es_pat 60, 0,0 TEKI_HOUKO_y = 1;敵の移動するY方向 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TEKI_x = 390,370,350,330,310 TEKI_y = -50,-90,-130,-170,-210 ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 ; pos 140〜180 : 使用中 ;************************************** gosub *敵移動 ;境界線 repeat 4 es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt) loop es_sync ;画面更新 await 16 goto *メイン ;*************敵移動**************** *敵移動 ;〜〜〜type値〜〜〜 ;2048:移動変更終了 ;■1:うまく使う方法、どのような意図があるのかわからなかった ;4096:画面内 ;8192:画面外 ;;〜〜〜〜〜〜〜〜〜 ;画面外検索 TEKI_no = 60 ;敵の検索開始ナンバ−(60) repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_no, 8192,TEKI_no,109 ;画面外のtype値で検索 es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y ;画面内に入ったら実行 ;KYOKAI_setx = 30,412 ;←→ ;KYOKAI_sety = 10,460 ;↑↓ if (TEKI_pos_x > 30-9) AND (TEKI_pos_y > 10-9) AND (TEKI_pos_x < 412-9) AND (TEKI_pos_y < 460-9) { es_get TEKI_flag,TEKI_no,0 ;敵のflag値を「取得」 es_flag TEKI_no, TEKI_flag & $ffffefff ;敵のflag値設定 (自動削除ON) es_type TEKI_no,4096 ;画面内のtype値設定 } TEKI_no++ ;敵の検索開始ナンバ− loop ;敵の出現 repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI ,60,109 ;スプライトNo (敵:60〜109) es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 60 ;スプライトNo, X,Y座標 ,キャラNo es_flag TEKI,$1100 ;自動削除OFF (スプライト表示ON+ボーダー消去無効ON) es_type TEKI,8192 es_apos TEKI, TEKI_HOUKO_x,TEKI_HOUKO_y, 200 ;200のスピードで↓に移動する TEKI_Move(TEKI) = 1 ;1=移動の変更あり } loop ;敵の行動処理 TEKI_no = 60 ;敵の検索開始ナンバ−(60) find_type = 4096 ; AND 8192 ;検索するタイプ値 repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_no, find_type,TEKI_no,109 ;type値が4096のやつを探す ;■↑疑問:出現してからすぐに動く敵の場合、8192も含めればよい? ;今はいないので、4096だけでも問題ないと思う。私の認識はあっているのか? if TEKI_no < 0 : break if TEKI_Move(TEKI_no) = 1 { ;↑枠内に入った「TEKI_no」を調べて、該当するスプライトNoだったら実行 es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y if TEKI_pos_y >= 300 { es_apos TEKI_no, -1,0, 200 ;200のスピードで←に移動する TEKI_Move(TEKI_no) = 0 ;0=移動の変更無し } } TEKI_no++ ;敵の検索開始ナンバ− loop ;デバック用に表示させる TEKI_mes_x = 170 ;デバック用に表示させる座標 TEKI_no = 60 ;敵の検索開始ナンバ−(60) find_type = 4096 AND 8192; AND 2048 ;検索するタイプ値 repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_no, find_type,TEKI_no,109 ;敵の「画面内、画面外」を調べる ;○わかったこと:ここでスプライト情報を探していなかったせいで、消えていないように見えるのも原因の1つだった es_get TEKI_pos_x,TEKI_no,3 ;敵X es_get TEKI_pos_y,TEKI_no,5 ;敵Y es_get TEKI_type,TEKI_no,13 ;type値 TEKI_mes_x += 40 ;敵を複数見るためにずらす pos TEKI_mes_x,190 : es_mes "" + TEKI_no ;敵no pos TEKI_mes_x,210 : es_mes "" + TEKI_pos_x ;敵X pos TEKI_mes_x,230 : es_mes "" + TEKI_pos_y ;敵Y pos TEKI_mes_x,250 : es_mes "" + TEKI_type ;type値 TEKI_no++ ;敵の検索開始ナンバ− loop return



暇人

リンク

2018/6/17(Sun) 16:42:02|NO.84633

>どのタイミングで2048をうまく使う方法が思い浮かばなかったです。
最初はtype値で移動変更を識別してたけど
;敵の行動処理 内で移動変更だけじゃなく弾の発射等も行う場合
type値とは別の方が良さそう(type値には使える数に限りがあるし)なので変更したけど
>>2048:移動変更終了
を消し忘れた

>今はそういう敵がいないので、4096だけでも問題ないと思うのですが、私の認識はあっていますでしょうか?
それでOK



アイドル

リンク

2018/6/18(Mon) 19:41:06|NO.84639

暇人さん確認ありがとうございます!

フラグで管理されてたから、type値で判断する必要ないし何かな?
っと思ってたら消し忘れだったんですね。それならよかった。


>今はそういう敵がいないので、4096だけでも問題ないと思うのですが、私の認識はあっていますでしょうか?
>それでOK
認識があっててよかったです。
考えが間違っていないことを確認できてよかったです!

お答えとソースありがとうございます!
別問題に関してはなるべく自力で考えます(スプライトなかなか厄介ですね・・・)



ONION software Copyright 1997-2023(c) All rights reserved.