ここから本文です

HSPプログラムについて。 xの値(サークルのx座標)が20以下になった時にクリ...

kim********さん

2013/8/723:06:05

HSPプログラムについて。
xの値(サークルのx座標)が20以下になった時にクリックすると、スコアがプラスされて、次に移るようなプログラムを書いてるのですが。一画面に2つサークルを表示させると、

メッセージ(良)が、大量に表示されスコアが増え続けると言うバグが起きてしまいます。
ソースを載せますのでどうか、ご指導お願いします。。。

z=450
y=145
c=480
d=145
sizex=-30
sizey=30
a=0
b=0
screen 320,480
pos 160,280:color 0,0,0:mes"Click HERE!!!
*start
stick x
if x=256:goto *hazime
await
goto *start

*hazime
cls
objsize 100,30,0
button"カービィのエアライド",*kyoku1
stop
*kyoku1
cls
pos 0,140
celput 1
pos 0,140
celput 3
wait 100
mmplay 1
*a3
z=450
y=145
sizex=-30
sizey=30
a=a+200
b+1
pos 10,30
mes"良"
wait 20
goto *a33
*a3333
z=450
y=145
sizex=-30
sizey=30
b+1
pos 10,30
mes"不可"
wait 20
goto *a33
*a33
cls
pos 0,140
celput 1
pos 0,140
celput 3
pos 0,0
mes"スコア" +a
color 0,0,0:circle z,y,z+sizex,y+sizey,1
z=z-10
stick x
if z<20 and x=256:mmplay 2:mes"良":wait 20:goto *a4
if z<0:goto *a444
wait 5
goto*a33


*a4
z=450
y=145
sizex=-30
sizey=30
a=a+200
b+1
goto *a44
*a444
z=450
y=145
sizex=-30
sizey=30
b+1
pos 10,30
mes"不可"
wait 20
goto *a44
*a44
cls
pos 0,140
celput 1
pos 0,140
celput 3
pos 0,0
mes"スコア" +a
color 0,0,0:circle z,y,z+sizex,y+sizey,1
color 0,0,0:circle c,d,c+sizex,

文字数の都合でかなり省略しています
ちなみにmmplayはmmplayを都合で省略しているだけなので問題ありません。

閲覧数:
157
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

fug********さん

編集あり2013/8/805:03:24

/*
if z<20 and x=256 :
X座標が20以下の時に「良」判定さます。
if z>=0 and z<20 and x=256 :
などで対処して下さい。(判定シビアすぎるけどw)

手抜きサンプル
*/
randomize
dim x,10 :dim y,10

xx=450
repeat 10
x(cnt)=xx+rnd(100)+80 :y(cnt)=rnd(300)+60
xx=x(cnt)
loop

*メインループ
color 255,255,255 :boxf 0,0,800,30 :color 0,0,0
pos 0,0 :mes"スコア" +a
color 255,255,255 :boxf 0,60,800,600:color 0,0,0
repeat 10
circle x(cnt),y(cnt),x(cnt)+30,y(cnt)+30,1
x(cnt)=x(cnt)-10
if x(cnt)<-50 and x(cnt)>=-60 :b=b+1
if b=10 :goto *終了
loop
stick st
if pena>0 :pena=pena-1
if pena=0 :color 255,255,255 :boxf 0,30,640,60 :color 0,0,0
if pena=0 and st=256 :gosub *判定
wait 5
goto*メインループ

*判定
ok=0
color 255,255,255 :boxf 0,30,640,60 :color 0,0,0
repeat 10
if x(cnt)<60 and x(cnt)>=0 :ok=1
loop
if ok=1 :pos 10,30 :mes"良" :pena=6:a=a+200
if ok=0 :pos 10,30 :mes"不可" :pena=6
return

*終了
color 255,255,255 :boxf 0,30,800,600 :color 0,0,0
stop

質問した人からのコメント

2013/8/14 13:18:32

降参 ありがとうございました

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

Humiさん

2013/8/902:48:50

/*
>文字数の都合でかなり省略しています
……*a44以降が次の処理かな?
じゃなかったらわからんね
今の状態だと繰返しにならんのだが……

上の人に追加するなら
・変数とラベルはできるだけ関係性の深いものにする
・できるだけコメントを入れていく
とバグが少なくなるしあったときにも対処しやすいです。

おなじ処理、*a3,*a3333,冒頭,*a4,*a444 の最初の部分とか
これだけでも5回同じものを書いているので
gotoするんでもおなじ場所にまとめるとかいっそgosubにするとか
処理は円の中心からの距離を求めてx20以下の時にクリックされたらスコアをプラスすれば
いいでしょう
あと変数などでクリックされたらもうクリックできないようにしたらいいでしょう
*/

randomize
max = 15
sizex = 50 :sizey = 50
hsx = sizex/2 :hsy = sizey/2
dim cir, max
ddim cirpt, 15, 2
linex = 20
waittime = 0
add = 0
score = 0

*main

gosub *calc
gosub *draw

wait 1
goto *main

*calc
if waittime == 0 :add = 0 :waittime = 50+rnd(100) :else :waittime--
stick@hsp key
repeat max
if cir.cnt == 0 {
if add == 0 {
add = 1
cir.cnt = 1
cirpt(cnt, 0) = 640.0
cirpt(cnt, 1) = 0.0+rnd(480)
}
}else {
if cir.cnt == 1 {
if cirpt(cnt, 0) < linex+sizex :if key & 256 {
// ここで円の中心との距離求めてる
r = sqrt(powf(abs(mousex-cirpt(cnt, 0)), 2)+powf(abs(mousey-cirpt(cnt, 1)), 2))
// 判定
if r < hsx :cir.cnt = 2 :score += 200 :else :if r < sizex :cir.cnt = 3
}
}
cirpt(cnt, 0) -= 2.0
if cirpt(cnt, 0) < -linex :cir.cnt = 0
}
loop

return

*draw
redraw 0
color 255, 255, 255 :boxf :color
line linex, 0, linex, ginfo(13)
pos 5, 5 :mes "スコア "+score
repeat max
if cir.cnt {
circle cirpt(cnt, 0)-hsx, cirpt(cnt, 1)-hsy, cirpt(cnt, 0)+hsx, cirpt(cnt, 1)+hsy, 0
if cir.cnt == 2 :pos cirpt(cnt, 0)-8, cirpt(cnt, 1) :mes "良"
if cir.cnt == 3 :pos cirpt(cnt, 0)-16, cirpt(cnt, 1) :mes "不可"
}
loop
redraw 1
return

2013/8/807:28:05

「かなり省略」というか、質問に書いてあるだけでは症状が再現出来ないのだけれど、とりあえず

同じような処理が何箇所もあって構造的に間延びしてしまい、gotoでプログラムの流れを作っているので読みにくくなっています。(まぁ、それが出来るのはある意味HSPの利点なのですが)

全体としてやりたいことが見えないのですが、プログラムを読む立場からいうと
・似たような処理は出来るだけまとめる。違う部分だけ括り出す。
・処理の流れを図にでも書いて整理してみる
必要があるように思います。

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる