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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0910
アイドル【hspdxfix.as】自機が画面上部に行ったら、アイテムを回収したい8解決


アイドル

リンク

2019/9/10(Tue) 20:44:29|NO.88395

どうも。アイドルです。

いつもどおり「hspdxfix.as」プラグインを使った物になります。
今回のプログラムはものすごく簡単なんだけど、うまくいかない原因が不明なので質問します。

 ■仕様■
・自機が画面上部にいる時、アイテムが自機に引き寄せられる
・上部に行ってから、下部に行ったらアイテム引き寄せは発生しない
・瞬時に上から下に移動した場合、取れなかったアイテムは動かない


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window 30,10, 412,460 ;スプライト表示エリア設定 es_area 10,-10, 432,480 ;スプライト有効エリア設定 ;---アイテム--- es_size 12,12, 100 es_pat 300, 1,80 ;---自機--- es_size 28,42, 100 es_pat 400, 0, 0 JIKI_x = 206 : JIKI_y = 390 ;自機座標 JIKISpd = 4 ;自機スピード ;アイテム AI_MAX = 5 dim AI_f,AI_MAX ;フラグ ;▼▼▼▼▼▼▼アイテム配列▼▼▼▼▼▼▼ AI_x = 200,250,300,350,400 AI_y = 350,300,250,150,100 ;************メインループ*************** *メイン es_cls es_draw pos 450,180 : es_mes "AI_ERIA_JK_f " + AI_ERIA_JK_f pos 450,200 : es_mes "JIKI_y " + JIKI_y ;デバック用 pos 50,160 : es_mes "-----ここから上-----" pos 450,220 : es_mes "AI_c " + AI_c pos 450,240 : es_mes "AI_HIT " + AI_HIT ;*************カウンター**************** gosub *自機の移動 gosub *アイテム gosub *アイテム当たり判定 es_set 400, JIKI_x,JIKI_y, 400 ;自機表示 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 ;************アイテム***************** *アイテム repeat AI_MAX ;アイテムの最大数(5) if AI_f(cnt) = 0 { AI_f(cnt) = 1 ;フラグ「立てる」 es_exnew AI_no ,150,154 ;新規スプライト取得 es_set AI_no, AI_x(cnt),AI_y(cnt),300 ;スプライトNo, X,Y座標 ,キャラNo es_type AI_no,8 ;アイテムtype値(8) } loop ;自機の位置によって、アイテムを自動回収するか決める es_get AI_ERIA_JK_y,400,5;自機Y if AI_ERIA_JK_y <= 159 { AI_ERIA_JK_f = 1 ;高いエリア } else { AI_ERIA_JK_f = 0 ;高いエリア以外 } ;自動回収 if AI_ERIA_JK_f = 1 { ;自機が高いエリアに行ったら実行 AI_c++ ;デバック用(何回通っているか調べる) AI_ERIA = 150 ;検索ID repeat AI_MAX ;アイテムの最大数(5) es_get AI_ERIA_x(cnt),AI_ERIA,3 ;スプライトのX座標 es_get AI_ERIA_y(cnt),AI_ERIA,5 ;スプライトのY座標 es_ang AI_ERIA_x(cnt),AI_ERIA_y(cnt),JIKI_x+7,JIKI_y+7;角度取得 AI_ERIA_ang(cnt) = stat ;自機の方向 es_adir AI_ERIA, AI_ERIA_ang(cnt),1500 ;スプライト移動方向設定 AI_ERIA++ loop } return ;*********アイテム当たり判定***************** *アイテム当たり判定 repeat es_check JIKI_VS_TEKI_AI ,400,8 if JIKI_VS_TEKI_AI = -1 : break ;当たっていない場合はループを抜ける es_kill JIKI_VS_TEKI_AI ;スプライト削除(アイテム) AI_HIT++ ;デバック用(アイテム獲得数) loop return



この記事に返信する


暇人

リンク

2019/9/10(Tue) 22:30:59|NO.88402

自動移動を止める処理をすれば良い
AI_ERIA_JK_fが1以外ならアイテムのflag値を取得して移動OFFに変更してflag値設定

;自動回収 より下を置き換え↓

