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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0710
ナグト勝手に動かないようにするには?3解決


ナグト

リンク

2014/7/10(Thu) 18:26:44|NO.62806

hspの初心者です。友達がhspでゲームを作ってるのを見て自分も作ってみたいと思って、音ゲーを作ろうと思って色々なサイトやスレッドを参考にさせていただいてここまでしたのですが
バーが勝手に判定されてしまうのです。どなたか解決策がわかりますか??
#include "d3m.hsp"	//タイマーだけ利用(timeGetTimeを使用してるだけだから精度は良くない)
dim key,6 ;スタート表示 ----- *restart_disp font "MS ゴシック", 50, 0 color 300, 200, 0 pos 10 * mm, 280 * mm mes " ゲームスタート" wait 100 KEY_CODE = 0,'C','V','B','N','M' KEY_POSX = 41 KEY_POSY = 423 BAR_SIZEX = 100 BAR_SIZEY = 20 PERFECT_LINE = 400 PERFECT_RANGE = 30 //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="0111222333444555111333222" tenpo = 130 ;テンポの速さ onebeat = 100000/tenpo //一拍の時間(ms) perfect_tim = (1.0*PERFECT_LINE/480.0)*onebeat //バー発生からPERFECT_LINEまでの時間 movms = (480.0/onebeat) //1msの移動量(1画面の縦サイズを一拍の時間で割る) font "",30 start_tim = d3timer()+200 //開始時間 repeat redraw 0 gmode 0 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) { if (use=0)&(gaku!0) {//生きてるバーがある else if ((movms*bar_tim-PERFECT_LINE)>PERFECT_RANGE*3) {//パーフェクトラインより下にパーフェクト範囲(この辺は適当に調整)を超えた ms="miss" use=3 } } hitf=1 //ヒット表示フラグ 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} if hit_line_posy>(PERFECT_LINE/1){//パーフェクトラインの半分より下に来た ms="MISS" use=3 }else{ hitf=0 //ヒット表示フラグリセット } } use_bak=use pos 200,200 color 255,255,255 mes ms redraw 1 await 16 loop



この記事に返信する


k5342

リンク

2014/7/13(Sun) 02:36:08|NO.62861

期待通りに動かないときは、ソースがどのように動いているか順を追って確認してみてください。

上のソース 59行目 - 64行目 でいう、


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

の部分でキーボードからの入力を検出しているようですが、
バーの当たり判定の部分と思われる 73行目 - 107行目 では 「キーボードが押された」 という情報が使われていない気がします。

59行目 - 64行目 でせっかくキーボードの入力を検出して key という配列に代入してるので、
当たり判定部分でその情報も使ってあげるとうまくのではないかと

(掲示板にソースを貼り付けるときはソースを見やすくして貼り付けると回答する人も回答しやすいと思います。)



KOMARI

リンク

2014/7/13(Sun) 12:17:56|NO.62864

とりあえずインデント、波括弧の書き方を統一しましょう。話はそれからです。
"いつこの処理が行われるのか"が一目見てわからないとデバッグのしようがありませんよね。

line(85-107)を整理すると、

if (key(gaku)=1)&(use=0)&(gaku!0) { if (use=0)&(gaku!0) {//生きてるバーがある else if ((movms*bar_tim-PERFECT_LINE)>PERFECT_RANGE*3) {//パーフェクトラインより下にパーフェクト範囲(この辺は適当に調整)を超えた ms="miss" use=3 } } hitf=1 //ヒット表示フラグ 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} if hit_line_posy>(PERFECT_LINE/1){//パーフェクトラインの半分より下に来た ms="MISS" use=3 }else{ hitf=0 //ヒット表示フラグリセット } }
となる。

まず、2,3行目のifとelseは存在意義がない。("}"がないのに通るせいで解読に苦労させられた('A`))
で、勝手に判定が行われる原因は以下。
必ず9行目のhitf=1を毎回通る。これがすべての元凶。多分意図されてないんだろうけど。
一番最初のノート"0"では、msは文字型変数でないので0と表示される。(未初期化変数はdim扱い)
判定圏内にくるまでは20行目のhitf=0が処理される。
goodかperfectの判定圏内に入ると、hitfは1になるので、次のループでhit時のエフェクトが出る。
これが判定圏内に入っていると延々繰り返される。それが終わると17行目のMISSになる。
このとき代入された"MISS"は、ms="GOOD"がくるまで入ったまま。
ノーツが降ってきてる間"MISS"と表示されるのはこのため。
そもそも、判定されてもいないのに判定を毎ループ表示するのがおかしい。
以下ループ。

〜他に気になったこと〜
・key判定で85行目のkey(gaku)=1をしたいがために、わざわざKEY_CODEの最初を0としているように見える。
KEY_CODE = 'C','V','B','N','M'にして、85行目のキー判定をkey(gaku-1)=1に変えればいいだけでは?
もちろん、59-64行目もそれに合わせて若干変更が必要になるが。
・KEY_POSX等の固定値は#constを使ったほうがいいかも。
・tenpo(tempoの間違い?)がbpmを表すのなら、onebeatは(60000/tenpo)になりそう。



ナグト

リンク

2014/7/14(Mon) 22:12:14|NO.62889

解決しました。ありがとうございます!



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