| 
 | 
 
								
									|  |  
 
 
 
 |  | 
2022/7/12(Tue) 16:19:03|NO.96789 
このプログラムで実行すると、判定のキーを押すと、次の判定が消えます。どこが原因か分からないので全て載せます。
 どうか教えてください。お願いします。
 #include "a2d.hsp"
 #uselib"user32.dll"
 #func eve "SetTimer" int,int,int,int
 #func mahu "KillTimer" int,int
 alCreateImageByFile 0,"画像のファイルパス"
 alCreateImageByFile 1,"画像のファイルパス"
 alCreateImageByFile 2,"画像のファイルパス"
 alCreateImageByFile 3,"画像のファイルパス"
 hanteimin=0
 hanteimax=200
 eve hwnd,1,1000,0
 oncmd *eee,0x113
 mci "open 音楽のファイルパス"
 if stat =-1:dialog stat ;バグがあるか、調べる
 mci  "open 効果音のファイルパス"
 *www
 goto *rrr
 *eee
 mci "play音楽のファイルパス"
 mahu hwnd,1
 *rrr
 
 repeat
 
 w=w+1;D
 w1=w1+1
 x=x+1 ;F
 y=y+1 ;J
 z=z+1 ;K
 color 0,0,0
 
 line hanteimin,0,hanteimin,480
 line hanteimax,0,hanteimax,480
 line hantaimax,0,hantaimax,500
 line 0,-1,hanteimax,-1
 mes "                    D"
 line 0,120,hanteimax,120
 mes "                    F"
 line 0,240,hanteimax,240
 mes "                    J"
 line 0,360,hanteimax,360
 mes "                    K"
 ;color 0,0,0
 alStretchImageToScreen 0,0,0,0,496,330,630-w,-10,210,140 ;D
 alStretchImageToScreen 0,0,0,0,496,330,900-w1,-10,210,140 ;D
 alStretchImageToScreen 1,0,0,0,496,330,1300-x,113,210,140 ;F
 alStretchImageToScreen 2,0,0,0,496,330,630-y,232,210,140 ;J
 alStretchImageToScreen 3,0,0,0,496,330,1300-z,353,210,140 ;K
 
 
 redraw 1
 redraw 0
 color 255,255,255
 boxf
 await 3
 getkey a,68 ;d
 if a=1:if w>=640-hanteimax : if w<=640-hanteimin:w=w+4444:gosub *score
 getkey a1,68
 if a1=1:if w1>=640-hanteimax : if w1<=640-hanteimin:w1=w1+4444:gosub *score
 getkey b,70 ;f
 if b=1:if x>=640-hanteimax : if x<=640-hanteimin:x=x+4444:gosub *score
 getkey c,74 ;j
 if c=1:if y>=640-hanteimax : if y<=640-hanteimin:y=y+4444:gosub *score
 getkey d,75 ;k
 if d=1:if z>=640-hanteimax : if z<=640-hanteimin:z=z+4444:gosub *score
 
 loop
 
 
 *score
 mci "play 効果音のファイルパス"
 ;dialog "a="+str(a)+"b="+str(b)+"\nx="+str(x)
 gosub *ttt
 return
 
 *ttt
 return
 
 
|  
 |  | 
 
 
 
 |  | 
2022/7/12(Tue) 16:52:41|NO.96791 
ファイルが無いので試せませんが、とりあえず「おや?」と思った部分。 if a=1:if w>=640-hanteimax : if w<=640-hanteimin:w=w+4444:gosub *score
 
hanteimaxが200、hanteiminが0ということは、 
wが440〜640の範囲内でないと操作を受け付けないことになりますが、 
「w=w+4444」で思いっきりこの範囲からはみ出してしまうわけですから、 
だから以降は操作を受け付けなくなるのでは…とは感じました。 
(これは以降のw1とかxとかyとかzも同様)
 
ループのたびにwやその他を1ずつ増やしているということは、 
「タイミング良くボタンを押せば得点になる」という 
音ゲーのようなものを想定しているのでしょうか? 
どこかでこれらの値を0などにリセットする処理が必要でしょう。
 | 
 
 
 |  | 
2022/7/12(Tue) 18:00:24|NO.96792 
判定のところが間違っているように思います。 
w,w1,x,y,zの部分は初期化されていないので初期値は0 
全てループが1周するごとに値が1増えるので、全て値は同じです。 
なので、判定が if z>=640-hanteimax : if z<=640-hanteimin で同じだと全て同じタイミングでしか判定が成功しません。 
今は出先なので詳しいスクリプトは後で上げますが、ここを座標で判定したほうが良いと思います
 | 
 
 
 |  | 
