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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0811
こうこうせいリズムゲームの製作3未解決


こうこうせい

リンク

2014/8/11(Mon) 23:02:01|NO.63729

学校祭に向けて簡単なリズムゲームを作ろうかなと考えております。

ですが、私はHSPではゲームではなく、ツールを作っていましたので、そちらの方面の知識は皆無であります...。

なんとなく、自分の中でのイメージは画像のような感じです。
http://tadax.info/pic/up/o0zye.jpg

流れてくる
「●」を一定の場所でSPACEを押すことで●が赤く変化する+スコアに加点、といった感じです。

ここまでは難しいかも知れません。
今知りたいのは、
 ・「●」の流れてくるタイミング、速さなどの設定
 ・判定領域の作成、および判定
 などです。

まったくわからないため、質問にいたりました。
皆様のお力をお貸しください。よろしくお願いいたします。



この記事に返信する


rikuriku112233

リンク

2014/8/12(Tue) 13:05:05|NO.63736

判定領域の作り方はわかりませんが、流れてくるタイミングなどは太鼓さん次郎の
ようにテキストなどに保存したデータを読み込んでゲームに反映するようにしたら
いいと思います。
例 押す=o 押さない=_
o_o_o_o_
このように書くと
押す押さない押す押さない押す押さない押す押さない
という風になる、などのシステムを組まないと譜面を流すことは難しいと思います。



きのよー

リンク

2014/8/12(Tue) 22:35:56|NO.63762

リズムゲームということなので、音ゲーとはまた違ったものになりそうですが……
押すボタンが必ず1つなので、データとしては単純ですね。
rikuriku112233さんがおっしゃったように、太鼓さん次郎の譜面のように、
一列に記述して問題無いと思います。

判定としては、たとえば
「本来押してほしいタイミングから一定時間以上ずれていたら不可判定」
というルールにしたり、または
「押すときと押さないときを明確にして判定する」
というルールにするなど、考え方によっては組み方が変わってきます。

どちらにしろ、「開始から何(ミリ)秒経った時点でキーが押されたので、判定をする」ということには変わりないので
譜面データを作って、それを読み込んですべての「●」のミリ秒を計算するプログラムを組んでから
判定プログラムを組んでみてはいかがでしょう?



暇人

リンク

2014/8/14(Thu) 07:47:58|NO.63792

まず基準となる時間を決める
BPMとかtempoを使った方が曲に合わせ易い

bpm=80 //一分間の拍数(4分音符の数) tim_beat=1000.0*60.0/bpm //一拍(4分音符)の時間(ms) beat_max=4 //Just_pos迄を何拍分にするか Just_pos=550.0 //ここをボタンを押すジャストタイミングを表す座標とする Just_tim=tim_beat*beat_max //発生からの経過時間のジャストタイミングを表すタイム(beat_maxが4なら4拍分の時間) notes_speed=Just_pos/Just_tim //速度(beat_max拍分の時間経過でJust_posに到達する速度)
tim_beatが基準の時間になる
スタートからの経過時間でtim_beat毎に●を発生させれば
1拍毎に発生させられる
1泊より短い間隔で発生させたい場合はtim_beatを半分(8分音符相当)にしたりする

移動速度は発生からの経過時間にnotes_speedを掛ければbpmに合わせた速度で進む
beat_maxを4にしてる場合は4拍でJust_posに到達する

複数●を表示するサンプル

#include "d3m.hsp" //d3timer()を使うので //0は前の音符の長さの休符(最初は4分休符)、1は4分音符の4倍の長さ、2は2分音符、4は4分音符、8は8分音符、9は16分音符 Sheet="44449990999088008800224444088880440440" notes_length=0.0,4.0,2.0,1.0,1.0,1.0,1.0,1.0,0.5,0.25 //音符のtim_beatに掛ける倍率 bpm=80 //一分間の拍数(4分音符の数) tim_beat=1000.0*60.0/bpm //一拍(4分音符)の時間(ms) beat_max=4 //Just_pos迄を何拍分にするか Just_pos=550.0 //ここをボタンを押すジャストタイミングを表す座標とする Just_tim=tim_beat*beat_max //発生からの経過時間のジャストタイミングを表すタイム(beat_maxが4なら4拍分の時間) notes_speed=Just_pos/Just_tim //速度(beat_max拍分の時間経過でJust_posに到達する速度) //文字列データに0以外があったら発生時間を配列に全て登録 notes_max=0 tim_index=0.0 ddim next_tim,strlen(Sheet) tim_add=tim_beat //初回休符の長さ repeat strlen(Sheet) notes_dat = int(strmid(Sheet,cnt,1)) if notes_dat ! 0 { notes_tim(notes_max)=tim_index //発生時間を登録 notes_max++ tim_add=tim_beat*notes_length(notes_dat) //今回登録した物の長さ } tim_index+tim_add //次の発生時間 loop notes_index=0 //これを開始要素数として発生時間の検索をする tim_s=d3timer() //スタート時間 *main redraw 0 color 255,255,255 boxf color pos Just_pos,240 mes "○" tim_next=d3timer()-tim_s //経過時間 stick k repeat notes_max-notes_index,notes_index if notes_tim(cnt)<=tim_next {//経過時間が発生時間以上 notes_elapsed_time=(tim_next-notes_tim(cnt)) //経過時間から発生時間を引いて発生からの経過時間にする(この結果とJust_timを比較すればタイミングでの処理が出来る) notes_pos=notes_speed*notes_elapsed_time //notes_elapsed_timeに速度を掛けて現在の座標にする if notes_pos>(Just_pos+50) {//Just_posより50ドット超えたらMissとして処理 notes_index=cnt+1 //次回から次の要素数からループ処理 hit=-1 hit_pos=notes_pos //現在の座標を保存 }else{//ここに来る●だけ判定する //キーが押されてたらnotes_posとJust_posを比較して差によってGOODなどの処理を別ける(これは座標での処理になるのでテンポが遅いほど難易度が下がる) pos notes_pos,240 color mes "●" } }else{//経過時間以内の発生時間登録が無かった break } loop if hit=-1 { Misstim=tim_next+100 //経過時間にMiss表示時間を足して、Miss表示終了時間にする hit=0 } if tim_next<Misstim {//経過時間がMiss表示終了時間以上になるまで下の処理をする pos hit_pos,240-30 color 255 mes "Miss" } await 16 redraw 1 goto *main
判定は座標でするかタイミングでするかで難易度等に違いが出ると思う



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