タイトル画面の作り方

■ INDEX

タイトル画面の作り方  実際のスクリプト  サンプルのダウンロード 

タイトル画面の作り方

意外と需要があるようですので説明のページを作成してみました。
後述のスクリプトにも記載しましたが、下記のようなループのブロック作りを憶える必要があります。

最初に「ボタン定義のリセット(bclear)」を行い、
次に「ボタン定義(bsp)」を、
次に「キー待ち(bexec $0)」を、
次に「キー待ちで返ってきた値の判定(if文列挙)」を行って、それぞれ対応する処理に飛ばす。
最後に「予定外のキー判定だった時のためにループの頭にgoto」して終えるという流れ。

以上の流れがNScripterの基本的なボタン待ちのブロックです。
これを必要に応じてどんどん「入れ子」にしていくなど考えられますね。
とにかく、まず実際のスクリプト例を見てみましょう。

実際のスクリプト


;mode800,value1000
;===============================================================================
;ここから定義節
;===============================================================================
*define
nsa
globalon
kidokuskip
humanz 500
windowback
shadedistance 1,1
effectcut
usewheel
useescspc
maxkaisoupage 50
mode_wave_demo
;-------------------------------------タイトルバー名称
caption "タイトル画面のサンプル"
;-------------------------------------メニューバー類
defaultspeed 0,25,10
automode
automode_time 2000
resetmenu
insertmenu "終了(&X)",END
insertmenu "バージョン情報(&V)",VERSION
insertmenu "リセット(&R)",RESET
insertmenu "オート開始(&A)",AUTO
insertmenu "選択肢までスキップ(&S)",SKIP
insertmenu "各種設定(&C)",SUB
insertmenu "ボリューム設定(&V)",DWAVEVOLUME,1
insertmenu "スキップ設定(&S)",SUB,1
insertmenu "全て",KIDOKUOFF,2
insertmenu "既読のみ",KIDOKUON,2
insertmenu "フォント(&F)",FONT,1
insertmenu "テキスト速度(&T)",SUB,1
insertmenu "瞬間表示",TEXTSLOW,2
insertmenu "普通",TEXTMIDDLE,2
insertmenu "早い",TEXTFAST,2
insertmenu "画面(&W)",SUB,1
insertmenu "フルスクリーン",FULL,2
insertmenu "ウィンドウ",WINDOW,2
;-------------------------------------右クリックメニュー
savenumber 20
menusetwindow 20,20,0,0,1,1,#CCCCCC
rmenu "文字を隠す",windowerase,"回想",lookback,"次の選択肢に進む",skip,"セーブ",save,"ロード",load,"タイトルへ戻る",reset
;-------------------------------------
game


;===============================================================================
;ここから実行節
;===============================================================================
*start
        ;----------初期設定
        erasetextwindow 0
        setwindow 20,20,29,16,26,26,0,9,5,1,1,#aaaaaa,0,0,799,599
        textspeeddefault
        ;----------タイトルへ移動
        goto *title


;-------------------------------------------------------------------------------
;タイトル画面
;-------------------------------------------------------------------------------
*title
        ;----------背景
        bg "title.jpg",0
        ;----------ボタン用の画像(今回は手抜きですが、普通に画像使った方が見栄えします)
        lsp 11,":s/24,24,0;#FFFFFF#FF0000"+"start",  490,250
        lsp 12,":s/24,24,0;#FFFFFF#FF0000"+"load",    490,275
        lsp 13,":s/24,24,0;#FFFFFF#FF0000"+"config",490,300
        if %1000 == 1 lsp 14,":s/24,24,0;#FFFFFF#FF0000"+"extra",  490,325
        lsp 15,":s/24,24,0;#FFFFFF#FF0000"+"end",      490,350
        ;----------描画
        print 1
*title_loop
        ;----------ボタン定義(必ずループの先頭でボタン定義のclearが必要です ※1)
        bclear
        bsp 11
        bsp 12
        bsp 13
        if %1000 == 1 bsp 14
        bsp 15
        ;----------ボタン待ち
        bexec $0
        ;----------ボタン内容を判定
        if $0 == "S11" goto *story_line
        if $0 == "S12" gosub *loadmode     :goto *title;(※3 画像設定に一度戻る)
        if $0 == "S13" gosub *configuration:goto *title
        if $0 == "S14" gosub *extramode    :goto *title
        if $0 == "S15" end
;このようにループを作ってブロックを形成します。(※2)
goto *title_loop


;※1
;ボタン定義数が256個を超えると「ボタンが多すぎます」というエラーで落ちます。
;試しにbclearを;でコメントアウトしてからctrlキー押しっぱにしてみましょう。

;※2
;NScripterのボタン待ちの基礎ですが、まず基本となるループ構造を作っておきます。
;サンプルで言いますと、「*title_loop」から「goto *title_loop」の部分ですね。
;そこでは、
;最初に「ボタン定義のリセット(bclear)」を
;  次に「ボタン定義(bsp)」を
;  次に「キー待ち(bexec $0)」を
;  次に「キー待ちで返ってきた値の判定(if文列挙)」を行ってそれぞれ対応する処理に飛ばします。
;最後に「予定外のキー判定だった時のためにループの頭にgoto」して終えます。
;これが基本のボタン待ちループ構造です。
;タイトル画面でも、システムカスタマイズでも、自作コンフィグ画面でも、
;自作セーブロードでも、クリッカブルマップでも何でも、基本的には同じ形になります。
;当然、各処理として飛んだ先の処理でも似たようなことを行っていきます。
;これはNScripterを習得していく上での土台となっていく部分ですのでぜひ憶えておいてください。

