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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0724
Magnoliaバグ?を見つけてください9解決


Magnolia

リンク

2019/7/24(Wed) 23:52:07|NO.87929

サイトを見ながら書いたものに手を加え、スタート画面なるものを超簡易的に作った
のですが、バグったのかメインの機構がおかしなことになってしまいました。
いろいろ模索したのですが原因がわからず困っています。どなたかエラーを見つけてください。
以下ソースです。

wx=800:wy=600
screen 0,wx,wy

button "START",*main
stop

mx=400:my=300
msp=4
ms=20
ex=50:ey=50

frame=0
*main
  cls
  repeat

title "追いかけっこ["+frame+"]"

stick key,15
if key&1 : mx=limit( mx-msp, 0, wx ) ; 左移動
if key&4 : mx=limit( mx+msp, 0, wx ) ; 右移動
if key&2 : my=limit( my-msp, 0, wy ) ; 上移動
if key&8 : my=limit( my+msp, 0, wy ) ; 下移動

dist=abs(ex-mx)+abs(ey-my)
if dist<(ms*2) : goto *gameover

ex=alien(ex,mx)
ey=alien(ey,my)

redraw 0
color 0,0,64:boxf
color 0,255,255
circle mx-ms,my-ms,mx+ms,my+ms
color 255,0,0
circle ex-ms,ey-ms,ex+ms,ey+ms

redraw 1
await 1000/60
frame++
loop

*gameover
font msgothic,120
color 255,255,255:pos 50,50
mes "つかまった!"
stop

#defcfunc alien int value, int value2
esp=2
res=limit( value2-value, -esp, esp )
return value+res



改変したのが4.5.14.15.41行目になります。



この記事に返信する


Magnolia

リンク

2019/7/25(Thu) 01:06:46|NO.87930

情報不足な気がするので追記です。わかるかもしれませんがこのゲームは迫ってくる円から逃げる、
というものです。そしてバグというのはその肝心の円が出てこず、青いウィンドウがそこにある
だけという塩梅です。スコアとしてつけているカウンターはしっかり動いているのに、ゲームが
動作してない、といった感じです。お手数かもしれませんがソースを実行してみるとわかると思います。



あり

リンク

2019/7/25(Thu) 05:51:54|NO.87931

単純なケアレスミスです。

buttonの直後にstopがあるのでその後の変数初期化ができていません。


こういったミスを少なくするためにもデバッグウィンドウ等で
変数の内容を確認する癖をつけておきましょう。
http://www.onionsoft.net/hsp/v35/doclib/hspprog.htm#DEBUG_WINDOW



Magnolia

リンク

2019/7/25(Thu) 13:17:04|NO.87933

まだ始めたばかりでデバッグウィンドウの見方が違うかもしれませんが「変数」のところを
押してそれぞれの設定?を見たときに、「内容」のところに書かれている数字がスクリプトに
書いてある数字と違うということでいうことですか?私の場合0となっていましたが
これが初期化できてないということですか?



ソラ

リンク

2019/7/25(Thu) 14:45:47|NO.87934

そういうことですね。
ありさんの言うように、buttonの後にstopが入ってるので、そこで止まります。
ボタンをクリックして*mainに移動しても、

mx=400:my=300 msp=4 ms=20 ex=50:ey=50 frame=0
この範囲が実行されることは無いので、mx、my、msp、ms、ex、eyの値は全て0となります。
(frameは実行されてもされなくても0)



ソラ

リンク

2019/7/25(Thu) 14:51:51|NO.87935

修正するとしたらこんな感じでしょうか。

#module;モジュールにするのが一般的。変数が被らなくなるので不要なバグを防げます。 #defcfunc alien int value, int value2 esp=2 res=limit( value2-value, -esp, esp ) return value+res #global wx=800:wy=600 ;これを最初の方に持ってくる。 mx=400:my=300 msp=4 ms=20 ex=50:ey=50 frame=0 screen 0,wx,wy button "START",*main stop *main cls repeat title "追いかけっこ["+frame+"]" stick key,15 if key&1 : mx=limit( mx-msp, 0, wx ) ; 左移動 if key&4 : mx=limit( mx+msp, 0, wx ) ; 右移動 if key&2 : my=limit( my-msp, 0, wy ) ; 上移動 if key&8 : my=limit( my+msp, 0, wy ) ; 下移動 dist=abs(ex-mx)+abs(ey-my) if dist<(ms*2) :break; goto *gameover;gotoで抜けるとネストが深くなるのでbreak推奨 ex=alien(ex,mx) ey=alien(ey,my) redraw 0 color 0,0,64:boxf color 0,255,255 circle mx-ms,my-ms,mx+ms,my+ms color 255,0,0 circle ex-ms,ey-ms,ex+ms,ey+ms redraw 1 await 1000/60 frame++ loop *gameover;breakで抜けているので本来は不要。 font msgothic,120 color 255,255,255:pos 50,50 mes "つかまった!" stop



M

リンク

2019/7/25(Thu) 21:45:14|NO.87938

細かいですが
・斜め移動すると高速化する(敵も)
・敵の角度が45°単位 これは三角関数を使うといいかも

関係ないですが慣性があると楽しいかも



Magnolia

リンク

2019/7/27(Sat) 01:19:35|NO.87954

皆さんありがとうございます。おかげ様でしっかり動くようにになりました。
最後に質問なのですが、どういうものを「#module」にするのでしょうか?
変数全部それで囲っていいんですか?



ソラ

リンク

2019/7/27(Sat) 17:06:50|NO.87959

モジュールの詳しい解説は以下のページがわかりやすいかと思います。
http://www.onionsoft.net/hsp/v33/doclib/module.htm



Magnolia

リンク

2019/7/27(Sat) 20:37:22|NO.87960

ありがとうございました。



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