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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0712
THE 初心者判定が消える。5解決


THE 初心者

リンク

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
で同じだと全て同じタイミングでしか判定が成功しません。
今は出先なので詳しいスクリプトは後で上げますが、ここを座標で判定したほうが良いと思います



zezenana

リンク

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を超えたところで動かすための変数の値の変化を止めた方が良いと思います。



THE初心者

リンク

2022/7/14(Thu) 16:04:36|NO.96804

たくさんのアドバイス、ありがとうございます。
おかげで、解決しました。



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