2022/7/12(Tue) 19:30:56|NO.96794 
>THE 初心者 さん
スクリプト拝見しました。 
音ゲーのノーツをキー判定するスクリプトのように見受けられます。
>このプログラムで実行すると、判定のキーを押すと、次の判定が消えます。 
質問で言われております「判定キー」とは「D」キー、 
「次の判定」とは「画像ID=0の2番目の表示」として解答させて頂きます。
 
次の判定が消える問題について
 
・どちらも判定キーが「D」キーであること(aもa1も同時に入力(=1)される) 
 入力キーが異なれば同時には消えることはありません。 
 getkey a,68 ;d 
 getkey a1,68・・・a1のキーを異なるキーID(67など)にする
 
・表示横位置(630-wと900-w1)は異なるが、内部値(wとw1)は同じであること 
 w1の横位置が右にズレているだけで、内部判定は同じタイミングに行われます。
 
 alStretchImageToScreen 0,0,0,0,496,330,630-w,-10,210,140 ;D 
 alStretchImageToScreen 0,0,0,0,496,330,900-w1,-10,210,140 ;D
 
 開始のw1を-270として表示位置を同じ(630-w1)にするとどうなりますか?
 
・表示横位置を直接指定ではなく、内部値で調整する 
 630-w、900-w1、1300-x などで位置を変えておりますが 
 内部値で対応することで改善されるはず。
 ;スクリプトの先頭に追加
w=0 ;D
w1=-270 ;D
x=-670 ;F
y=0 ;J
z=-670 ;K
:
:
;表示横位置をすべて630を起点にする
alStretchImageToScreen 0,0,0,0,496,330,630-w,-10,210,140 ;D
alStretchImageToScreen 0,0,0,0,496,330,630-w1,-10,210,140 ;D
alStretchImageToScreen 1,0,0,0,496,330,630-x,113,210,140 ;F
alStretchImageToScreen 2,0,0,0,496,330,630-y,232,210,140 ;J
alStretchImageToScreen 3,0,0,0,496,330,630-z,353,210,140 ;K
 
簡単ですみませんが、ご確認願います。
 
|  
 |  | 
 
 
 |  | 
2022/7/12(Tue) 20:54:11|NO.96795 
hanteimin=0
	hanteimax=200
	screen 0
	buffer 1
	color 0,0,0
	line hanteimin,0,hanteimin,480
	line hanteimax,0,hanteimax,480
	line hantaimax,0,hantaimax,480
	mes " D"
	line 0,120,hanteimax,120
	mes " F"
	line 0,240,hanteimax,240
	mes " J"
	line 0,360,hanteimax,360
	mes " K"
	gsel 0
	repeat
		w=w+1;D
		w1=w1+1
		x=x+1 ;F
		y=y+1 ;J
		z=z+1 ;K
		circle 630-w,0,680-w,50 ;D
		circle 900-w1,0,950-w1,50 ;D
		circle 1300-x,123,1350-x,173 ;F
		circle 630-y,240,680-y,290 ;J
		circle 1300-z,360,1350-z,410;K
		redraw 1
		await 3
		redraw 0
		gcopy 1,0,0,640,480
		getkey a,68 ;d
		if a=1:if hanteimin<=630-w and 630-w<=hanteimax:w=w+4444
		getkey a1,68
		if a1=1:if hanteimin<=900-w1 and 900-w1<=hanteimax:w1=w1+4444
		getkey b,70 ;f
		if b=1:if 1300-x>=hanteimin and 1350-x<=hanteimax:x=x+4444
		getkey c,74 ;j
		if c=1:if hanteimin<=630-y and 630-y<=hanteimax:y=y+4444
		getkey d,75 ;k
		if d=1:if hanteimin<=1300-z and 1300-z<=hanteimax:z=z+4444
	
	loop
 
とりあえず円を動かし、hanteimax〜hanteiminの間に入ったときにタイミングよく対応したキーを押すと 
円が向こう側へと飛んでいくプログラムを作成しました。
 
ただ、もしノーツの再利用などをしない予定などであれば、判定成功、もしくはhanteiminを超えたところで動かすための変数の値の変化を止めた方が良いと思います。
 
|  
 |  | 
 
 
 |  | 
2022/7/14(Thu) 16:04:36|NO.96804 
たくさんのアドバイス、ありがとうございます。おかげで、解決しました。
 
 | 
 
 
 |