if AI_ERIA_JK_f = 1 { ;自機が高いエリアに行ったら実行 AI_c++ ;デバック用(何回通っているか調べる) AI_ERIA = 150 ;検索ID repeat AI_MAX ;アイテムの最大数(5) es_get AI_ERIA_x(cnt),AI_ERIA,3 ;スプライトのX座標 es_get AI_ERIA_y(cnt),AI_ERIA,5 ;スプライトのY座標 es_ang AI_ERIA_x(cnt),AI_ERIA_y(cnt),JIKI_x+7,JIKI_y+7;角度取得 AI_ERIA_ang(cnt) = stat ;自機の方向 es_adir AI_ERIA, AI_ERIA_ang(cnt),1500 ;スプライト移動方向設定 AI_ERIA++ loop }else{ AI_ERIA = 150 ;検索ID repeat AI_MAX ;アイテムの最大数(5) es_get flag,AI_ERIA,ESI_FLAG_LOW ;スプライトのflag値 if flag & $200{//スプライト移動ONなら es_flag AI_ERIA,(flag & $fffffdff) //移動OFFに変更 } AI_ERIA++ loop } return ;*********アイテム当たり判定***************** *アイテム当たり判定 repeat es_check JIKI_VS_TEKI_AI ,400,8 if JIKI_VS_TEKI_AI = -1 : break ;当たっていない場合はループを抜ける es_kill JIKI_VS_TEKI_AI ;スプライト削除(アイテム) AI_f(JIKI_VS_TEKI_AI-150)=0 //使用中フラグクリア AI_HIT++ ;デバック用(アイテム獲得数) loop return



アイドル

リンク

2019/9/11(Wed) 21:07:58|NO.88409

暇人さん、ソースと返答ありがとうございます。

flag!?苦手なやつきた・・・
苦手から克服していないため、ソースの中で疑問に思ったところがあります。


・if flag & $200 { ;スプライト移動ONなら
これは「スプライト移動ON」っていうことは、スプライトがある時に実行したいので、条件としてあるって感じでしょうか。

・es_flag AI_ERIA,(flag & $fffffdff) ;移動OFFに変更
16進数なんだけど、2進数に読み替えて「11111111111111111111110111111111」・・・これがどうしてこういう動作になるのかわからないorz
確かOFFにしたい場所が0、ONが1になっているんだよね(そろそろあれから2年ですね・・・・

そういえば、他のスレで初めて知ったのですが「HSPDXFI」はHSP3.5から非推奨とのことですが、使わに方がいいですよね・・・



暇人

リンク

2019/9/11(Wed) 23:01:41|NO.88410

>時に実行したいので、条件としてあるって感じでしょうか。
停止してるのを又停止処理するのもなんかあれなんで・・・

& は、どちらかが0なら0になる
なので両方ビットが1の場所が1になる

%101 & %010 = %000
%111 & %010 = %010
%111 & %101 = %101

変更したい方の数値が確定してるなら引き算でも良い

%111 - %010 = %101

if flag & $200 {//でflagに$200(%1000000000)が含まれるのが確定するので es_flag AI_ERIA,(flag - $200) //これでも良い



アイドル

リンク

2019/9/12(Thu) 07:39:04|NO.88411

お返事ありがとうございます。

「if flag & $200」はそういうことだったんですね。
高いところ以外にいるときに、スプライトが移動してたら動かさないようにするための物だったんですね。


>>%101 & %010 = %000
>>%111 & %010 = %010
>>%111 & %101 = %101
両方に1が重なっているところが1になるってことかな。
引き算だと逆に、両方に1が重なっているところは0になるってことか。

>>es_flag AI_ERIA,(flag - $200) //これでも良い
おぉ、なるほど。確かに確定しているからこれなら0になりますね。

0で疑問に思ったのですが「0 : スプライト未登録」が実行されるんですよね。
なんで「es_flag AI_ERIA,0」と最初っから0と宣言しない理由がわからないです。
ビットの関係なんですかね・・・(ビットの勉強したほうがいいですよね・・)

後はあれです、「HSPDXFI」が非推奨とのことで、この質問が終わったら別のプラグインを使おうと思います。



暇人

リンク

2019/9/12(Thu) 20:17:22|NO.88413

>なんで「es_flag AI_ERIA,0」と最初っから0と宣言しない理由が
消去するなら良いけど
自動移動だけ変更したいからflagに現在のflag値を取得して
自動移動ONのフラグ$200のビットだけ0にしてる

取得されたflag値は$300になってるから$200を消して$100にする

>ビットの関係なんですかね・・・(ビットの勉強したほうがいい
覚えといて損は無いと思う
一つの変数に色々意味を持たせて同時に複数の条件が
成立してるかの判定を一回で出来たりするので・・・



アイドル

リンク

2019/9/12(Thu) 20:58:02|NO.88414

暇人さん再度返答ありがとうございます。

>>取得されたflag値は$300になってるから$200を消して$100にする
あぁ、そういうことか「$100 スプライト表示ON」は自動的に設定されていて、
移動処理があるので「$200 スプライト移動ON」が加算されるってことですね。
なので「$100+$200」=「$300」になるわけですね。

んで、「$200 スプライト移動ON」のビットだけを0にしたいから、それの処理をする。
私はまだ慣れていないので「es_flag AI_ERIA,(flag - $200)」でやろうと思います。


ビット計算は色んなサイトを行ってますが、オススメなサイトってありますか。それとも本を買えばいいのかな。
苦手意識があるからあれから全然触ってなかったんですよね。
私の場合、必要な場面に遭遇しないと覚えられないし・・・



暇人

リンク

2019/9/12(Thu) 22:26:51|NO.88416

必要な時に覚えれば大丈夫でしょう

左クリックしてる間点滅するスクリプト
普通

repeat redraw 0 stick a,256 if a { b++ }else{ b=0 } if b\2 { color 255,255,255 boxf 200,200,400,400 }else{ color boxf 200,200,400,400 } redraw 1 await 16 loop
ビット演算

repeat redraw 0 stick a,256 if a { b not 1 //bが1なら0に1なら0に }else{ b=0 } if b { color 255,255,255 boxf 200,200,400,400 }else{ color boxf 200,200,400,400 } redraw 1 await 16 loop
自分の場合こう言うのが面白いと感じるから覚えた感じ・・・



アイドル

リンク

2019/9/13(Fri) 07:24:39|NO.88422

暇人さん返答ありがとうございます。

面白い場面に遭遇して覚える感じですか。確かに何度かあった。
ビットは気になったときに調べて少しだけでもいいから使えるようにしたいです(こうして未来の自分に託した結果がこれ

やりたいことが出来たし、ある程度理解できたので解決にします。ありがとうございました!


プラグインは、まずは基準命令でもどうにかなる部分があるっぽいので、まずはそこから改善してみようと思います。
出来なかったら別プラグイン探します。



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