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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0621
run2音ゲー判定表示について7解決


run2

リンク

2014/6/21(Sat) 09:42:06|NO.62516

#include "d3m.hsp" //タイマーだけ利用(timeGetTimeを使用してるだけだから精度は良くない)
#define winx 100
#define winy 0
#define mm 8 ;間隔
#define xcls0 color 0, 0, 0 : boxf 0, 2000, winx * mm - 1, winy * mm - 1
#define xcls1 color 0, 30, 50 : boxf winx * mm, 0
dim key,7

KEY_CODE = 0,'Z','X','C','V','B'
KEY_POSX = 41
KEY_POSY = 423
BAR_SIZEX = 100
BAR_SIZEY = 20
PERFECT_LINE = 400
PERFECT_RANGE = 40 //PERFECT_LINEから上下にずれてもperfectになるサイズ

//背景バッファ初期化
buffer 1
color 0,0,0 :boxf:color 255,255,255
repeat 5
line BAR_SIZEX+cnt*BAR_SIZEX,0,BAR_SIZEX+cnt*BAR_SIZEX,640
loop
line 0,PERFECT_LINE,500,PERFECT_LINE
gsel 0

gakuhu = "0111111223232455554433213432432342342123432343453234532132423454321121212122222213143143112345432123454321234543224352435243523334422332324355434132335452w4343421434232324234522144214354524242122335432123434543234212345343212345432133423121324434351234223133442345324112344432543213" ;0は無表示,1〜5はz〜bボタンを押す
tenpo = 100 ;テンポの速さ

onebeat = 90000/tenpo //一拍の時間(ms)
perfect_tim = (1.0*PERFECT_LINE/480.0)*onebeat //バー発生からPERFECT_LINEまでの時間
movms = (480.0/onebeat) //1msの移動量(1画面の縦サイズを一拍の時間で割る)

font "",40

start_tim = d3timer()+200 //開始時間


repeat
redraw 0
gmode 1
pos 0,0
celput 1//背景画面コピー

if (onebeat*gcnt) <= (d3timer()-start_tim) {//一拍ずつの経過時間を越えた
use=0
gaku=int(strmid (gakuhu,gcnt,1))
bar_start_tim=onebeat*gcnt //バー発生時間
gcnt+1
}

etim=d3timer()-start_tim //開始からの経過時間
bar_tim=etim-bar_start_tim //バー発生からの経過時間(これにmovmsを掛けてバー座標にする)

repeat 6-1,1
getkey key(cnt),KEY_CODE(cnt)
color 255,255*key(cnt),255
pos KEY_POSX+BAR_SIZEX*(cnt-1),KEY_POSY
mes strf("%c",KEY_CODE(cnt))
loop

if gaku {
if use=0 {
color 255,255,0
boxf (gaku*BAR_SIZEX)-BAR_SIZEX,movms*bar_tim-BAR_SIZEY/2,gaku*BAR_SIZEX,movms*bar_tim+BAR_SIZEY/2 //バーの基準点を中央に変更
}
}


//ヒット表示

if hitf<6 and hitf>0{//perfect=白、good=黄色、miss=赤
if hitf<4 {
color 255,255,63+hitf*64
boxf hit_line_posx-BAR_SIZEX,hit_line_posy-BAR_SIZEY/2+hitf*3,hit_line_posx,hit_line_posy+BAR_SIZEY/2-hitf*3
}
color 255,255-128*(use_bak=3),255-128*(use_bak>1)
circle hit_line_posx-65-hitf*2,PERFECT_LINE-15-hitf*2,hit_line_posx-35+hitf*2,PERFECT_LINE+15+hitf*2,1
circle hit_line_posx-80-hitf*4,PERFECT_LINE-30-hitf*4,hit_line_posx-20+hitf*4,PERFECT_LINE+30+hitf*4,0
hitf++
}

if (key(gaku)=1)&(use=0)&(gaku!0) {
hitf=2 //ヒット表示フラグ
hit_line_posx=gaku*BAR_SIZEX
hit_line_posy=movms*bar_tim //ヒットした時の座標を保存
if abs(PERFECT_LINE-hit_line_posy) <= PERFECT_RANGE {//差がPERFECT_RANGE以下ならperfect
ms="perfect" :use=1
}else{//PERFECT_RANGE*2以下ならgoodでそれより大きければmiss
if abs(PERFECT_LINE-hit_line_posy) <= (PERFECT_RANGE*2) {ms="good" :use=2}else{ms="miss" :use=3 }
}
use_bak=use
}

