|
|
|
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
たくさんのアドバイス、ありがとうございます。
おかげで、解決しました。
|
|