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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0930
アイドル【hspdxfix.as】時間が経過したら移動を繰り返し行いたい7解決


アイドル

リンク

2020/9/30(Wed) 09:31:32|NO.91495

hspdxfix.asプラグインで作ったSTGゲームになります。


「時間が経過したら移動をして、時間が経過したら移動をする」
っていうのを作ろうとして「es_aim」を使用したのですが、
移動先の座標に到着すると、そのキャラクターがぷるぷる動いてしまいます。

原因は常に「es_aim」を実行しているせいとわかったので、フラグで制御しようと思ったのですが、
フラグでやろうとすると指定していない方向に動いてしまいます・・・

仮にうまくいったとしても「「es_apos」で移動して、特定座標に来たら移動をやめる」っていうのと同じような書き方になるし、
フラグの管理を考えるとなんか違うのかな?って思っています。
うまく使いこなせてないと思うので、アドバイス等ありましたらよろしくお願いいたします。


■仕様
・時間が経過したら移動するを繰り返しおこなう


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 2200,2200,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 buffer 6 ; picload "reimu.bmp" es_buffer 6,,$00ff00,,1 es_size 27,59, 100 es_pat 1100, 66,61 gsel 0,1 ;■■■■敵■■■ es_set 1100, 208,70, 1100 es_type 1100,4096 ;************メインループ*************** *メイン es_cls es_draw ;*************カウンター**************** es_get TEKI_pos_x,1100,3 ;X es_get TEKI_pos_y,1100,5 ;Y pos 500,50 : es_mes "TEKI_TAIM " + TEKI_TAIM pos 500,70 : es_mes "TEKI_pos_x " + TEKI_pos_x pos 500,90 : es_mes "TEKI_pos_y " + TEKI_pos_y ;******************************** gosub *敵の処理 es_sync ;画面更新 await 16 goto *メイン ;****************敵の処理************* *敵の処理 ;---行動処理--- if TEKI_TAIM <= 800 : TEKI_TAIM++ ;初期位置 ; if TEKI_TAIM <= 99 : es_aim 1100, 208,70 ;→↓に移動(この時点でぷるぷるになる) if TEKI_TAIM >= 100 : es_aim 1100, 315,177 /* ;←↑に移動 if TEKI_TAIM >= 400 : es_aim 1100, 208,70 ;←↓に移動 if TEKI_TAIM >= 600 : es_aim 1100, 102,177 ;→↑に移動 if TEKI_TAIM >= 800 { es_aim 1100, 208,70 if TEKI_pos_x >= 208 { TEKI_TAIM = 0 ;時間を【リセット】 } } */ ;---フラグの場合--- /* ;→↓に移動 if TEKI_f = 0 { if TEKI_TAIM >= 100 { es_aim 1100, 315,177 } } if TEKI_pos_y >= 177 : TEKI_f = 1 ;移動先に到着したらフラグを立てる */ ;---es_aposの場合--- /* ;→↓に移動 if TEKI_TAIM >= 100 { es_apos 1100, 1,1 if TEKI_pos_y >= 177 { ;移動先に到着したら「es_apos」で移動をやめさせる es_apos 1100, 0,0 } } */ return



この記事に返信する


あらや

リンク

2020/10/1(Thu) 15:04:37|NO.91509

色々なやり方がありそうですが、
フラグを使ってシンプルにやってみました。(es_aposも使っています)

es_aimは1回使うとそのあとは自動で移動してくれるので、
移動開始時に一度使うだけです。

敵の座標管理に変数4つ(XとYをそれぞれ2つずつ)を追加しています。


