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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0618
roum180敵の移動について8解決


roum180

リンク

2012/6/18(Mon) 04:51:50|NO.47304

今、敵をランダムな位置に動かすスクリプトを作っているのですが、
どうしてもきれいに動いてくれません。
どうしてでしょうか?わかる方、修正をお願いします。



ex=200 ey=50 *main redraw 0 pos ex-8,ey-8 mes "■" if move=0 : emove=rnd(20)//確率を設定 if emove=0: emove=-1 :move=1: emovex=rnd(400) : emovey=rnd(100) : emx=emovex-ex :emy=emovey-ey//きちんと移動してくれることを祈るばかり。 if move=1{ if emx<=20 : emx-2 : ex+2 if emx<=-20 : emx+2 : ex-2 if emx>20 : if emx<=50 : emx-3 : ex+3 if emx>-20 : if emx<=-50 : emx+3 : ex-3 if emx>50 : emx-4 : ex+4 if emx>-50 : emx+4 : ex-4 if emy<=20 : emy-2 : ey+2 if emy<=-20 : emy+2 : ey-2 if emy>20 : if emy<=50 : emy-3 : ey+3 if emy>-20 : if emy<=-50 : emy+3 : ey-3 if emy>50 : emy-4 : ey+4 if emy>-50 : emy+4 : ey-4 if emx<3|emx>-3 : move=0 : emove=-1 if emy<3|emy>-3 : move=0 : emove=-1 if ex>400 : ex=400 if ey>100 : ey=100 if ex<0 : ex=0 if ey<0 : ey=0 } redraw 1 await 16 gosub*main



この記事に返信する


あり

リンク

2012/6/18(Mon) 09:50:44|NO.47306

きれいに動かすといってもそのイメージを回答者側は持っていないので
どう動かしたいのかを説明してもらえますか。

必要な情報は
・どういう条件で
・どのように移動するのか
という事です。



玄冬

リンク

2012/6/18(Mon) 12:06:34|NO.47307

具体的にどう動かしたいのかはあり様の仰る通り書いて頂かなければわかりませんが
貼られたスクリプトで気になることが3点あります。

1)*main中に画面のリセットがないので前の画面が残ったままです。
 redarw 0の行の次にcolor 255,255,255:boxf等を入れる必要があるかと思われます。
2)最後の行がgosub*mainなのでネストが深くなりエラーが出ます。goto*mainではないでしょうか?
3)条件式にありえないものが含まれている。

[1]20以下のとき [2]-20以下のとき [3]20〜50のとき [4]-20より大きく、-50より小さいとき [5]50より大きいとき [6]-50より大きいとき
emxもemyも同様に上の6パターンで条件分岐させていますが[4]はありえないです。
上の6パターンを大きい順に並べ直すと

[5]50より大きいとき [3]20〜50のとき [1]20以下のとき [2]-20以下のとき [4]-20より大きく、-50より小さいとき [6]-50より大きいとき
なので

[5]50より大きいとき [3]20〜50のとき [1]20以下のとき [2]-20以上のとき [4]-20〜-50のとき [6]-50より小さいとき
の誤記かと思われますが
この場合でも、[1]と[2]に上限・下限が設定されていないので範囲が重複してしまっています。

[5]50より大きいとき [3]20〜50のとき [1]20〜0のとき [2]0〜-20のとき [4]-20〜-50のとき [6]-50より小さいとき
でしょうか?

このような数式の範囲を条件式で書く時は、以下の3点のポイントをおさえておくと見直しやすくなりますよ

・大きい順や小さい順に並べて書く ・<や>はどちらか1つに統一する ・0〜10など両端を押さえる場合、if 0 < a : if a < 10とするより、&を使って if 0 < a & a < 10 とする



roum180

リンク

2012/6/18(Mon) 17:43:52|NO.47308

>>玄冬さん
すいませんミスでした。
修正したら全方向にランダムに移動するようになりました。

>>ありさん
開始条件

・変数moveが0のときに実行されるところで、  変数emoveが0になったとき、移動を開始する
移動の仕方
・移動開始後、
 emovex=rnd(400) : emovey=rnd(100)  で出てきたランダムな数から敵機の座標を引いて、  出てきた数値分移動

移動はできる限り滑らかにしたいのですが、
どうしてもカクカクした動きになってしまい、
しかも、大きく動いてくれません。



kino

リンク

2012/6/18(Mon) 21:07:23|NO.47309

>移動はできる限り滑らかにしたいのですが、
>どうしてもカクカクした動きになってしまい、
>しかも、大きく動いてくれません。

