|
 |
|
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
}
|
|
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判定がおかしくなってしまいました。
どうしたらよいでしょうか><

| |
|
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
}
}
|
|
2014/6/22(Sun) 14:39:24|NO.62547
ほんとにご丁寧に教えて頂きありがとうございます。
無事成功できました。^^
最後にバーを同時に落とすことって可能でしょうか??
|
|
2014/6/22(Sun) 17:37:20|NO.62563
>最後にバーを同時に落とすことって可能でしょうか??
可能ですが、複数のバーを平行処理しなくてはいけないので
その分処理が複雑になりますね^^
|
|
2014/6/23(Mon) 07:08:55|NO.62576
そうでしたか。わかりました(  ̄▽ ̄)
|
|