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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0411
gmblock3.hspの内容について4解決


gm

リンク

2010/4/11(Sun) 23:46:43|NO.31941

C:\Program Files\hsp32\sample\game\block3.hspの(45行目)と(58行目)の
bk = 1はここで指定しないと絶対ダメなんですか?
なんかここで指定するって奇妙な気がしたんですよ。
だから両方をコメントにして、(62行目)の次で指定したら
普通に動作したような気がしました。
また、(63行目)と(64行目)ってここで値を決めて何か意味があるんですか?
どこにも使われていないような気がしました。
コメントにしたら普通に動作したような気がしました。
何か見落としていますか?


(45行目) if bly<=y1 : bly=y1 : bpy=-bpy : bk=1

(58行目) bk=1

(62行目); ブロックの処理
(63行目) colx=blx+blsize
(64行目) coly=bly+blsize



この記事に返信する


テック

リンク

2010/4/12(Mon) 01:09:34|NO.31942

>bk = 1はここで指定しないと絶対ダメなんですか?
>だから両方をコメントにして、(62行目)の次で指定したら
block3.hspの85行目から89行目にかけて
(gmさんとは、微妙に行数が異なっているかもしれませんが)
(私のHSPのバージョンは、3.2.1です)


if (i>=mblsize)&(i<colx)&(j>=mblsize)&(j<coly)&(bk) { wall(cx,cy)=1 bpy=-bpy bk=0 }
となっており、if文の条件の最後にbkを使用しています。
45行目のif文は、おそらくブロックとボールが当たったときの処理だと思われますが、
そこをコメントにして、(62行目)の次で指定したら、
if文の外だから、ブロックとボールが当たったとき以外でも、
ブロックが消えると思います。

>また、(63行目)と(64行目)ってここで値を決めて何か意味があるんですか?
colxとcolyについても、85行目から89行目にかけてのif文で使用しています。



gm

リンク

2010/4/12(Mon) 01:57:29|NO.31944

3.2.1のファイルを見てました。3.2から少し変更されてました。
3.2.1からの引用です。


; ボール : Y方向の移動 bly=bly+bpy if bly<=y1 : bly=y1 : bpy=blspd : bk=1 : blspd=16 <--------(A) if bly>=(y2-blsize) : goto *gameover ; ボールとバーがぶつかったかどうか調べます coly=bly+blsize if (coly>=bary)&(bly<(bary+16)) { ; ボールY座標のチェック ; ボールX座標のチェック colx=blx+blhalf x=barx+barhalf if abs(colx-x)<(barhalf+blhalf) { bly=bary-blsize : bpy=-blspd i=(colx-x)/4 if i!=0 : bpx=i bk=1 <----------------------------------(B) if clrflag { dim wall,wsx,wsy ; ブロックを復活させる clrflag=0 } } } bk = 0 ; ブロックの処理 <-------------------------------- (C) colx=wpx+bsize coly=wpy+bsize
ボールが跳ね返るのは画面の上端とバーに当たったときだから、
それ以外はゲームオーバー。
つまり、sampleはわかりやすくそこの位置(A),(B)で指定してて、
ゲームオーバー意外は必ず(C)の位置にくるから(C)で指定しても
構わないって考えていいんですよね? まだ勘違いですか?


>また、(63行目)と(64行目)ってここで値を決めて何か意味があるんですか?
>colxとcolyについても、85行目から89行目にかけてのif文で使用しています。

これ3.2.1で使われていますね。
ありがとうございました。



テック

リンク

2010/4/12(Mon) 19:26:06|NO.31951

>ゲームオーバー意外は必ず(C)の位置にくるから(C)で指定しても
>構わないって考えていいんですよね? まだ勘違いですか?

gmさんのスクリプトでは、
; ブロックの処理
の直前に
bk = 0
がありますが、サンプルのソースではありませんでした。
これは、gmさんが追加したと言うことでいいですか?

以下、無修正のサンプルスクリプト。