;※3
;明示的にループ前の先頭(画像設定類)に戻るようにした方が分かりやすいかもしれません。
;load・config等の飛び先でスプライト番号をタイトル画面のものと重複して使用してしまった場合、
;タイトル画面にreturnしてきた時に画像の再セットが必要になるからです。
;もう一つ注意があります。上のサンプルで仮にロード画面をS15のキーで抜けて戻ってきたと仮定します。
;すると、そのままコードを読み進めて「if $0 == "S15" end」のendが効いてしまいます。
;(機能先からreturnするときに$0などの値に気をつければいいのですが、初心者は結構ミスりやすいですね)
;そのため、明示的に頭に戻してしまえばミスが起きることも滅多になくなるでしょう。


;-------------------------------------------------------------------------------
;ロード画面
;-------------------------------------------------------------------------------
*loadmode
        ;----------背景
        lsp 1,":c;>800,600,#CCCCCC",0,0
        print 1
        ;----------ロード処理(これを自作出来るようになると見栄えがよくなります)
        systemcall load
        ;----------戻るための準備(この場合は背景の消去)
        csp 1:print 1
        return


;-------------------------------------------------------------------------------
;コンフィグ画面
;-------------------------------------------------------------------------------
*configuration
        ;----------背景
        lsp 0,":s/50,50,0;#FF0000"+"コンフィグ画面予定地",0,0
        lsp 1,":c;>800,600,#FFFF00",0,0
        print 1
        ;----------ボタン待ち(サンプルでは適当にクリック待ちで済ませます)
        lrclick
        ;----------戻るための準備(この場合は背景と文字スプライトの消去)
        csp 0:csp 1:print 1
        return


;-------------------------------------------------------------------------------
;オマケモード
;-------------------------------------------------------------------------------
*extramode
        ;----------背景
        lsp 0,":s/50,50,0;#FF0000"+"オマケモード予定地",0,0
        lsp 1,":c;>800,600,#FFCCCC",0,0
        print 1
        ;----------ボタン待ち(サンプルでは適当にクリック待ちで済ませます)
        lrclick
        ;----------戻るための準備(この場合は背景と文字スプライトの消去)
        csp 0:csp 1:print 1
        return


;===============================================================================
;ストーリー分岐のダイヤグラム
;-------------------------------------------------------------------------------
*story_line
        ;----------初期設定
        for %0 = 11 to 15
                csp %0
        next
        bg black,1
        ;----------ストーリー開始
        gosub *story01
        gosub *story02
        分岐します@
        select "03ブロックへ",*sel_01_a,"04ブロックへ",*sel_01_b
                *sel_01_a
                gosub *story03
                goto *sel_01_end
                *sel_01_b
                gosub *story04
                goto *sel_01_end
                *sel_01_end
                ;ここで合流
        gosub *story05
        gosub *story06
        ;----------エンディング・シーン
        以上で終わりです。\
        ;初回プレー時だけメッセージ+エクストラ判定用の変数を操作
        if %1000 != 1 mov $0,"エクストラモードが開きました。\":mov %1000,1:puttext $0
;最後まで到達でリセットします
reset


;※ 余談
;『ひぐらし』の章の間のTIPSモードですが、ストーリーブロックの間にgosubで入れるだけで作れます。
;gosub *story01
;gosub *tips_mode
;gosub *story02
;gosub *tips_mode
;こんな具合に、章を終えてラインに戻ってくるたびgosubで飛ばしてやると手軽ですね。


;-------------------------------------------------------------------------------
;ストーリー本体
;-------------------------------------------------------------------------------

*story01
ここはストーリーブロック01です。¥
gosubで飛ばす必要もないんですが、この作り方の方が後々楽なんじゃないかと思います。¥
このサンプルでは、グローバル変数の%1000を、エクストラモード出現の判定に使っています。¥
return

*story02
ここはストーリーブロック02です。¥
愚かな知恵者になるよりも、利口な馬鹿者になれ。(言志四録)¥
return

*story03
ここはストーリーブロック03です。¥
一灯を掲げて暗夜を行く。暗夜を憂うるなかれ、一灯を頼め。(言志四録)¥
return

*story04
ここはストーリーブロック04です。¥
人の賢者は初見の時に於いてこれを相す。多く誤らず。(言志四録)¥
return

*story05
ここはストーリーブロック05です。¥
人我に負くとも我人に負く勿れ。(言志四録)¥
return

*story06
ここはストーリーブロック06です。¥
少にして学べば、則ち壮にして為すことあり
壮にして学べば、則ち老いて衰えず
老いて学べば、則ち死して朽ちず。(言志四録)¥
return

サンプルのダウンロード

実際に動かしてみた方がわかりやすいのでサンプルを用意しておきました。

title_menu.zip ←右クリックして保存を選んでください

タイトル周りのブロック構造のイメージを下記に図示してみました。
このように基本的なボタン待ちのブロックを理解しておけば「入れ子」構造が簡単に作れます。
タイトル周りのイメージ
人それぞれ組み方は色々あると思いますが、まずは一例、叩き台になる何かがあると
最初のハードルが楽になると思いますので、よろしければ参考までに。

ちなみに、ブロックやらダイヤグラムやらストーリーラインなどの用語はかなりテキトーに言ってます。
「*story_line」ラベルなんて今回のサンプルを打った時に初めて使ったラベル名ですしね。
こうアバウトな自分たち用の造語を使っていった方が楽しく制作できるんじゃないかなと思います。
アマチュアのゲーム制作は何事も楽しんだ者勝ちですよ!
ここでは何となくの「ボタン待ちスクリプトの塊」の概念さえ分かっていただければ大丈夫です。