どういう風に動けば理想的なのかは
よくわからないので憶測で書いてみました
あと確率が20だとなかなか動かないので2にしました

ex=200 ey=50 *main redraw 0 color 255,255,255 boxf color 0,0,0 pos ex-8,ey-8 mes "■" if move=0 : emove=rnd(2)//確率を設定 if emove=0: emove=-1 : move=1: emovex=rnd(400) : emovey=rnd(100) : emx=emovex-ex :emy=emovey-ey//きちんと移動してくれることを祈るばかり。 if move=1{ if emx>50 : emx-4 : ex+4 if emx>20 & emx<=50 : emx-3 : ex+3 if emx>0 & emx<=20 : emx-2 : ex+2 if emx>-20 & emx<=0 : emx+2 : ex-2 if emx>-50 & emx<=-20 : emx+3 : ex-3 if emx<-50 : emx+4 : ex-4 if emy>50 : emy-4 : ey+4 if emy>20 & emy<=50 : emy-3 : ey+3 if emy>0 & emy<=20 : emy-2 : ey+2 if emy>-20 & emy<=0 : emy+2 : ey-2 if emy>-50 & emy<=-20 : emy+3 : ey-3 if emy<-50 : emy+4 : ey-4 if emx<3 | emx>-3 : move=0 : emove=-1 if emy<3 | emy>-3 : move=0 : emove=-1 if ex>400 : ex=400 if ey>100 : ey=100 if ex<0 : ex=0 if ey<0 : ey=0 } redraw 1 await 16 goto *main



kino

リンク

2012/6/18(Mon) 21:19:19|NO.47310

すいません以下の
 if emx<3 | emx>-3 : move=0 : emove=-1
 if emy<3 | emy>-3 : move=0 : emove=-1

 if emx<3 & emx>-3 : move=0 : emove=-1
 if emy<3 & emy>-3 : move=0 : emove=-1
に変更したら
まったく違った動きになることに今気づきました!

あと emx<-50 と emy<-50 の部分は<= ですね(^^;

申し訳ございませんでした



Makoto

リンク

2012/6/19(Tue) 14:26:55|NO.47317

移動が滑らかというのは、速度の変化を滑らかにしたいということでしょうか。
それならば、移動速度を割り算を使って実数にする方法もあります。


ex=200 ey=50 randomize *main redraw 0 color 255,255,255 boxf color 0,0,0 pos ex-8,ey-8 mes "■" pos 0,100:mes "ex:" + ex + " ey:" + ey //デバッグ用 pos 0,116:mes "emovex:" + emovex + " emovey:" + emovey pos 0,132:mes "emx:"+emx +" emy:"+emy if move=0 : emove=rnd(20)//確率を設定 if emove=0 : emove=-1 : move=1 : emovex=rnd(400) : emovey=rnd(100) if move=1{ emx = (0.0 + emovex - ex) / 20 //割る数の大きさで移動速度が変化 emy = (0.0 + emovey - ey) / 20 ex = 0.0 + ex + emx ey = 0.0 + ey + emy if emx > -0.5 and emx < 0.5 and emy > -0.5 and emy < 0.5 { //どこまで精密に動かすか move=0 emove=-1 } if ex>400 : ex=400 if ey>100 : ey=100 if ex<0 : ex=0 if ey<0 : ey=0 } redraw 1 await 16 goto *main

emx/emyを代入している行の割る数を変えると移動速度が変わります。
毎ループ計算し直していますが、これによって変化が滑らかになります。
また、ちょっとだけプログラムがすっきりします。

移動終了判定の数値を変えると、emovex/emoveyの値にどこまで近づくかが変わります。
あまり小さくすると、なかなか移動が終了しなくなります。

それから元のプログラムでは、X座標かY座標どちらかが終了の条件を満たした時点で
移動が終わってしまっているので、両方が条件を満たしてから終了するようにした方が良いのではないでしょうか。

ついでに、終了条件の式は以下のように書くこともできます。

if absf(emx) < 0.5 and absf(emy) < 0.5 { //どこまで精密に動かすか



7909ppr

リンク

2012/6/19(Tue) 15:05:13|NO.47318

(dim)などをマスターすればなんとか想像が分かるはず・・・

わかっていればごめんなさい。



roum180

リンク

2012/6/19(Tue) 16:38:00|NO.47319

>>Makotoさん
まさしくそれです!ありがとうございます!
ぬるぬるうごく!

kinoさん、7909pprさんも回答ありがとうございます!

みなさんごきょうりょくありがとうごzぁいました!



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