pos 500,0
color 255,255,255
mes ms
redraw 1
await 16
loop

この音ゲーのヒット表示のことなんですが、このプログラムだと画面半分より上にある落ちてくるバーを
押すとmissになってしまいます。この判定だとちょっときついので、画面より約半分くらいでmissにできる方法を教えてくれませんか。
 
それと、判定ラインより下にいくとmissになる方法も教えてくれませんか?
質問が多くてすみませんでした。



この記事に返信する


暇人

リンク

2014/6/21(Sat) 13:12:09|NO.62519

>画面より約半分くらいでmissにできる方法を教えてくれませんか。

>if abs(PERFECT_LINE-hit_line_posy) <= (PERFECT_RANGE*2) {ms="good" :use=2}else{ms="miss" :use=3 }
ここでgoodの範囲外なら"miss"にしてる(パーフェクト範囲の2倍をグッド範囲としてる)
これをhit_line_posyが希望する位置より下に行くまで"miss"を設定しないようにすれば良い
注意としては、まだ"miss"にしたくない位置だったらhitfを0にする必要がある


>判定ラインより下にいくとmissになる方法も教えてくれませんか?

>bar_tim=etim-bar_start_tim //バー発生からの経過時間(これにmovmsを掛けてバー座標にする)
これ見ればbar_tim*movmsで現在のY座標になる事が分かる

