最終更新日 2020/09/10 (第3章)
tasuke's osu! blog
気ままにやっていきます。
2019年7月30日火曜日
【Storyboard】新・Storybrew解説【osu!】
以前にもStorybrewの解説らしき記事を書いたことがあるのですが, 全くと言っていいほど初心者のためになっていないように感じたので再執筆することにしました。更新頻度は高くないかもしれませんが, なるべく丁寧に解説していくので是非読んでいただけたらなと思います。
2017年11月25日土曜日
ModdingV2 変更点
Rank過程
従来のStar Priorityが廃止され、Hype Trainが導入された。
現在新たに投稿される譜面ではModding / DiscussionのリンクをクリックするとModdingV2のページへと移動します。
すると次のような画面が出てきます。
これはHype Trainと呼ばれていて、従来のStar Priorityに対応しています。Hypeの意味は辞書には"広告"などと載っていますが、ネット上ではスラングとして用いられることが大半で、日本語としては「期待、盛り上げ」が近いのではないかと思います。Hypeは一人につき1回することが出来、その人数が12人を超えるとBeatmap NominaterによってNominateされることが可能となります。
(NominateボタンはBeatmap Nominaterのみに表示されます)
Nominateを押した人数が2人に達すると譜面は晴れてQualifiedとなります。以前はBubble, Qualifyと複数のアイコンがあり、初心者はwiki等から情報を集めなければなりませんでしたが、今回の変更によってどうすれば譜面がランクするのか視覚的に分かりやすくなったのではないかと思います。
Hypeの方法ですが、最初の画像の"Hype Beatmap"を押すと次の画面へと移動します。
下の英文を意訳すると、「Praise♡のついたPostは譜面のHype値(Hype Train)を上昇させ、譜面のNominateを可能にします。」です。先ほど説明したとおりですね。
ここにコメントを入力し、右下のPraiseを押すことでHypeが完了します。ちなみにPraiseのついたポストは何度でもできますが、1人1譜面につき1回しかHype値は上昇しません。また、Hypeをするには対価は不要です。
Hype値が上昇しました。
ModdingV2ではGeneral (All Difficulties), General, Timeline, Historyの4つに分かれており、Hype値が上昇するのはGeneral (All Difficulties)にPraiseのポストをしたときのみです。GeneralやTimelineでPraiseのポストをしてもHypeは上昇しません。
ポスト時のアイコンの意味は次の通りです。
Praiseは称賛するときに使用します。
SuggestionはModdingで提案をする際に使用します。
Problemは譜面に問題点があるときに使用します。
自分の譜面でコメントを残す場合はNoteとなります。これは特定の場所/配置に対してmodderに説明をするときなどに活用が出来ます。
ちなみに、譜面をWork in Progressに投稿した場合はHype値が12以上でもNominate Statusは表示されません。
Modding関連
Timelineが表示され、どの場所に対する指摘なのかわかりやすくなった
Timestamp (00:15:186 - のような形式) を含めると自動で指摘した場所にアイコンが付きます。これらは上記のポスト時のアイコンに対応しています。✔は問題が解決したことを意味します。返信をする際に"Resolved"にチェックを入れることでアイコンが変化します。
このResolvedはMapperと権限を持った人にしか出来ないため、現状ゲスト譜面を含むときは投稿者が改めてmodに対して返信をする必要があります。
特定箇所に対する指摘でない場合はGeneralにPostしましょう。
Modに対するe-mail通知が廃止され、Modding Watchlistが導入された。
Moddingページの左上にあるWatchボタンを押すとこちらのページに譜面が追加され、"Resolved"となっていないPostの数が表示されるようになります。
Modに対してUpvote(右画像, 左)を押すことで付与されます。今まではModの量, 質を問わず1 Postにつき1-2kudosuでしたが、今回の変更により"modの内容量に応じて合計kudosu数が変化"し、"譜面を改善しなければkudosuが付与されない"ようになり、内容の薄いmodでkudosuの荒稼ぎが出来なくなりました。個人的には良い変更だと思っています。
ただ、Upvoteをする際は"本当に譜面を改善したか"を必ず確認してください。仮に変更を加えたとしてもd? k?のような意義の薄いPostに対してはUpvoteをすることは推奨できません。
今後ModdingV2関係のガイドラインが充実してくると思うので、そちらを参考にしていくと良いかと思います。それでは良いマッピングライフを
2017年7月25日火曜日
【Storyboard】立体的演出【Storybrew】
難易度: Advanced
範囲: Parameter, Vector Scale, Loop等
初めに.
そもそも、osuのStoryboardはXY平面上で動作しているため、立体的な処理が出来ません。ですが、ちょっとした工夫をすればある程度立体的な表現をすることが出来るようになります。
Paramete (FlipH, FlipV): 画像を反転させる働きをします。
Vector Scale (ScaleVec):X, Yそれぞれの拡大率を設定します。
演出01.
これらのコマンドを組み合わせてみましょう。
先ほどの2コマンドとRotateを組み合わせることによって二軸回転をさせています。現実的にはこのような動きはしないのですが、SBの演出としては十分でしょう。
最後のIF内にあるLoop処理が特徴的です。LoopGroupの記述方法は公式wikiを参照してください。
演出02.
Scaleを第三の軸, Z座標として扱うことが可能です。サイズを大きくすれば近づく、小さくすれば遠くなるのと同じような見え方をします。遠近法的なアレです。
具体例は割愛。
演出03.
Animationに頼る方法。その方が楽な場合もあるので覚えていても良いと思います。
補足.
Beatmap.GetTimingPointAt(time)でtimeにおけるデータを取得します。今回の場合、BeatDurationと続けることで一拍の長さを変数"beat"に入れています。
範囲: Parameter, Vector Scale, Loop等
初めに.
そもそも、osuのStoryboardはXY平面上で動作しているため、立体的な処理が出来ません。ですが、ちょっとした工夫をすればある程度立体的な表現をすることが出来るようになります。
Paramete (FlipH, FlipV): 画像を反転させる働きをします。
Vector Scale (ScaleVec):X, Yそれぞれの拡大率を設定します。
演出01.
これらのコマンドを組み合わせてみましょう。
public override void Generate() { var layer = GetLayer(""); var BG = layer.CreateSprite("SB/bg_1.jpg", OsbOrigin.TopLeft); var startTime = 175627; var endTime = 233912; var beat = Beatmap.GetTimingPointAt(startTime).BeatDuration; BG.Scale(startTime - beat, endTime, 480/768.0 * 1.1, 480/768.0); BG.Fade(startTime - beat, startTime, 0, 1); BG.Fade(endTime, endTime + beat, 1, 0); BG.Move(startTime, -107, 0); var n_sakura = 500; var sakura = new OsbSprite[n_sakura]; for (var i = 0; i < n_sakura; i++){ if (i % 2 == 0){sakura[i] = layer.CreateSprite("SB/sakura_1.png");} else {sakura[i] = layer.CreateSprite("SB/sakura_2.png");} var sakuraStart = Random(startTime - beat, endTime - beat); var sakuraTime = Random(3000, 8000); var sakuraEnd = sakuraStart + sakuraTime; var Ys = Random(50, 600); var Ym = Random(-400, -50); double Ss = Random(40, 75); Ss /= 100.0; double Srx = Random(-6, 6) * Math.PI; var Srz = Random(1, 8); sakura[i].Fade(sakuraStart, sakuraEnd, 1, 1); sakura[i].Scale(sakuraStart, Ss); sakura[i].Rotate(sakuraStart, sakuraEnd, 0, Srx); sakura[i].MoveX(sakuraStart, sakuraEnd, -120, 800); sakura[i].MoveY(sakuraStart, sakuraEnd, Ys, Ys + Ym); sakura[i].Additive(sakuraStart, sakuraStart); if(Srz > 0) { sakura[i].StartLoopGroup(sakuraStart, Srz); sakura[i].ScaleVec(OsbEasing.InSine, 0, (sakuraTime / Srz) / 2, Ss, Ss, Ss, 0); sakura[i].FlipV((sakuraTime / Srz) / 2, (sakuraTime / Srz) /2); sakura[i].ScaleVec(OsbEasing.OutSine, (sakuraTime / Srz) / 2, (sakuraTime / Srz), Ss, 0, Ss, Ss); sakura[i].EndGroup(); } }
先ほどの2コマンドとRotateを組み合わせることによって二軸回転をさせています。現実的にはこのような動きはしないのですが、SBの演出としては十分でしょう。
最後のIF内にあるLoop処理が特徴的です。LoopGroupの記述方法は公式wikiを参照してください。
演出02.
Scaleを第三の軸, Z座標として扱うことが可能です。サイズを大きくすれば近づく、小さくすれば遠くなるのと同じような見え方をします。遠近法的なアレです。
具体例は割愛。
演出03.
Animationに頼る方法。その方が楽な場合もあるので覚えていても良いと思います。
補足.
var beat = Beatmap.GetTimingPointAt(startTime).BeatDuration;
公式wikiにはBeatmap Dataのページに載っています。Beatmap.GetTimingPointAt(time)でtimeにおけるデータを取得します。今回の場合、BeatDurationと続けることで一拍の長さを変数"beat"に入れています。
var BG = layer.CreateSprite("SB/bg_1.jpg", OsbOrigin.TopLeft);
OsbOriginは重心の設定だと導入編で説明しました。今回の場合はTopLeft, 左上が重心となっています。2017年6月13日火曜日
【Storyboard】雪エフェクト【Storybrew】
難易度: Basic
雪エフェクトの使用例: EMILIA (CV: Rie Takahashi) - Stay Alive
範囲: Move, Scale, for構文, Random
今回はこの譜面で進めていきます。
雪の画像はこちらからどうぞ。
STEP 01.
public override void Generate() { int number = 200; var l = GetLayer(""); var SnowPath = "SB/dot_0.png"; var Snow = new OsbSprite[number]; }
number: 雪の個数を指定。
SnowPath: 雪画像のパスを指定。自分のmapsetに合わせて変更すること。
Snow = New Osbsprite[数]: 同じ画像を複数回用いるときに使う。
STEP 02.
public override void Generate() { int number = 200; var l = GetLayer(""); var SnowPath = "SB/dot_0.png"; var Snow = new OsbSprite[number]; int startTime = 55246; int endTime = 76116; for (var i = 0; i < number; i++){ var snowStart = Random(startTime, endTime); Snow[i] = l.CreateSprite(SnowPath, OsbOrigin.Centre); } }
for (---; ---; ---){}: 超重要。適当に解説しているサイトを見ると良い。
int startTime / endTime: 雪の降り始める時間の範囲を指定。
snowStart: startTime~endTimeの間のランダムな数値が入る。これによりそれぞれの雪画像が別々の時間に降り始めるような設定が出来るようになる。
snow[i]: 先ほどforの中身がnumber回繰り返されると説明したが、i値はの1週するたびに1ずつ増えていくため、Snow[0], Snow[1], Snow[2], ...., Snow[199]と同じ役割を果たす。
STEP 03
Double sScale: Scaleは小数になるため、varではなくdoubleを使用している。40~80のランダムの数値を生成→100で割るという手順を踏むことで0.01単位の0.40~0.80の範囲のランダムな数値を得ることが出来る。
MoveX: 一直線に落ちてくるだけだと見栄えが良くないため左右の揺れ幅を追加。範囲をRandom(20, 100)のようにすると風が吹いているかのような演出にすることが出来る。
以上で雪エフェクトの作成完了です。
Additiveコマンドを入れるとより綺麗に見えると思います。
自分なりに数値をいじったり、画像を変更したりして是非応用してみてください。
int startTime / endTime: 雪の降り始める時間の範囲を指定。
snowStart: startTime~endTimeの間のランダムな数値が入る。これによりそれぞれの雪画像が別々の時間に降り始めるような設定が出来るようになる。
snow[i]: 先ほどforの中身がnumber回繰り返されると説明したが、i値はの1週するたびに1ずつ増えていくため、Snow[0], Snow[1], Snow[2], ...., Snow[199]と同じ役割を果たす。
STEP 03
public override void Generate() { int number = 200; var l = GetLayer(""); var SnowPath = "SB/dot_0.png"; var Snow = new OsbSprite[number]; int startTime = 55246; int endTime = 76116; for (var i = 0; i < number; i++){ var snowStart = Random(startTime, endTime - 4000); var startX = Random(-120, 840); var MoveX = Random(-50, 50); var FallTime = Random(4000, 8000); Double sScale = Random(40, 80); sScale /= 100.0; Snow[i] = l.CreateSprite(SnowPath, OsbOrigin.Centre); Snow[i].MoveX(snowStart, snowStart + FallTime, startX, startX + MoveX); Snow[i].MoveY(snowStart, snowStart + FallTime, -20, 500); Snow[i].Scale(snowStart, sScale); } }
Double sScale: Scaleは小数になるため、varではなくdoubleを使用している。40~80のランダムの数値を生成→100で割るという手順を踏むことで0.01単位の0.40~0.80の範囲のランダムな数値を得ることが出来る。
MoveX: 一直線に落ちてくるだけだと見栄えが良くないため左右の揺れ幅を追加。範囲をRandom(20, 100)のようにすると風が吹いているかのような演出にすることが出来る。
以上で雪エフェクトの作成完了です。
Additiveコマンドを入れるとより綺麗に見えると思います。
自分なりに数値をいじったり、画像を変更したりして是非応用してみてください。
2015年11月26日木曜日
[Taiko]各プレイスタイルの特徴
今回はPlayingについての記事です。
[軸]
手首軸:
手首より先のみを動かしてキーを叩く方法です。机に手首置く、手首が上向きに曲がる、などの特徴があります。
腕軸:
肘から手を動かして叩く方法です。手首が曲がらず、机から離れている、などの特徴があります。
[指の本数]
2本指:
右手と左手それぞれ1本ずつで叩く方法です。高い密度の譜面に強い傾向があります。
腕軸との相性が良く、手首軸との相性が少し悪いです。
4本指:
右手と左手それぞれ2本ずつで叩く方法です。運指の変化が多い譜面に強い傾向があります。
手首軸との相性が良く、腕軸との相性が少し悪いです。
[運指]
ヴァーナス:
単体を片手で叩き、複合も利き手から叩き始める方法です。聞き手は常にほぼ一定の間隔で押すことになるため、精度や長いストリームに強い反面、体力を多く要します。腕軸との相性が良いです。
交互:
交互にノートを叩く方法です。
[譜面認識]
スピード認識型:
パターンを細かい単位で認識して叩くタイプです。HRのような速い譜面に強く、逆に1/6を含んだ遅めの譜面などには弱い傾向があります。ヴァーナスや腕軸、2本指との相性が良いです。
パターン認識型:
パターンを広い範囲で認識してタイプです。パターンの見た目密度が低くなるHRなどに弱く、逆に見た目の速度が遅い譜面や1/6を含んだ複雑なリズムなどに強い傾向があります。交互や手首軸、4本指との相性が良いです。
ちなみに自分は手首軸、4本指、パターン認識型です。
プレイスタイルと得意な譜面には強い関係性があるので、例えば「HRが上手くなりたい」なら腕軸2本指にしてみる、「複雑な譜面に強くなりたい」なら認識方法を変えてみる、などをしてみるとより早く伸びるかもしれません。
[軸]
手首軸:
手首より先のみを動かしてキーを叩く方法です。机に手首置く、手首が上向きに曲がる、などの特徴があります。
腕軸:
肘から手を動かして叩く方法です。手首が曲がらず、机から離れている、などの特徴があります。
[指の本数]
2本指:
右手と左手それぞれ1本ずつで叩く方法です。高い密度の譜面に強い傾向があります。
腕軸との相性が良く、手首軸との相性が少し悪いです。
4本指:
右手と左手それぞれ2本ずつで叩く方法です。運指の変化が多い譜面に強い傾向があります。
手首軸との相性が良く、腕軸との相性が少し悪いです。
[運指]
ヴァーナス:
単体を片手で叩き、複合も利き手から叩き始める方法です。聞き手は常にほぼ一定の間隔で押すことになるため、精度や長いストリームに強い反面、体力を多く要します。腕軸との相性が良いです。
交互:
交互にノートを叩く方法です。
[譜面認識]
スピード認識型:
パターンを細かい単位で認識して叩くタイプです。HRのような速い譜面に強く、逆に1/6を含んだ遅めの譜面などには弱い傾向があります。ヴァーナスや腕軸、2本指との相性が良いです。
パターン認識型:
パターンを広い範囲で認識してタイプです。パターンの見た目密度が低くなるHRなどに弱く、逆に見た目の速度が遅い譜面や1/6を含んだ複雑なリズムなどに強い傾向があります。交互や手首軸、4本指との相性が良いです。
ちなみに自分は手首軸、4本指、パターン認識型です。
プレイスタイルと得意な譜面には強い関係性があるので、例えば「HRが上手くなりたい」なら腕軸2本指にしてみる、「複雑な譜面に強くなりたい」なら認識方法を変えてみる、などをしてみるとより早く伸びるかもしれません。
2015年8月22日土曜日
登録:
投稿 (Atom)