jubeat analyserの改造メモ Part4-1(HOLDマーカーの挙動)

目次

Part1
基本事項(全体的な外観とか)
Part2
数字(叩く順番)の表示に関するもの
Part3
analyserから直接、動画(AVI)出力する
Part4-1
HOLDマーカーの挙動
Part4-2
HOLDマーカー終点の挙動

大前提として、HOLD譜面はautoplayでしか受け付けない。
「リリースマーカー」とは、迫ってくる三角形オブジェのこと
「ホールド」は現在押しているマーカーのこと

ちょこまか修正

【analyserオプション】 →「タッチエフェクトのみを表示」。

effect4.jpg をそれらしいファイルに差し替え
(擬似的にスルーのように見せかける)

◆「それらしい」とは、見逃しミスの画像にすること…だと思います。
◆HOLDノートはパフェの画像にだが、通常ノートは見逃しミスの画像にする(※内部処理は両方パフェ)。

【playmovie.hsp内】

コンボ非表示をデフォルトにする
showvisualcombo = 0

[autoplay] の文字を消去

1277行目くらい

if (autoplaying): tmp = (ph-1)/2*pw+(pw-1)/2:pos x(tmp),y(tmp):color 255,255,255:mescopy “[autoplay]”, 20

1行コメントアウト

[オートプレイでもシャッターを開かせない]

shutter : 現在のシャッター値

default //jubeat
if (event_h(i)>=3): shutter += shuttermax*2/limit(notesum,1,1024) : else: shutter += shuttermax/limit(notesum,1,1024)