; ; ブロック崩し(3) ; (ボール・バー・ブロック表示します) ; x1=0:y1=0 ; 画面左上の座標 x2=480:y2=640 ; 画面右下の座標 clrflag=0 ; クリアフラグ blsize=16 ; ボールのサイズ blspd=10 ; ボールのスピード blx=240:bly=300 ; ボールの座標 bpx=4:bpy=4 ; XY方向のボール座標加算値 bk=0 ; ブロックを崩すフラグ(1=崩す) mblsize=-blsize barsize=64 ; バーのサイズ barx=240:bary=540 ; バーの座標 barhalf=barsize/2 blhalf=blsize/2 wx=0:wy=100 ; ブロックの表示開始位置(左上) wsx=15:wsy=8 ; ブロックの配置数(X,Y) wpx=x2/wsx:wpy=16 ; ブロック1個あたりのサイズ dim wall,wsx,wsy ; ブロックを表示するフラグ ; 0=表示、1=表示しない screen 0,x2,y2 title "ブロック崩し" cls 4 *main redraw 0 gradf 0,0,x2,y2,1,0,128 ; 画面クリア ; バー : マウス座標から位置を決定 barx=mousex-barsize/2 color 255,255,255 boxf barx,bary,barx+barsize,bary+16 ; ボール : X方向の移動 blx=blx+bpx if blx<=x1 : blx=x1 : bpx=-bpx if blx>=(x2-blsize) : blx=x2-blsize : bpx=-bpx ; ボール : Y方向の移動 bly=bly+bpy if bly<=y1 : bly=y1 : bpy=blspd : bk=1 : blspd=16 if bly>=(y2-blsize) : goto *gameover ; ボールとバーがぶつかったかどうか調べます coly=bly+blsize if (coly>=bary)&(bly<(bary+16)) { ; ボールY座標のチェック ; ボールX座標のチェック colx=blx+blhalf x=barx+barhalf if abs(colx-x)<(barhalf+blhalf) { bly=bary-blsize : bpy=-blspd i=(colx-x)/4 if i!=0 : bpx=i bk=1 if clrflag { dim wall,wsx,wsy ; ブロックを復活させる clrflag=0 } } } ; ブロックの処理 colx=wpx+bsize coly=wpy+bsize left=0 repeat wsy cy=cnt y=cnt*wpy+wy hsvcolor cnt*10,255,255 repeat wsx cx=cnt x=cnt*wpx+wx if wall(cx,cy)=0 { ; ブロックを表示 left++ boxf x,y,x+wpx-2,y+wpy-2 i=blx-x:j=bly-y if (i>=mblsize)&(i<colx)&(j>=mblsize)&(j<coly)&(bk) { wall(cx,cy)=1 bpy=-bpy bk=0 } } loop loop ; ボールを表示 pos blx,bly:color 255,255,255 font msgothic,blsize mes "●" redraw 1 await 16 if left=0 : clrflag=1 goto *main *gameover objsize 180,32 pos 150,330:button "終わり",*owari stop *owari end

で、元のサンプルスクリプトでは、
bkが1になるのは、ボールが画面上部に接触した場合か、バーに接触した場合です。
次にbkが0になるのは、ボールがブロックに接触した場合です。
つまり、ボールが画面上部 または バーに接触するまで、
複数回ブロックに接触した場合、壊れるのは、
最初に接触したブロックだけということです。

では、(C)にbk=1を追加した場合、
ボールが画面上部 または、バーに接触する しないにかかわらず、
必ず通るので、bkは1となります。
つまり、ボールが画面上部 または バーに接触するまで、
複数回ブロックに接触した場合、
接触したブロック全て壊れると言うことです。
これは、私自身(C)の位置にbk=1を追加して確認しました。

質問の意味が、(C)の位置で指定しても、
元のスクリプトと同じ動作になるということであれば、
間違いですし、勘違いと言うことになります。

複数回ブロックに接触した場合、
接触したブロック全て壊れると言う仕様にしたければ、
(C)の位置で指定するよりも、85行目のif文の条件から
bkを外したほうがいいと思います。

以上、聞きたがっていたことが違っていたらすみません。



gm

リンク

2010/4/12(Mon) 20:07:33|NO.31952

>bk = 0がありますが、サンプルのソースではありませんでした。
>これは、gmさんが追加したと言うことでいいですか?

すいません。これ実験してたから気づかなかったです。
追加したものです。

詳しい説明で大変よくわかりました。
ありがとうございました。



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