//〜省略〜 ;■■■■敵■■■ es_set 1100, 208,70, 1100 teki_px = 208 : teki_py = 70 es_type 1100,4096 //〜省略〜 *敵の処理 ;---行動処理--- if TEKI_TAIM <= 800 : TEKI_TAIM++ es_get TEKI_X, 1100, 3; // X座標取得 es_get TEKI_Y, 1100, 5; // Y座標取得 if( TEKI_F == 0 ) { // 停止中の処理 es_pos 1100, teki_px, teki_py; // 念のために位置を調整 if TEKI_TAIM <= 99 : teki_px = 208 : teki_py = 70; // 初期位置 if TEKI_TAIM = 100 : es_aim 1100, 315, 177 : TEKI_F = 1; // →↓に移動(フラグ1) if TEKI_TAIM = 400 : es_aim 1100, 208, 70 : TEKI_F = 2; // ←↑に移動(フラグ2) if TEKI_TAIM = 600 : es_aim 1100, 101, 177 : TEKI_F = 3; // ←↓に移動(フラグ3) if TEKI_TAIM = 800 : es_aim 1100, 208, 70 : TEKI_F = 4; // →↑に移動(フラグ4) } else { // フラグ1 if( TEKI_F = 1 ) { // →↓に移動(XとYが両方+の動き) if( (TEKI_X >= 315) && (TEKI_Y >= 177) ) { // 目的の座標に到着した場合 es_apos 1100, 0, 0; // 動きを止める teki_px = 315 : teki_py = 177; // 念のため停止中の座標を記録 TEKI_F = 0; // フラグを0(停止)に } } // フラグ2 if( TEKI_F = 2 ) { // ←↑に移動(XとYが両方−の動き) if( (TEKI_X <= 208) && (TEKI_Y <= 70) ) { // 目的の座標に到着した場合 es_apos 1100, 0, 0; // 動きを止める teki_px = 208 : teki_py = 70; // 念のため停止中の座標を記録 TEKI_F = 0; // フラグを0(停止)に } } // フラグ3 if( TEKI_F = 3 ) { // ←↓に移動(Xが−、Yが+の動き) if( (TEKI_X <= 101) && (TEKI_Y >= 177) ) { // 目的の座標に到着した場合 es_apos 1100, 0, 0; // 動きを止める teki_px = 101 : teki_py = 177; // 念のため停止中の座標を記録 TEKI_F = 0; // フラグを0(停止)に } } // フラグ4 if( TEKI_F = 4 ) { // →↑に移動(Xが+、Yが−の動き) if( (TEKI_X >= 208) && (TEKI_Y <= 70) ) { // 目的の座標に到着した場合 es_apos 1100, 0, 0; // 動きを止める teki_px = 208 : teki_py = 70; // 念のため停止中の座標を記録 TEKI_F = 0; // フラグを0(停止)に TEKI_TAIM = 0; ;時間を【リセット】 } } } return;

左下に移動した時に微妙にブレたので
座標を1ドット修正しました。



アイドル

リンク

2020/10/1(Thu) 22:15:02|NO.91513

あらやさん
いつも返答ありがとうございます。


シンプルにいくのならフラグになりますか。
この方法なら都度フラグを初期化する必要がないのでいいですね。
保険に念のため座標を正しい位置に修正するのも助かりますね!


1つ気になったのは「else」は必要だったのかなっていうところです。
「TEKI_F = 0」は「念のために位置を調整」のところだけ判定すればいいので、
そこに「if」をおいたほうがいいかなって思ったんですが、何か勘違いしてたらすいません><

if TEKI_F = 0 : es_pos 1100, teki_px, teki_py ;念のために位置を調整 if TEKI_TAIM <= 99 : teki_px = 208 : teki_py = 70 ;初期位置 if TEKI_TAIM = 100 : es_aim 1100, 315, 177 : TEKI_F = 1 ;→↓に移動(フラグ1) if TEKI_TAIM = 400 : es_aim 1100, 208, 70 : TEKI_F = 2 ;←↑に移動(フラグ2) if TEKI_TAIM = 700 : es_aim 1100, 101, 177 : TEKI_F = 3 ;←↓に移動(フラグ3) if TEKI_TAIM = 1000 : es_aim 1100, 208, 70 : TEKI_F = 4 ;→↑に移動(フラグ4) ;フラグ1 if TEKI_F = 1 { ;←↑に移動 if (TEKI_X >= 315) && (TEKI_Y >= 177) { ;目的の座標に到着した場合 es_apos 1100, 0, 0;動きを止める teki_px = 315 : teki_py = 177 ;念のため停止中の座標を記録 TEKI_F = 0 ;フラグを0(停止) } }



あらや

リンク

2020/10/1(Thu) 22:36:25|NO.91514

正直に言えば、elseは必要ないです。

移動中と停止中にわけて
見てわかりやすくするために入れたので
不要です。

そして下記の5行(初期位置の処理は微妙ですが)

if TEKI_TAIM <= 99 : teki_px = 208 : teki_py = 70; // 初期位置 if TEKI_TAIM = 100 : es_aim 1100, 315, 177 : TEKI_F = 1; // →↓に移動(フラグ1) if TEKI_TAIM = 400 : es_aim 1100, 208, 70 : TEKI_F = 2; // ←↑に移動(フラグ2) if TEKI_TAIM = 600 : es_aim 1100, 101, 177 : TEKI_F = 3; // ←↓に移動(フラグ3) if TEKI_TAIM = 800 : es_aim 1100, 208, 70 : TEKI_F = 4; // →↑に移動(フラグ4)

これ、フラグが0のときのif文の外に置いても問題は無いんですが、
ifの外だと、移動・停止関係なく毎回この5行の判定を行なうことになるので
ほんの少しですが効率が悪いんじゃないでしょうか?



アイドル

リンク

2020/10/2(Fri) 07:47:55|NO.91520

あらやさん再度回答ありがとうございます。

>>ifの外だと、移動・停止関係なく毎回この5行の判定を行なうことになるので
>>ほんの少しですが効率が悪いんじゃないでしょうか?
あばばば。確かにそうですね。
フラグが0のときのみ実行するようにして、移動中は処理しないほうがいいですね。

なるほどこっれならelseあったほうが無難ですね。
おかげでスッキリしました。



kanamaru

リンク

2020/10/2(Fri) 09:03:11|NO.91521

プログラムを全部読んだわけじゃないのでわからないですが、
フラグ2とフラグ4ってまとめられないですか?

if((TEKI_F=2)&&(TEKI_F=4)){ if(TEKI_Y<=70){ es_apos 1100, 0, 0; // 動きを止める teki_px = 208 : teki_py = 70; // 念のため停止中の座標を記録 TEKI_F = 0; if(TEKI_X >= 208):TEKI_TAIM = 0; } }
でもよさそうに感じます。フラグ1とフラグ3も同じところがありますが、
細かい所が違い、まとめるのは無理そうです。
まあ変にまとめても可読性が下がるだけかもしれませんが。



あらや

リンク

2020/10/2(Fri) 17:51:05|NO.91525

>kanamaruさん
シンプルで、なおかつ分かりやすさを優先したので
おっしゃる通り、まとめようと思えばまとめられますし
単純な45度方向への移動なので、ほかにもやり方はあるでしょうね。

kanamaruさんの手法もまとめ方の参考になりますね
補足的に説明していただきありがとうございます。

ただ、あげあしを取るわけではないのですが
>if((TEKI_F=2)&&(TEKI_F=4)){
これは『&&』ではなく『||』ですよね……?



アイドル

リンク

2020/10/2(Fri) 23:10:58|NO.91526

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


確かに省略できますね!
今はこういう動きって決めてはいるものの、
変更する可能性を考えるとバラバラで管理が良いかなーって思ってました。

今は4パターンの動きだから行数多くないけど、
もし10パターンとかになったらとんでもないことになりますが、
そのときになったら「配列」「まとめる」等とかで解決しようかと思います。


>>まあ変にまとめても可読性が下がるだけかもしれませんが。
それも懸念してました。
変数名で数値を代入していない箇所があることから察したかもしれませんが、
見やすさやわかりやすさを重視しました。


けれどまとめることが苦手なわたしにとって助かりました!



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