>if (key(gaku)=1)&(use=0)&(gaku!0) {
ここでキーが押されてる縦ライン上にバーが有れば判定処理になってるので
elseでそれ以外のときに分岐してバーの位置がPERFECT_LINEより下にきたら
"miss"を設定してる処理と同じ事をすれば良い

それぞれの修正案はこうなる

if hit_line_posy>(PERFECT_LINE/2){//パーフェクトラインの半分より下に来た ms="miss" use=3 }else{ hitf=0 //ヒット表示フラグリセット }


if ((movms*bar_tim-PERFECT_LINE)>PERFECT_RANGE) {//パーフェクトラインより下にパーフェクト範囲(この辺は適当に調整)を超えた ms="miss" use=3 }



run2

リンク

2014/6/22(Sun) 11:33:49|NO.62539

#include "d3m.hsp" //タイマーだけ利用(timeGetTimeを使用してるだけだから精度は良くない)
#define winx 100
#define winy 0
#define mm 8 ;間隔
#define xcls0 color 0, 0, 0 : boxf 0, 2000, winx * mm - 1, winy * mm - 1
#define xcls1 color 0, 30, 50 : boxf winx * mm, 0
dim key,7

KEY_CODE = 0,'Z','X','C','V','B'
KEY_POSX = 41
KEY_POSY = 423
BAR_SIZEX = 100
BAR_SIZEY = 20
PERFECT_LINE = 400
PERFECT_RANGE = 40 //PERFECT_LINEから上下にずれてもperfectになるサイズ

//背景バッファ初期化
buffer 1
color 0,0,0 :boxf:color 255,255,255
repeat 5
line BAR_SIZEX+cnt*BAR_SIZEX,0,BAR_SIZEX+cnt*BAR_SIZEX,640
loop
line 0,PERFECT_LINE,500,PERFECT_LINE
gsel 0

gakuhu = "0111111223232455554433213432432342342123432343453234532132423454321121212122222213143143112345432123454321234543224352435243523334422332324355434132335452w4343421434232324234522144214354524242122335432123434543234212345343212345432133423121324434351234223133442345324112344432543213" ;0は無表示,1〜5はz〜bボタンを押す
tenpo = 100 ;テンポの速さ

onebeat = 90000/tenpo //一拍の時間(ms)
perfect_tim = (1.0*PERFECT_LINE/480.0)*onebeat //バー発生からPERFECT_LINEまでの時間
movms = (480.0/onebeat) //1msの移動量(1画面の縦サイズを一拍の時間で割る)

font "",40

start_tim = d3timer()+200 //開始時間


repeat
redraw 0
gmode 1
pos 0,0
celput 1//背景画面コピー

if (onebeat*gcnt) <= (d3timer()-start_tim) {//一拍ずつの経過時間を越えた
use=0
gaku=int(strmid (gakuhu,gcnt,1))
bar_start_tim=onebeat*gcnt //バー発生時間
gcnt+1
}

etim=d3timer()-start_tim //開始からの経過時間
bar_tim=etim-bar_start_tim //バー発生からの経過時間(これにmovmsを掛けてバー座標にする)

repeat 6-1,1
getkey key(cnt),KEY_CODE(cnt)
color 255,255*key(cnt),255
pos KEY_POSX+BAR_SIZEX*(cnt-1),KEY_POSY
mes strf("%c",KEY_CODE(cnt))
loop

if gaku {
if use=0 {
color 255,255,0
boxf (gaku*BAR_SIZEX)-BAR_SIZEX,movms*bar_tim-BAR_SIZEY/2,gaku*BAR_SIZEX,movms*bar_tim+BAR_SIZEY/2 //バーの基準点を中央に変更
}
}


//ヒット表示

if hitf<6 and hitf>0{//perfect=白、good=黄色、miss=赤
if hitf<4 {
color 255,255,63+hitf*64
boxf hit_line_posx-BAR_SIZEX,hit_line_posy-BAR_SIZEY/2+hitf*3,hit_line_posx,hit_line_posy+BAR_SIZEY/2-hitf*3
}
color 255,255-128*(use_bak=3),255-128*(use_bak>1)
circle hit_line_posx-65-hitf*2,PERFECT_LINE-15-hitf*2,hit_line_posx-35+hitf*2,PERFECT_LINE+15+hitf*2,1
circle hit_line_posx-80-hitf*4,PERFECT_LINE-30-hitf*4,hit_line_posx-20+hitf*4,PERFECT_LINE+30+hitf*4,0
hitf++
}

if (key(gaku)=1)&(use=0)&(gaku!0) {
hitf=2 //ヒット表示フラグ
hit_line_posx=gaku*BAR_SIZEX
hit_line_posy=movms*bar_tim //ヒットした時の座標を保存
if abs(PERFECT_LINE-hit_line_posy) <= PERFECT_RANGE {//差がPERFECT_RANGE以下ならperfect
ms="perfect" :use=1
}else{//PERFECT_RANGE*2以下ならgoodでそれより大きければmiss

if abs(PERFECT_LINE-hit_line_posy) > (PERFECT_RANGE*2)
ms="good" :use=3
if hit_line_posy>(PERFECT_LINE/2){//パーフェクトラインの半分より下に来た
ms="miss"
use=3
}else{
hitf=0 //ヒット表示フラグリセット
}
}
use_bak=use
}

pos 500,0
color 255,255,255
mes ms
redraw 1
await 16
loop

すいません。今度はgood判定がおかしくなってしまいました。
どうしたらよいでしょうか><



kino

リンク

2014/6/22(Sun) 11:57:19|NO.62540

できればスクリプトは
小文字の<pre>〜</pre>で囲んでください^^
見やすくなりますよー



暇人

リンク

2014/6/22(Sun) 13:40:22|NO.62545

>if abs(PERFECT_LINE-hit_line_posy) <= (PERFECT_RANGE*2) {ms="good" :use=2}else{ms="miss" :use=3 }
ここの「ms="miss" :use=3 」を下のと置き換え


if hit_line_posy>(PERFECT_LINE/2){//パーフェクトラインの半分より下に来た ms="miss" use=3 }else{ hitf=0 //ヒット表示フラグリセット }



> if (key(gaku)=1)&(use=0)&(gaku!0) {
の}側にelseで分岐して{}内に下を追加って事なんだけど・・・

if (use=0)&(gaku!0) {//生きてるバーがある if ((movms*bar_tim-PERFECT_LINE)>PERFECT_RANGE) {//パーフェクトラインより下にパーフェクト範囲(この辺は適当に調整)を超えた ms="miss" use=3 } }



run2

リンク

2014/6/22(Sun) 14:39:24|NO.62547

ほんとにご丁寧に教えて頂きありがとうございます。  

無事成功できました。^^

最後にバーを同時に落とすことって可能でしょうか??



kino

リンク

2014/6/22(Sun) 17:37:20|NO.62563

>最後にバーを同時に落とすことって可能でしょうか??
可能ですが、複数のバーを平行処理しなくてはいけないので
その分処理が複雑になりますね^^



run2

リンク

2014/6/23(Mon) 07:08:55|NO.62576

そうでしたか。わかりました(  ̄▽ ̄)



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