2017年11月28日火曜日

【Storyboard】段位認定の背景表示【Storybrew】

ほぼ自分用のメモ。
こちらの段位認定のSBで使った背景表示のスクリプトです。曲名表示は別。
手動でやると大体20分くらいはかかりますが半自動化してしまえば5分以下で終わるので、スクリプトを書く時間を含めても大幅な時間短縮になります。

大まかな流れ
1. diffごとに異なる項目の配列を作る
2. 読み込む
3. いつもの感じで設定・出力

時間設定は手書きだと面倒なのでbookmarkで読み込み。
BGのファイル名は全て1.jpg, 2.jpg, 3.jpgで統一。

using StorybrewCommon.Scripting;
using StorybrewCommon.Storyboarding;
using System.Linq;

namespace StorybrewScripts
{
    public class Background : StoryboardObjectGenerator
    {
        public override void Generate()
        {

            var layer = GetLayer("");
            var layer2 = GetLayer("2");
            var diff = Beatmap.Name;

            //基本設定
            var dummy = layer.CreateSprite(Beatmap.BackgroundPath, OsbOrigin.Centre);
            dummy.Fade(0, 0);
            int[] x = {0, 0, 0};
            int[] c = {210, 90, 0};
            double[] b = {1.0, 1.0, 1.0};
            double[] o = {1.0, 1.0, 1.0};
            string d = "0";

            //diff固有設定
            if(diff == "1st Dan"){
                d = "01";
                x[0] = 140;
                x[1] = 120;
                x[2] = 180;
                c[1] = 250;
                b[1] = 0.3;
            }

            if(diff == "2nd Dan"){
                d = "02";
                x[0] = 120;
                x[1] = 210;
                x[2] = 160;
                c[0] = 30;
                c[1] = 180;
                b[1] = 0.6;
                c[2] = 50;
            }

            if(diff == "3rd Dan"){
                d = "03";
                x[0] = 120;
                x[1] = 255;
                x[2] = 190;
                c[0] = 30;
                c[1] = 0;
                c[2] = 350;
                b[2] = 0.5;
            }

             if(diff == "4th Dan"){
                d = "04";
                x[0] = 190;
                x[1] = 140;
                x[2] = 170;
                c[0] = 40;
                b[0] = 0.3;
                c[1] = 70;
                c[2] = 330;
                b[2] = 0.3;
            }

            if(diff == "5th Dan"){
                d = "05";
                x[0] = 210;
                x[1] = 60;
                x[2] = 60;
                c[0] = 220;
                b[0] = 0.5;
                c[1] = 35;
                b[1] = 0.5;
                c[2] = 5;
                b[2] = 0.8;
            }

            if(diff == "6th Dan"){
                d = "06";
                x[0] = 60;
                x[1] = 150;
                x[2] = 125;
                c[0] = 220;
                b[0] = 0.4;
                c[1] = 250;
                b[1] = 0.5;
                c[2] = 20;
                b[2] = 0.65;
            }


            //読み込み設定
            int[] time = {0, 0, 0, 0};
            var bg = new OsbSprite[4];
            var i = 0; var n = 0;

            var line = layer2.CreateSprite("BG/line.png", OsbOrigin.CentreLeft);
            line.Additive(0,0);
            line.Move(0, 597, 122);
            double linelength = 0.237;
            
            //時間設定
            foreach (var bookmark in Beatmap.Bookmarks)
            {
                time[n] = bookmark - 1500;
                n++;
            }
            time[3] = (int)Beatmap.HitObjects.Last().EndTime + 1000;


            //背景読み込み
            foreach (var bookmark in Beatmap.Bookmarks)
            {
                i++;
                string j = "" + i; 
                string path = "BG/"+ d + "/" + j +".jpg";
                int startTime = time[i-1];
                int endTime = time[i];
                int FadeTime = 500;

                bg[i] = layer.CreateSprite(path, OsbOrigin.Centre);
                bg[i].Fade(startTime, startTime + FadeTime, 0, 1);
                bg[i].Fade(endTime, endTime + FadeTime, 1, 0);

                bg[i].Scale(startTime, 480/768.0);
                bg[i].MoveY(startTime, x[i-1] + 240);

                line.Fade(startTime + FadeTime, 1);
                line.ScaleVec(startTime + FadeTime, endTime, 0, 0.5, linelength, 0.5);
                line.Fade(endTime - 200 - 1000, endTime, 1, 0);
                line.ColorHsb(startTime, c[i-1], b[i-1], o[i-1]);

            }

            //Taiko_Bar
            var layer_bar = GetLayer("Taiko_bar");
            var bar = layer_bar.CreateSprite("BG/black.png", OsbOrigin.TopCentre);
            
            bar.Fade(time[0] - 500, time[0], 0, 1);
            bar.Fade(time[3] + 1000, time[3] + 2000, 1, 0);
            bar.ScaleVec(time[0], 3, 3.2);
            bar.MoveY(time[0], 0);

            var st = layer_bar.CreateSprite("BG/stage.png", OsbOrigin.Centre);
            st.Fade(time[0] - 500, time[0], 0, 1);
            st.Fade(time[3] + 1000, time[3] + 2000, 1, 0);
            st.ScaleVec(time[0], 0.4, 0.3);
            st.Move(time[0], 680, 105);

        }

    }
}

beatmap Dataの情報がwikiにあまり載ってなかったので色々初心者なりに模索。
Beatmap.Nameで開いているdiffの名前を読み取れることが分かったので、それと一致を条件にdiffを判別。dでBGのあるフォルダを指定。

前述の通り時間設定は基本bookmark。ただし終了地点だけは最後のノートの位置を条件に。

BG設定はxがy座標(ただのミス), cが右上の曲の長さを表すバーの色、b/oがその濃度関係。他はwikiの情報をもとに書いたので特に書くこと無し


0 件のコメント:

コメントを投稿