↑シャッター計算の本体部分(たぶん

シャッター計算エリアの最下部付近にある

shutter = limit(shutter,0,shuttermax)


shutter = shuttershoki

一生懸命シャッター値を計算しても、毎ターン初期設定に戻させる(健気な努力)

[HOLD中に枠線を表示]

太さ2の枠線を引く
(実際は4周描画するが、はみ出した分は描画されないので実質2pxぶんの幅)

if (nowholding){//こっちの場合もホールド中は弱めにポリゴンフラッシュするか
color rnd(128)+128,rnd(128)+128,rnd(128)+128
gfade 80,x(ra(i)),y(ra(i)),panelsizew,panelsizeh

この2行をコメントアウトし、以下を追記
(残したままでも良いかも ◆現行ソースではコメントアウトせず残ったままでした)

// x(ra(i)) ←各パネル座標の左上x値,yも同様
// HOLD中に適当な枠線を表示させる
w_u = x(ra(i))+1 : w_d=x(ra(i))+panelsizew -1 // 枠線の四隅座標を求める
w_l = y(ra(i))+1 : w_r=y(ra(i))+panelsizeh -1
hsvcolor 128+rnd(128),128+rnd(127),128+rnd(127)
// line x(ra(i)),y(ra(i)),panelsizew,panelsizeh
if (dtmp>0){ // ホールドとリリースが重なったら枠も消去
repeat 4,-2
pos w_u+cnt,w_l+cnt
line w_u+cnt,w_r+cnt
line w_d+cnt,w_r+cnt
line w_d+cnt,w_l+cnt
line w_u+cnt,w_l+cnt
loop
}

dtmpは少し上の「そして迫ってくる方」で使われる変数(初期値が1で、進むごとに減少する)
0未満なら、迫ってくる方が目的地まで到達している

[リリースマーカー&紐の透明度]

//ホールドマーカーの位置に
if (nowholding==0): alCopyModeAlpha 1
//そして迫ってくる方
if (nowholding==0): alCopyModeAlpha 0.16
//そしてその間のホールド線
if (nowholding==0): alCopyModeAlpha 0.6
//
//ホールドを押す前に出てくるやつ
//色が薄いので 0.58,0.8 くらいでいい

ホールド中の棒やリリースマーカー少し薄めにする場合
↓追記(elseで書いてもOK)
if (nowholding): alCopyModeAlpha 0.8

[通過後はホールドアイコンを消す]

if (dtmp<=0){ dtmp = 0 : alCopyModeAlpha 0} //▽が重なった後に通り過ぎるのを防止&消す

「そして迫ってくる方」の一番下の直前(alCopy~の直前行に記述)

↑「ホールドマーカーの位置に」も同様の手法で消去する
…が、dtmp変数の登場前なので
「ホールドマーカーの位置に」の4行を、下側に移動させる

[HOLDかつ同時押し、を別のマーカーで]

if (mtyp==0 && b(i,j)>0): if (holdmarker==1): mtyp = 1 //ホールドマーカーを表示分けするオプション
0通常マーカー 1同時色分け で使ってるのでホールド用の画像は2で

(↑ここまで前提知識)

「ホールドマーカーを表示するオプション」の行を消して
次を記述

if (mtyp==0 && b(i,j)>0): if (holdmarker==1){
if(a1weight(onebuttonindex(i,j))>1){mtyp=3 // 同時ならマーカー3
}else{mtyp = 2} // 単押しならマーカー2
}//ホールドマーカーを表示分けするオプション

a1weight(onebuttonindex(i,j))>1
↑これが「同時か否か」を判定するポイントっぽい

[HOLD残り時間を示す枠@やっぱなしで]

◆メモは残っていますが、たぶん実装していないと思います。

if (b(i,j-1) < 8){ //リリースマーカーの出現位置情報がない場合(holdbytilde使った場合はこうなる)

このif内を if(1)に変更。
少し下のelseは if(b(i,j-1) >= 8) に置き換える //まあこれもif1でいいけど

デフォルトではこの枠が広いので、狭くする(最大でpanelsizewくらい)

//残り時間を示す円
直下のlimitを書き換えて

if (nowholding): tmpr = limit( shisha((0.0+a(i,j)-drawt)/4000*panelsizew), 0, panelsizew/2-2): else: tmpr = panelsizew/2-2

(tmprは残り時間の枠の半径を示す)

bw,bhは15pxくらい(おそらくパネル間の隙間サイズ)

ただ、現状ではHOLD後に3x3程度の小さな残りかすが出てくるので気になる

[非autoplayでも強引にホールドさせる

//押下/リリース されていない場合
の場所で

if (hantei(i,j-1)!=0 && shisha(drawt) > a(i,j-1)+hanteitime(i,j-1)): nowholding = 1: else: nowholding = 1

↑とにかくnowholdingを1にしとくと
(あとは全てが自動で進む)

変数メモ

showvisualhantei
タッチ結果を表示するかを格納(0~ 数値型)

0:ミリ秒表示 <判定表示方法>\n
1:判定を表示しない\n
2:タッチエフェクトのみを表示\n
3:エフェクトとslow/fastを表示(中央)\n
4:エフェクトとslow/fastを表示(パネル枠)

※if (show~!=1) {判定を表示}
という記述がなされる

holdmarker ホールドの強調表示

0:オフ <ホールド表示分け>\n
1:ホールドを別マーカーで表示\n
2:ホールドマーカーを赤色で強調\n
3:ホールドマーカーを緑色で強調\n
4:ホールドマーカーを青色で強調

hantei(i,j)
i 1~16のパネル
j maxind:そのパネル内での何個目のノーツか?

hanteitime(i,j)
判定の基準となる時刻?
↑たぶん実際に押した時刻

drawt 現在時刻(見た目ずれ補正済)

//今押されてるホールドが最後まで押されて終了してたらhanteitime()に0を、hantei()にパフェ(4)を代入しとく

dim holding,pw*ph //現在押されている(そのパネルでの)マーカー番号(動的に変化する)

そのパネル内で、総合何番目のノーツがHOLD中であるか

a(i,j), b(i,j)は時刻関連の何か

mtyp : マーカーの種類(一時変数)。
mtype(i,j)に格納されているデータを読み出す

dim holding,pw*ph //現在押されている(そのパネルでの)マーカー番号(動的に変化する)
パネルごと、最初から何番目のノーツがHOLDされているかを格納

==========最終的なソース===========

//そして迫ってくる方
if (nowholding==0): alCopyModeAlpha 0.5
if (nowholding): alCopyModeAlpha 0.8
tmpx = b(i,j-1)/8 * (panelsizew+bw) * (-dx(direction))
tmpy = b(i,j-1)/8 * (panelsizeh+bh) * (-dy(direction)) //tmpx, tmpy:総移動ベクトル
if (nowholding): dtmp = (0.0+a(i,j)-drawt)/(a(i,j) - a(i,j-1)): else: dtmp = 1.0
if (dtmp<=0){ dtmp = 0 : alCopyModeAlpha 0} //▽が重なった後に通り過ぎるのを防止&消す alCopyImageToScreen 40, 0, x(ra(i))+shisha(dtmp*tmpx), y(ra(i))+shisha(dtmp*tmpy), panelsizew, panelsizeh, panelsizew*direction, 0 //alCopyImageToScreen_RotateAt 40, 0, x(ra(i))+shisha(dtmp*tmpx), y(ra(i))+shisha(dtmp*tmpy), panelsizew, panelsizeh, 0, 0, 45*direction, 0.5*panelsizew+x(ra(i))+shisha(dtmp*tmpx), 0.5*panelsizeh+y(ra(i))+shisha(dtmp*tmpy) //ホールドマーカーの位置に if (nowholding==0): alCopyModeAlpha 0.5 alCopyImageToScreen 40, 0, x(ra(i)), y(ra(i)), panelsizew, panelsizeh, panelsizew*direction, 0 if (dtmp<=0){ dtmp = 0 : alCopyModeAlpha 0} //▽が重なった後に通り過ぎるのを防止&消す //alCopyImageToScreen_RotateAt 40, 0, x(ra(i)), y(ra(i)), panelsizew, panelsizeh, 0, 0, 45*direction, 0.5*panelsizew+x(ra(i)), 0.5*panelsizeh+y(ra(i))

シェアする

  • このエントリーをはてなブックマークに追加

フォローする