その1 システムカスタマイズの基本

デフォルトのシステムを使わず、自作のシステムを使用します。
これにより、後々にセーブボタン等のオリジナルシステムを追加できるようになります。
  • テキストウィンドウの表示
  • クリック待ちカーソルの実装
  • 基本システムの実装(バックログ、ウィンドウ一時削除等)

  • まずは *define の説明から始めます。
    *define
    ;プラグイン
    nsa

    ;タイトル
    caption "システムカスタマイズの基本"

    ;バージョン情報
    versionstr "システムカスタマイズの基本","Ver1.00"

    ;ルビ機能ON
    rubyon 10,10

    ;マウスホイールの値を取得
    usewheel
    ;Escの値を取得
    useescspc

    ;文字表示速度の設定
    defaultspeed 100,50,10

    ;ウィンドウをスプライト10以降の順位に
    humanz 10
    windowback

    11〜12行目
    rubyon 10,10
    文字にルビを表示できるようになります。
    後ろの数字はそれぞれ横サイズ、縦サイズです。

    14〜17行目
    usewheel
    ボタン入力時にマウスホイールの値も取得できるようにする命令です。
    マウスホイールを使わないシステムなら必要ありません。
    useescspc
    上と同じく、こちらはEscキーの入力を取得する命令です。
    今回はデバッグで使うのでゲームとして配布するときには消しておきましょう。

    22〜24行目
    humanz 10
    windowback
    ウィンドウをスプライトより後ろに表示すさせるようにする命令です。
    この場合はスプライト10よりも後ろと言う意味になります。
    システムカスタマイズではカーソルをスプライトで表示するので、
    この命令がないとカーソルがウィンドウに隠れてしまいます。


    ;変数名-----------------------------------------------------

    ;数字変数---------------------------------
    ;ボタン用
    numalias btn,0
    ;テキスト座標
    numalias text_x,1
    numalias text_y,2
    ;関数用
    numalias x,3
    numalias y,4
    numalias z,5
    ;for用
    numalias i,6
    numalias j,7
    numalias n,8

    ;関数定義---------------------------------------------------
    defsub csps
    defsub vsps

    ;システムカスタマイズ定義-----------------------------------
    textgosub *system

    26〜41行目
    変数名の定義です。
    numalias btn,0
    上記を定義しておくと、
    mov %0,1
    mov %btn,1
    この二つは同じ意味になります。
    全部数字ではこんがらがって来るので書いておきましょう。
    どうしても嫌なら書かなくて言い命令ですがその場合はひどく苦労します。

    43〜45行目
    defsub csps
    defsub vsps
    関数を定義します。
    プロトタイプ宣言のようなものと考えると分かりやすいです。
    ですがプロトタイプ宣言と違って、これは書いておかなければ関数が使えません。
    この場合はcspsvspsという関数を作ります。
    cspsはスプライトの一括削除、vspsはスプライトの一括 表示/非表示 です。

    47〜48行目
    システムカスタマイズの重要な定義です。
    textgosub *system
    これは、クリック待ちになるたびに *system にジャンプする命令です。
    なのでこの場合は *system の中にシステムを書いていきます。


    ゲーム起動直後のサンプルです。
    ;ゲーム起動-------------------------------------------------
    game
    *start
    gosub *setting
    goto *test

    ;ゲーム開始設定---------------------------------------------
    *setting
    ;テキストウィンドウ定義
    setwindow 15,365,22,3,26,26,0,10,30,1,1,":a;window\window.bmp",0,360
    ;ウィンドウ順位を下げる
    erasetextwindow 0

    ;テキストスピードデフォルト化
    textspeed 50

    ;カーソルの読み込み
    lsph 0,":l/3,150,2;icon\cursor0.bmp",0,0
    lsph 1,":l/3,150,2;icon\cursor1.bmp",0,0
    return

    50〜52行目
    game
    *start
    NSCripterを起動すると、ここから始まります。
    これは絶対に必要な部分です。
    *start はラベルなので goto 等でここへ飛ぶこともできます。

    53行目
    gosub *setting
    ラベル *setting へ飛びreturnで戻ってくる命令です。

    54行目
    goto *test
    ラベル *test へ飛びます。
    53行目のgosubと違い、こちらは戻ってきません。


    システム部分の説明です。
    ここからが今回のメインです。
    ;システム---------------------------------------------------
    *system
    ;カーソルカーソル種類判断
    ispage %btn
    ;カーソル位置取得
    getcursorpos %text_x,%text_y

    ;カーソルY軸ルビずれ修正
    add %text_y,10

    if %btn = 1 amsp 1,%text_x,%text_y:vsp 1,1:vsp 0,0
    if %btn = 0 amsp 0,%text_x,%text_y:vsp 0,1:vsp 1,0
    print 1

    73〜74行目
    ispage %btn
    現在のクリック待ちが、クリック待ちなのか、改ページなのかを判断します。
    クリック待ちなら変数 %btn に0が入ります。
    改ページならなら変数 %btn に1が入ります。

    75〜76行目
    getcursorpos %text_x,%text_y
    末端の文字の座標を取得します。

    78〜79行目
    add %text_y,10
    12行目で 10px のルビを表示するようにしているので、
    その分文字を 10px 下にずらします。
    これがないとクリック待ちのアイコンが 10px 上に表示されてしまいます。
    ルビ機能を使っていない場合は必要ありません。

    81〜83行目
    if %btn = 1 amsp 1,%text_x,%text_y:vsp 1,1:vsp 0,0
    if %btn = 0 amsp 0,%text_x,%text_y:vsp 0,1:vsp 1,0
    print 1
    クリック待ちなら、クリック待ちのアイコンを表示し、改ページのアイコンを非表示に
    改ページなら、改ページのアイコンを表示し、クリック待ちのアイコンを非表示にします。
    83行目のprint 1は、スプライトの表示/非表示を変更したときに必要な命令です。
    これを書いていないと変更が適応されない場合があります。


    クリック待ちの処理です。
    ;クリック処理-----------------------------
    *btn_loop
    ;クリック待ち
    textbtnwait %btn

    ;クリック時の動作
    if %btn = 0 goto *btn_end
    ;右クリック時の動作
    if %btn=-1 gosub *clear:systemcall windowerase:goto *system
    ;ホイール上時の操作
    if %btn=-2 gosub *clear:systemcall lookback:goto *system
    ;ホイール下時の操作
    if %btn=-3 goto *btn_end
    ;Escキー時の動作
    if %btn = -10 end
    goto *btn_loop

    ;クリック処理終了-----------------------------
    *btn_end
    vsps 0,1,0
    print 1
    texec
    saveon
    return

    ;カーソル一時非表示-----------------------
    *clear
    ;カーソルの非表示
    vsps 0,1,0
    ;ボタン定義の解除
    btndef clear
    return

    87〜88行目
    textbtnwait %btn
    本来はボタン入力待ちの命令ですが、これを利用してクリックされるのを待ちます。
    ボタンがある場合はクリックしたボタン番号を返します。
    それ以外の場合は以下のように値を返します。
    クリック 0
    右クリック -1
    マウスホイール↑ -2
    マウスホイール↓ -3
    Escキー -10

    90〜100行目
    if %btn = 0 goto *btn_end
    if %btn=-1 gosub *clear:systemcall windowerase:goto *system
    if %btn=-2 gosub *clear:systemcall lookback:goto *system
    if %btn=-3 goto *btn_end
    if %btn = -10 end
    goto *btn_loop
    クリックした場合は次へ
    右クリックした場合はウィンドウ非表示
    マウスホイール↑の場合はバックログ
    マウスホイール↓の場合は次へ
    Escキーを押した場合は強制終了
    それ以外のボタンが押された場合は最初へ戻るという処理です。

    102〜108行目
    *btn_end
    vsps 0,1,0
    print 1
    texec
    saveon
    return
    関数vspsでスプライト0〜1を一括で非表示にします。
    107行目のsaveonはいわゆるセーブポイントです。
    ゲーム中でセーブした場合、最後にsaveonがあった場所がセーブされます。
    実はここへはgosubで来た事になっているのでreturnで本文へと戻ります。


    最後は関数です。
    ;関数-------------------------------------
    *vsps
    getparam %x,%y,%z
    for %x=0 to %y
    vsp %x,%z
    next
    print 1
    return

    *csps
    getparam %x,%y
    for %x=0 to %y
    csp %x
    next
    return

    119〜125行目
    *btn_end
    vsps 0,1,0
    print 1
    texec
    saveon
    return
    関数vspsでスプライト0〜1を一括で非表示にします。
    107行目のsaveonはいわゆるセーブポイントです。
    ゲーム中でセーブした場合、最後にsaveonがあった場所がセーブされます。
    実はここへはgosubで来た事になっているのでreturnで本文へと戻ります。

    今回作ったプログラムのサンプルです。
    test1.zip

    BACK