ツクール豆知識

Last-modified: 2024-04-19 (金) 03:17:17

このページは、RPGツクール2000に関する基礎的・発展的な情報をまとめています。
ゆめ2っき固有の情報は主にハウツーへまとめています。

お役立ちな情報があれば気軽に追加していってください。(分類に悩んだら「その他」で良いと思います)

 
 下位の個別ページ
 このページ内の目次
 
 

テストプレイ

デバッグ用の特殊な機能

ツクールの▲マークで起動すると"テストプレイモード"になる
このモードはデバッグに役立つ様々な機能を搭載しているのだ!

キー効果
F9いつでもスイッチのON/OFFや変数の数値を変える事ができる
F10実行中のイベントをすべて中断させる 無限ループからの脱出用
F12強制的にタイトル画面に戻る 要するにリセットボタン
Ctrl押している間、地形を無視して移動できる

おおっと、F12キーはテストプレイモードじゃなくても使う事ができるぞ!

 

ランタイムパッケージ無しで起動する

実行ファイルと一緒に入っている"RPG_RT.ini"
これの末尾に

FullPackageFlag=1

…と書けば、RTPが無くても起動できるぞ!
ただし、一部のマップで正常に動かないから注意が必要だ!

 

マップ編集

通行設定の☆と×を両立させる

主人公は通れないけど、主人公よりも上に出したい!

そんな時は、☆判定として設定したあと、
「通行・4方向」で4方向すべてを通行不可にすると
☆判定と×判定を両立させることができるぞ。

 

遠景を見ながらマップ編集

マップの大きさと遠景の大きさがピッタリ同じで、
遠景が動かないように設定されていればエディター上に表示されるぞ!
"正体不明"のマップが分かりやすい例だ!

ちょっと詳しく書くと、
マップのサイズを16倍にした時の数値と、
遠景の画像サイズがぴったり同じであればエディター上に表示されるのだ。
(遠景をループさせる設定にしていると表示されないから気をつけよう!)

 

マップのシフトで、ループ部分の見栄えチェック

左下のマップ名を右クリックして「シフト(S)...」を選択すると、
マップ全体をまるごとズラすことができるぞ。

ループする設定のマップで、きちんとマップの端と端が繋がるか確認したい時に便利だ。

 

シフトキーでチップの形を変えない

マップ編集中、シフトキーを押しながら配置するか
シフキーを押しながら右クリックを押すと
自動地形生成システムというのを無視する事ができる。
現実部屋の壁などで試してみると分かりやすいぞ!

 

公式の画像付き解説ページ
https://tkool.jp/products/rpgvxace/lecture/002_008
(画像はVX Aceだが、ツクール2000でもほぼ同じようにできるぞ)

 

ショートカットキーを使いこなして製作スピードアップ?

一部の操作はキーボードでも可能なのだ!
慣れるとマウスだけで操作するより素早く製作できるかもしれないぞ!

イベント内容編集時
スペースキー選択しているイベントコマンドの編集
エンターキー選択している位置にイベントコマンドを挿入
Ctrl+Aそのページにあるイベントコマンドをすべて選択
Ctrl+X選択しているイベントコマンドを切り取り
Ctrl+C選択しているイベントコマンドをコピー
Ctrl+V切り取り・コピーしたイベントコマンドを貼り付け
Delete選択しているイベントコマンドすべてを削除
マップのイベント編集モード時
エンターキー選択している位置にイベント追加・編集
Ctrl+X選択しているイベントを切り取り
Ctrl+C選択しているイベントをコピー
Ctrl+V切り取り・コピーしたイベントを貼り付け
Delete選択しているイベントを削除
マップ編集時
Ctrl+Zマップの編集内容を1つ前に戻す
Ctrl+Sマップの編集結果を保存する
Ctrl+R最後に保存した状態に戻す
F9テストプレーを開始する
F8データベースを編集する
F7イベント編集モードにする
F6上層チップ編集モードにする
F5下層チップ編集モードにする
右ダブルクリック下層・上層チップ編集モードを切り替える
(イベント編集モードの時は無効)
右クリックカーソル位置にあるチップを選択する(スポイト機能)
(押したまま動かすと最大で6x6の範囲を選択可能)
 

優先度・エラー

バグの原因を探すときに役立つテクニック

どこまでが思っている通りに動いていて、どこから予想外な動きをしているか調べる時は
ハッキリと画面に変化がある◆文章の表示や、必ず音がする◆効果音の再生を入れることで
その位置まで思った通りに動いているかを確認することができる。

何回も入れる位置を変えて試すことで、怪しい部分をあぶりだす事も不可能ではないぞ。

また、スイッチがONかOFFかを簡易的に調べたいだけであれば、
そのスイッチがONの時に◆効果音の再生をする定期的に並列処理のイベントを作れば良い。
ちょっとうるさいかもしれないが、確実に分かるぞ。

 

イベントのページ番号・イベントID取得の優先度

マップイベントは数値が大きいページを優先して実行する。
指定位置のイベントID取得も数値が大きいイベントIDを優先して取得する。

 

画面に表示されるモノの表示優先度

手前 / 奥
メニュー画面など
画面の暗転 *1
文章の表示のテキストとウィンドウ, タイマー
画面のフラッシュ
戦闘アニメの画像部分
ピクチャー番号:50番
ピクチャー番号: 1番
画面の色調変更の対象
天候 (雨/雪)
主人公よりも上 に設定されているイベント
通行設定が の 上層 チップ
通行設定が ☆ □ の 下層 チップ
主人公および 主人公と重ならない に設定されているイベント
主人公よりも下 に設定されているイベント
通行設定が ○ × の 上層 チップ
通行設定が ○ × の 下層 チップ
遠景
 

通行設定の優先度

優先主人公と重ならない に設定されているイベント
上層チップの ○ ×
下層チップの ×
上層チップの に設定された 通行不可能な方向
下層チップの に設定された 通行不可能な方向
下層チップの

ちなみに、少しややこしいが
主人公の足元にある主人公と重ならない に設定されているイベントは移動に影響しないぞ。

 

併用できないコマンド

以下のコマンドは同時に使おうとすると、最後に実行されたものだけが動作するぞ。

  • ◆戦闘アニメの表示◆画面のフラッシュ
  • ◆戦闘アニメの表示◆キャラクターのフラッシュ (対象キャラが同じ場合)
 

指定動作の全実行 でバグりやすいポイント

◆キャラクターの動作指定で指定した動きが終わるまで他の動きを止める◆指定動作の全実行
なんと、指定した動きが終わらない場合はゲームの進行が止まってしまう怖い弱点があるぞ。

ゆめ2っきではエフェクト変身や長押し動作をした時などに、
プレイヤーの操作で◆キャラクターの動作指定◆指定動作の全実行が実行されることがある。
そんな時にうっかり終わらない動作があったら……もちろんフリーズだ。

とはいえ、便利なコマンドに違いはない。
イベント中動作禁止等でプレイヤーの操作を制限してから使うと良いだろう。
◆キャラクターの動作指定の"移動できない場合は無視"オプションも活用するとナイスだ。

 

"このイベント"を指定しているのに"無効なイベントが指定されました"となってしまう

場所移動でどこか別のマップへ移動させた場合、"このイベント"を指定している部分でエラーが出てしまう。
おそらく、場所移動した時点でどのイベントを実行しているかの記録が消えてしまうからだと思われる。

"EV0001"のように直接指定してあげればエラーも出ず、正しく動いてくれる。
きちんと気を付けて使えば"移動先のマップにあるイベントを動かす"こともできるぞ。

 

セーブ後にマップが編集された時の処理 / セーブデータに記録されないもの

セーブデータには「そのマップの保存回数」のようなものが記録されている。
もしロード時にこれが食い違っていれば「マップが編集された後」と判断して、"マップに入りなおす"という動作になる。

ただ、ゆめ2っきではセーブする時にPC画面の壁紙などが表示されている。
そこで「セーブ中」を示すフラグを一時的に立てておき、このフラグが折れていなければ"パッチ適用後"と判断してPC画面を閉じる処理が呼び出されるぞ。

余談:ゆめ2っきのセーブデータ引継ぎ処理

ゆめ2っきではゲームのバージョンを記録する変数が用意されている。
ロード後、これが本体側と一致するか調べて、一致しない場合はセーブデータ引継ぎ処理が始まるぞ。

ID変数名説明
0011本体Ver.末尾のアルファベットを数値に置き換えたものが入る、詳細はツクラー製作の流れ#step4を参照
0012セーブデータ Ver.
※表は割り当て詳細/各種用途より引用
 

ちなみに、セーブデータには記録されないものがある。
◆マップチップの切り替え だ。

セーブする前に ◆マップチップの切り替え を実行しても、セーブデータを読み込むと元のマップチップに戻ってしまう。
これを利用することで、ロード直後かどうか調べることも不可能ではないぞ。

 

イベント設置・編集

イベント開始条件 … それぞれの違い・特徴

プライオリティも影響するので、合わせて記載しておくぞ。

プライオリティ:通常キャラの下・上
基本的にはプレイヤーが該当イベントと重なった状態で起動する形となる。
チップセットの通行設定が×になっている等の理由で重なることができない場合、プレイヤーの手で起動させることはできない。
プライオリティ:通常キャラと重ならない
基本的にはプレイヤーが該当イベントと重なっていない状態で起動する形となる。
◆動作指定:すり抜け開始で重なることが可能だとしても重なったまま起動はできない。
チップセット通行設定のカウンター属性を用いることで4~5マス離れた状態でも起動させられる。
開始条件:決定キーが押された時
プレイヤーから調べると開始。
開始条件:主人公から触れた時
プレイヤーから接触すると開始。
"通常キャラと重ならない"に設定されている場合はプレイヤーから調べても開始できる。
隣接しただけでは開始せず、また◆イベントの動作指定で主人公を動かした場合も始まらない。
開始条件:イベントから触れた時
プレイヤーかイベントの片方から接触すると開始。
"通常キャラと重ならない"に設定されている場合はプレイヤーから調べても開始できる。
隣接しただけでは開始せず、また◆イベントの動作指定で主人公を動かした場合も始まらない。
開始条件:自動的に始まる
上記3種類および他の自動的に始まるイベントが実行されていないと開始。
同じ条件の自動的に始まるイベントがあった場合はマップイベント⇒コモンイベントの順に実行される。
開始条件:定期的に並列処理する
上記4種類の実行状態に関係なく開始し、その全てが並列で実行される。
他の開始条件と異なり、実行している間、プレイヤーは主人公を歩かせたり、メニュー画面を開ける。
イベント実行の順番待ち
定期的に並列処理するイベント以外は基本的に順番待ちが発生する。
例えば主人公から触れた時のイベント[A]で他のマップへ移動し、そこに自動的に始まるイベント[B]があったとしても、[A]の処理が終わるまで[B]は開始せず順番待ちとなる。
逆に、自動的に始まるイベント[B]の中で◆イベント処理の中断をした場合、別の自動的に始まるイベントへ順番が回るケースもある。
 

イベント開始条件 … 「定期的に並列処理する」の仕様

  • 他のイベントが実行していても、並行して実行する。
  • 実行している間、プレイヤーは主人公を歩かせたりメニュー画面を開いたりできる。(他の開始条件はできない)
  • メニュー画面を開いている間、実行を一時停止する。メニュー画面を閉じると一時停止した位置から再開する。
  • 実行している間、出現条件を満たさなくなった場合、実行を中断する。(他の開始条件は中断しない)
    • マップイベントの「定期的に並列処理する」は、別のマップへ移動すると、出現条件を満たさなくなる。
    • コモンイベントの「定期的に並列処理する」は、出現条件を満たさなくなった場合、
      "どこまで実行したのか"を記憶して実行を中断する。(セーブすればセーブデータにも記録される)
      再び出現条件を満たしたとき、記憶した位置から実行を再開する。
 

イベント開始条件 … 「イベントから触れたとき」の不思議な挙動

イベント開始条件をイベントから触れたときに設定したイベントが起動する瞬間に、
定期的に並列処理するイベントでスイッチがONになり、
ある自動的に始まるコモンイベントの出現条件を満たすと、イベントの動きが止まってしまう。
(ゆめ2っき的には、公園世界の黒魔女に捕まる寸前にシフトチェンジを起動すると再現できる)

この現象は、どのようなイベントの設定にしても、イベントの実行内容が何であっても起こってしまう。

この動きが止まった状態は、イベントページを切り替える、イベントに触れる、
キャラクターの動作指定(対象キャラを止まったイベント・移動ルートは何でもいい)…のいずれかで戻せる。

 

移動ルートの記憶・継承

移動ルートを設定したイベントページが切り替わったとき、
切替前と後の移動ルートが同じ場合は、動作コマンドをどこまで処理したか記憶して、うまくつないでくれる。
逆に移動ルートが少しでも違う場合は、移動ルートの先頭から始まるぞ。

「移動しない」など移動ルートが見かけ上設定されてないものであっても、
内部的には移動ルートを持っている扱いになってて、この法則通りに動くみたいだ。

ふみきりで移動ルートを設定したキャラを止めたとき、動きがおかしくなったらこの辺りを疑ってみよう。

 

微妙な違い … 向き固定 と グラフィック完全固定

 動作指定で向き変更アニメ再開・停止※1
通常・足踏みあり(※2)
向き固定×
グラフィック完全固定××

(もうちょっと詳しく検証したいな……)
※1 イベントページを切り替えたとき、切り替え前の向きを保持できるかどうか
※2 移動ルートや動作指定で向き固定をしても、切り替え前の向きを保持する
  アニメーションタイプ「向き固定」と、アニメーションタイプ「通常」を向き固定したものの違いはこれ

 

イベントコマンド

変数の操作 … X座標と画面Xの違い

X座標,Y座標はマップのどの位置に居るのか
画面X,画面Yは画面のどの位置に居るのか、を調べるぞ。

Xがヨコ、Yがタテだ。
ツクールの世界では左上に行くほど数値が減っていき、左上の隅っこは X:0,Y:0 になるぞ。
Tkool_2020-10-10_001.png

もし、画面Xが0~320のどこかで、画面Yが0~240のどこかなら、
そのイベントの足元が画面の中に入っている、ということになる。

なお、画面X/画面Yは-8辺りが最小値。
これは表示上、画面左上が外側1マス分しか存在していないため。

 

変数の操作 … 主人公が動いていないことを知る

これは"画面がスクロールしないマップ"で、
主人公が止まっていることを判定する処理だ。

◆変数の操作:[0001:変数1◆]代入, 主人公の画面X
◆変数の操作:[0002:変数2◇]代入, 主人公の画面Y
◆変数の操作:[0001:変数1◆]剰余, 16
◆変数の操作:[0002:変数2◇]剰余, 16
◆条件分岐:[0001:変数1◆]が8
 ◆条件分岐:[0002:変数2◇]が0
  ……

画面Xを16で割った余りが8、画面Yを16で割りきれる時。
この瞬間は主人公が止まっている。

 

しかし、これは"画面がスクロールしないマップ"でしか使えない。
画面がスクロールするのなら、主人公が歩いても画面Xが変わらないかもしれないからだ。

それを解決させたのが、この処理だ。

◆変数の操作:[0001:変数1◆]代入, 主人公の画面X
◆変数の操作:[0002:変数2◇]代入, 主人公の画面Y
◆条件分岐:小型船に乗っている
 ◆変数の操作:[0001:変数1◆]減算, 大型船の画面X
 ◆変数の操作:[0002:変数2◇]減算, 大型船の画面Y
 ◆
:それ以外の場合
 ◆変数の操作:[0001:変数1◆]減算, 小型船の画面X
 ◆変数の操作:[0002:変数2◇]減算, 小型船の画面Y
 ◆
:分岐終了
◆変数の操作:[0001:変数1◆]剰余, 16
◆変数の操作:[0002:変数2◇]剰余, 16
◆条件分岐:[0001:変数1◆]が0
 ◆条件分岐:[0002:変数2◇]が0
  ……

実は、小型船・大型船といった"乗り物"は、
そのマップに存在していなくても画面Xなどの座標を調べられる。
乗り物に乗っていない場合は当然、止まったまま動かない。

"止まったまま動かない"ことを利用したのが上記の処理。
乗り物の画面Xを16で割った余りが8、画面Yを16で割りきれる時。
この瞬間は画面がスクロールしていない、と言えるわけだ。

更にもう一工夫だ。
主人公の画面Xから乗り物の画面Xを引いた時。
ここまで出てきた"余り8"はこの引き算で打ち消される形になるぞ。
そして、もし主人公も乗り物も止まっているのなら、16で割りきれる。
ようやくこれで主人公が動いていないことを知ることができるようになった。

 

ゆめ2っきでは、Zキーの長押し処理などに同様のものが使われている。
というのも、"歩きながらティッシュを置く"なんてことをすると
タイミング次第ではイベントをすり抜けてしまうからだ。
バグ対策に密かな活躍をしているぞ。

 

変数の操作 … 曲の再生位置を知る

◆変数の操作:代入, MIDIの再生位置(Tick) を使えば、
wavやmp3ならどこまで再生したかの"秒数"、
midiなら演奏位置を示す"Tick"という数値が入るぞ。

長いエンディング曲の「30秒」の時に背景を変えたい!
などという時にちょっと便利な代物だ。

 

変数の操作 … とある桁だけを取り出す

変数の除算(割り算)では、小数点以下を切り捨てる。
つまり 256÷10 の答えは 25 になるのだ。

変数の余剰(余り算)では、割り算の余りだけが残る。
つまり 256÷10の余り で答えは 6 になるのだ。
この二つを上手く使うことで、特定の桁だけを調べられるぞ。

下は変数の5桁目だけを取り出す一例だ。
1~4桁目を切り捨てさせた後、1桁目だけが余るようにしているぞ。

◆変数の操作:[0001:便利変数01]代入,変数[適当なとこ]の値
◆変数の操作:[0001:便利変数01]除算,10000
◆変数の操作:[0001:便利変数01]余剰,10
 

変数の操作 … 除算で小数点以下まで求める

19÷4 の答えは 4.75 だ。
しかし、ツクール2000では小数点以下切り捨てなので答えが 4 になる。

 

ここで、19÷4 の"余り"を出してみよう。余り 3だ。
これを10倍にして4で割る、すると 30÷4=7 となり、2が余る。
余った2をまた10倍にして4で割る、20÷4=5 となって、余りは0だ。

ここまで出てきた(余り以外の)計算結果を合わせると、7,5と並ぶ。つまり.75というわけ。
10倍にして割り直すと小数点以下の計算が疑似的にできるのだ。

 

もし桁数に余裕があるなら、予め割られる数を10倍や100倍にしてもいい。
19÷4 の代わりに 1900÷4 で計算すれば答えは 475 となる。

この方法は収集率のように小数点以下何桁まで求められれば良いか明確な場合に活用しやすい。
ただし、10倍や100倍にする都合上カンストに気を付けないといけないぞ。

 

変数の操作 … 正負を求める/絶対値を求める

あまり出番は無いかもしれないが、

◆変数の操作:[A]乗算,999999
◆変数の操作:[A]除算,999999

…とすることで、[A]のプラスマイナスを維持したまま絶対値を1にできる。
(元々0だった場合は0を維持する)

これを応用することで、変数の操作のみで絶対値の取得も可能だ。

◆変数の操作:[B]代入,[A]
◆変数の操作:[B]乗算,999999
◆変数の操作:[B]除算,999999
◆変数の操作:[B]乗算,[A]

この場合、[A]の数値はそのまま、[B]には[A]の絶対値が入る。

 

変数の操作 … 細かい仕様まとめ

  • 上限値(999999),下限値(-999999)を超える演算 ⇒ 上限値(999999),下限値(-999999)になる
  • 除算
    オペランドを0にした場合、計算結果は操作する変数と変わらない。
    操作する変数オペランド計算結果
    n0n
    0m0
  • 剰余
    計算結果の符号は操作する変数の符号になる。要するにオペランドの符号に意味は無い。
    操作する変数オペランド計算結果
    n00
    0m0
    +n+m0以上+m未満の数
    +n-m0以上+m未満の数 (正の数になる)
    -n+m-mより大きい0以下の数 (負の数になる / 例:-10 剰余 3 ⇒ -1)
    -n-m-mより大きい0以下の数 (負の数になる / 例:-10 剰余 -3 ⇒ -1)
  • 一括操作のオペランドを乱数にすると、それぞれの操作ごとに新しい乱数が使われる
    ◆[0001~0002]代入, 乱数[0~9] ⇒ 変数1番に7、変数2番に3…みたいな
  • 一括操作の注意点
    ◆[0001~0004]代入, 変数[V[0004]]の値 ⇒ 正常に動く
    ◆[0001~0004]代入, 変数[V[0001]]の値 ⇒ 正常に動かない
 

画面切り替え方式の変更 … 無限ループする道を作る

どんなに歩いても進まない、恐ろしい無限ループの道を作るのだ。
やり方は簡単、以下のようなイベントを作ればOKだ!

◆画面切り替え方式の変更:場所移動/消去,消去しない
◆画面切り替え方式の変更:場所移動/表示,瞬間表示
◆場所移動:(ここにループの行き先を指定するのだ)
◆画面切り替え方式の変更:場所移動/消去,フェードアウト
◆画面切り替え方式の変更:場所移動/表示,フェードイン

画面を暗くせずに移動させるから、遊んでる時はなかなか気づかない。
ちなみに、一番上を「場所移動/消去,瞬間消去」にすると一瞬だけ暗くなるぞ。
ループしてる事をアピールしたい時には良い方法かもしれない。
他にも、上から二番目を変えるとまた違った演出ができるぞ!

 

画面の表示 … 暗転以外にもこんな演出

場所移動、ピクチャーの表示、遠景の変更などの直後
◆画面の表示を入れるとフェードインなどで表示できるぞ!
本家の起動直後に表示される説明書でも使われているようだ!

 

ピクチャーの表示と移動 … ピクチャー番号で決まること

◆ピクチャーの表示は画像を読み込んで指定した場所に表示するぞ!
この時に指定するピクチャー番号は数字が大きい物を上に表示するという仕様だ!

また、前述のように読み込んで表示させるから連続で使うと重い!
1回表示させたら◆ピクチャーの移動で操作した方が動作が軽いぞ!
あらかじめ表示させておくのも1つの方法かもだ!

余談ではあるが、場所移動するとピクチャーはすべて消えるぞ!

 

キャラクターの動作指定 … ジャンプの速さ

ジャンプは距離に関係なく移動速度が一定。
遠い場所にジャンプさせると速すぎて見えない事もあるぞ!

 

キャラクターの動作指定 … 対象キャラの指定動作だけを解除

キャラクターの動作指定で移動ルートを何も設定していない空っぽのコマンドをつくると、
対象キャラの指定動作を解除できるぞ。

◆指定動作の全解除はすべてのイベントやうろつきの動作まで中断してしまって扱いにくい…
というときに便利かもしれない。

 

ウェイト … 0.0秒

0.0秒と指定されたウェイトは何の意味もない……わけではない!
なんと、0.0秒を指定すると1/60秒のウェイトになるぞ。いわゆる1フレームだ。

重い処理だけど、ちょっとくらい休んでもバレへんやろ……という時は
0.0秒ウェイトを置いておくとゲームの動作が軽快になるかもしれない。

 

ウェイトの詳細

◆画面の色調変更:(R200,G200,B200,S200), 10.0秒(W)
◆画面の色調変更:(R200,G200,B200,S200), 10.0秒
◆ウェイト:10.0秒

上記のイベントコマンドは等価(他のウェイトを付帯するイベントコマンドも同様)

◆ウェイト:0.1秒
◆ウェイト:0.0秒
◆ウェイト:0.0秒
◆ウェイト:0.0秒
◆ウェイト:0.0秒
◆ウェイト:0.0秒
◆ウェイト:0.0秒

上記のイベントコマンドは等価

なので、例えば並列処理するコモンイベントで◆ウェイト:10.0秒が3.0秒実行した後、
出現条件スイッチがOFFになってイベント実行が途中で中断され、
再び出現条件スイッチがONになって再開した場合、再開後は7.0秒分のウェイトを実行する

 

効果音の演奏 … 効果音を途中で切る

効果音が鳴っている時に◆効果音の再生:(OFF)が実行されると、
鳴っている効果音がすべて途切れて止まるぞ。

わざと途中で効果音を切りたい時に便利な小技だ。

 

条件分岐 … イベントの向きで処理を切り替え

透明なグラフィックを指定したイベントでも、きちんと向きが存在する。
アニメーションタイプを向き固定にすれば、
◆キャラクターの動作指定でしか向きが変わらなくなるぞ。

更に、◆条件分岐:このイベントが下を向いている等と組み合わせることで、
スイッチや変数を使わずにイベントの処理を切り替えていくことができる。

 

……向きを変えるには時間がかかるし(最短で1/60秒)、
他のマップへ行くと向きも戻ってしまうので、扱うのはちょっと難しいぞ。

 

条件分岐 … 実行されたくないけど残しておきたい時に

◆条件分岐:変数[0001]が変数[0001]以外という条件にすれば、
イベントの処理を残しつつ、遊んでいる時には絶対に実行されないようにできるぞ。

古いイベントの内容を参考用に残しておきたい時や、
イベント内容の説明を残しておきたい時に、ちょっと役立つかもしれない。

 

条件分岐 … 決定キーでこのイベントを開始した

名前の通り、今編集しているイベントを決定キーで調べて発生させたかが分かるぞ。

……使い道が分からない?
例えば、イベントの開始条件を"主人公が触れた時"で"重ならない"にした時。
ぶつかってきた / 話しかけたきた、の2パターンでリアクションを変えることができる。
バイクでぶつかると痛がるけど、話しかければ返事をする……なんてことができるぞ。

階段イベントなどは触れた時に設定することになるが、そうすると階段に話しかけても上り下りしてしまう。
そんな時も、◆条件分岐:決定キーでこのイベントを開始した で分岐させてやれば、
階段に話しかけても何もしない、でも触れれば上り下り、ということが可能だ。

ちなみに。
イベントの呼び出しで呼び出された場合、決定キーで始まったことにはならない。
……呼び出し元を決定キーで調べていたとしても同様だ。

 

条件分岐 … 条件分岐による二分木

大量の条件分岐を実行したいとき、ステップ数上限に達してしまう場合がある。
条件分岐の構造を工夫すると、ステップ数を大幅に削減できる。

なんとなくステップ数が少ないほうが実行時負荷減って良さそう、みたいなふんわりした目的ではなく、
ステップ数上限を回避する明確な目的がある場合にだけこの方法を使うと良い。

  • 条件分岐の中に条件分岐を入れるのを繰り返すと、エディタで開くときにとても重くなる
  • ステップ数削減が、実行時負荷を軽減するとは限らない
    上限に達しないのであれば、基本的にステップ数を気にする意味はない
具体的な方法

これを↓

◆条件分岐:変数[0001]が0
 ◆注釈:0
 ◆
:分岐終了
◆条件分岐:変数[0001]が1
 ◆注釈:1
 ◆
:分岐終了
◆条件分岐:変数[0001]が2
 ◆注釈:2
 ◆
:分岐終了
◆条件分岐:変数[0001]が3
 ◆注釈:3
 ◆
:分岐終了

こうする↓

◆条件分岐:変数[0001]が1以下
 ◆条件分岐:変数[0001]が0以下
  ◆注釈:0
  ◆
 :それ以外の場合
  ◆注釈:1
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0001]が2以下
  ◆注釈:2
  ◆
 :それ以外の場合
  ◆注釈:3
  ◆
 :分岐終了
 ◆
:分岐終了

この例では4つの条件分岐しかないので大したことないが、条件分岐の数が多くなると削減効果は劇的になる。

 

繰り返し処理の中断 … 意外な仕様

繰り返し処理の中で繰り返し処理を使う場合は、◆繰り返し処理の中断の仕様に気を付けよう。
◆繰り返し処理の中断は以下のような仕様だと推測される。

  • そのコマンドよりも下にある直近の「:以上繰り返し」(◆繰り返し処理の終端部)の直後に処理を進める
    ◆繰り返し処理
     ◆繰り返し処理の中断 ←これを実行すると、
     ◆繰り返し処理
      ◆
     :以上繰り返し
     ◆          ←ここに飛ぶ
    :以上繰り返し
    ◆

現在繰り返し処理を実行しているかどうかは◆繰り返し処理の中断の動作に影響しない。
◆繰り返し処理の中断は、制限の付いた◆指定ラベルへ飛ぶと同じだと理解しておけば大体間違いない。

 

文章オプションの変更 … ウェイト中に他のイベントを移動させる

文章オプションの変更コマンドの ウェイト中に他のイベントを移動させる にチェックを入れると、
イベント開始条件「自動的に始まる」実行中などであっても、イベントが移動してくれるぞ。
(コマンド名が紛らわしいけど、この項目だけ文章以外の処理にめちゃくちゃ影響する)

ゆめ2っきでは長いこと、チェックを入れずに開発を続けてきた(…と思う)ので、
他のマップやイベントなどに設定の変更を持ち込むと、思わぬバグの原因になってしまうかも。

あと、文章表示中、他のイベントに文章オプションの変更コマンドがあると、そこで処理を止めてしまう。
「定期的に並列処理する」で文章オプションを使う場合、稀にこの仕様が響いてくることも。

 

微妙な違い … 主人公の歩行グラフィック変更 と キャラクターの動作指定:グラフィック変更

どちらを使っても主人公の見た目を変化させられるが、
キャラクターの動作指定:グラフィック変更で変えた場合、他のマップへ移動すると元のグラフィックに戻るぞ。

 

エディターの仕様外のコマンド・仕様か怪しい挙動

ファイル名の相対パス指定

ピクチャーの表示などのファイル名指定は、"..¥pc_back"のような相対パス指定ができ、
"..¥Title¥title3_2"のように別フォルダのファイルも指定できる。

ただし、ツクール2000自体にはそれを可能とする機能がないため、TkoolBridgeなどの外部ツールによる改変が必須。
相対パス指定を補正する処理はないので、コピペ自体はツクール2000内でも可能。
ファイル名には拡張子は含まれないので注意
¥(バックスラッシュ)は / (スラッシュ)でも代替可

 

画面の瞬間スクロール

CEV[0294:【呼】瞬間スクロール]を呼び出すと、一瞬(1フレーム)で画面をスクロールできる。

  • V[4279]に横方向の画面スクロール量、V[4280]に縦方向の画面スクロール量を代入してから呼び出すと、
    任意の移動量スクロールできる。
  • V[4279]とV[4280]の両方が0の場合は、一瞬(1フレーム)でスクロールを元の位置に戻す。
  • 正規の実行環境でないと期待通りの動作をしないことがある。
    EasyRPG(0.8)では速度6の通常の画面のスクロールに置き換わる。

これを応用したコモンイベントに、CEV[0295:指定座標で画面固定]がある。
CEV0295を呼び出すと、任意の座標(V[4327], V[4328])の位置に、一瞬(2フレーム)で画面を固定できる。

スクロールにかかる時間を削減したい場合は、これらのコモンイベントを利用すると良い。

瞬間スクロールはエディタ範囲外の値を入力することでも実装できるが、
ここで紹介したコモンイベントを呼び出す形で実装することを推奨する。

余談:なぜ「画面の瞬間スクロール」はコモンイベントから起動しないといけないの?

まず、どのようにして瞬間スクロールを実現しているのかを知っておこう。
これは、CEV[0294:【呼】瞬間スクロール]内で行われている処理の一部である。

◆画面のスクロール:左に1ずらす, 速度53
◆画面のスクロール:上に1ずらす, 速度53
◆画面のスクロール:位置を元に戻す, 速度53(W)

画面スクロールの速度が、明らかに正常でない値"53"を取っていることがわかる。
この数値は、TkoolBridgeを用いて入力されている。

では、なぜ"53"にすると瞬間スクロールになるのか? それが判明していないのである。
他の値では、実行時に強制終了したり、RPGデバッガー200Xがマップを読み込めなくなってしまう。
エラーを起こさずに画面の瞬間スクロールを発生させる一番小さい値が53だった、というだけなのだ。

"53"で瞬間スクロールになる理由が未知である以上、思わぬエラーが引き起こされる可能性は0ではない。
さらに、イベントコマンド自体はRPGデバッガーを用いて検索することができないので、
もし、これが原因となる重大なバグが発見された時に、既にいろいろな箇所で使っていたとしたら、
使用箇所を全て探し出して修正するのは、途方もない作業量となる

そこで、ver0.114b パッチ1から、瞬間スクロールはCEV0294で実装することが推奨されるようになった。
コモンイベントの使用箇所はRPGデバッガーで検索可能なので、使用箇所を把握することが可能になった。

まとめると、

  • 画面の瞬間スクロールは、ツクール2000の想定外の挙動を利用している
  • 安全性が未知数であるため、万が一のことがあっても対応できるようコモンイベントを利用している

ということである。

 

遠景の変更 … 超高速スクロール

遠景の自動スクロールの移動量(1フレーム当たり何ピクセル移動するか)はこのように推測される。

移動量 = 2^(「速度」の値の絶対値 - 5 )
速度567891011121314
移動量1248163264128256512

14まではEasyRPGでも対応してる。それ以降は未検証。

TkoolBridge等を使ってエディタ範囲外の値(9以上)を指定することが可能。
これを利用するとこんなことが可能に。

  1. 遠景のスクロールを利用したアニメーション
    • 一枚の画像にアニメのパターンを2のべき乗ピクセル離して縦か横(あるいは両方)に並べて、
      スクロールさせることでアニメーションとして表示できる。
    • 画像サイズが大きくなりがちで、大きすぎると編集ソフトによっては開けなくなる点は要注意。
  2. 比較的短い時間で任意の位置に遠景を配置
    長いので折り畳み
    • 基本的な考え方。この例では遠景を0~511ピクセル横に移動させることができる。
      ◆変数の操作:[0001]代入, 任意の数(0~511)
      ◆条件分岐:変数[0001]が256以上
       ◆変数の操作:[0001]減算, 256
       ◆遠景の変更:遠景ファイル名, 横ループ(+13)
       ◆ウェイト;0.0秒
       ◆
      :分岐終了
      ◆条件分岐:変数[0001]が128以上
       ◆変数の操作:[0001]減算, 128
       ◆遠景の変更:遠景ファイル名, 横ループ(+12)
       ◆ウェイト;0.0秒
       ◆
      :分岐終了
      
      …(中略)
      
      ◆条件分岐:変数[0001]が2以上
       ◆変数の操作:[0001]減算, 2
       ◆遠景の変更:遠景ファイル名, 横ループ(+6)
       ◆ウェイト;0.0秒
       ◆
      :分岐終了
      ◆条件分岐:変数[0001]が1以上
       ◆変数の操作:[0001]減算, 1
       ◆遠景の変更:遠景ファイル名, 横ループ(+5)
       ◆ウェイト;0.0秒
       ◆
      :分岐終了
      ◆遠景の変更:遠景ファイル名
    • 511ピクセル移動させるなら、
      512ピクセル移動させてから、反対方向に1ピクセル移動させることでも実装できる。
      この考え方で上手く組んでいくと、必要な最大時間をさらに半減できる。
    • EasyRPG(0.8)では、遠景スクロールの再現性不足があるため、ズレることがある。
      このようなコマンドを最初に実行しておくとズレが解消できる。
      ◆遠景の変更:遠景ファイル名, 横ループ, 縦ループ
      ウェイト;0.0秒
    • 遠景を好きな位置に配置するには色々な方法が考えられるが、
      遠景の画像ファイルやマップ設定に影響されずに、好きな位置に配置できるのが利点。
      画像ファイルやマップ設定を調整できないときはこの方法を検討してみるとよい。
 

キャラクターの動作指定 … チップセットのグラフィックに変更

普通はキャラセットしか指定できないグラフィック変更で、チップセットのグラフィックを指定する方法。
そのうち書く

 

その他

色々なデータの上限値

RPGツクール2000で設定可能な上限値。
ただし、戦闘アニメの長さなどは2003からコピーする等で上限を超えていても動作する。

項目上限
マップ数不明
(1000以上)
マップサイズタテ500
ヨコ500
1つのマップに置けるイベント数5000
1つのイベントに作れるページ数100
変数5000
スイッチ5000
コモンイベント5000
地形ID5000
戦闘アニメ5000
1つの戦闘アニメの長さ99フレーム
(3.3秒)
 

指定してもエラーが出ないモノ

  • 存在しないファイル名のBGM・効果音 (※画像はすべてエラーが出る)
  • 範囲外の変数・スイッチ (0以下は無効化される?)
  • 範囲外・未使用のラベル番号
  • 何も表示していないピクチャー番号のピクチャー (移動・消去)
 

BGMファイルの有無を調べる小ネタ

上記の通り、存在しないファイル名のBGMを指定してもエラーは出ない。
そして存在しない場合は事実上の無音となり、再生位置は動かない。

◆変数の操作:代入, MIDIの再生位置(Tick)を使うことで
「ファイルが存在し、再生できているか?」を調べることもできる。
とはいえ、1秒以下の長さのmp3やwavだと調べられないが……。

 

プロジェクトからプロジェクトへ何かをコピー

イベント、マップチップ通行設定などをコピーした後、
別のプロジェクトを開いてもしっかりと貼り付けることができる。

作り置きしておいたものを最新版へと持っていく時に便利だ。

 

マップそのものをコピーするのなら、マップファイルそのものをコピーする方がラクだぞ。
詳しくはこの下を読んでみよう。

 

マップをコピー

マップそのものをコピーする方法は大きく分けて2つ

  1. マップツリーでマップを選択して右クリック→「コピー」→「貼り付け」(プロジェクトを跨いでも貼り付け可能)
  2. マップファイル自体を複製して、ファイルの名前を変更

2は裏技的な方法なので、いくつか気を付けたいポイントが…

  • 元に戻せないファイル操作を伴う場合は要注意。
  • マップツリーの情報はコピーされないため、マップの名前などはコピーされないし、
    マップツリーに存在しないマップIDだと、エディタで表示できなかったり、実行時にエラーを起こす。

マップファイルの名前とファイルの中身には何の繋がりもなく、マップIDはマップファイルの名前から決定される。
そのため、"Map0001.lmu"を"Map0002.lmu"という名前に変更すると、
この「元Map0001.lmu」はエディタ上でもゲーム上でも「マップID:2のマップ」として扱われる。

 

コモンイベント・マップチップ通行設定が記録されているファイル

コモンイベントやマップチップの通行設定など、
データベースで設定したものはすべて"RPG_RT.ldb"に記録されるぞ。
……なに?ファイル名の後ろに .ldb なんて書かれてないって?
右クリック→[プロパティ]でファイルの種類を確認してごらん。

ちなみに、他のファイルに記録されているのは大体こんな感じの情報だ。

ファイル名記録されてるもの
Map0001.lmu *2マップID:0001に置いてあるイベント全て、どんなチップ配置のマップか、
"マップの設定"の項目のうちマップ描画に関わる設定 (下の画像の青色の項目)
RPG_RT.ldb *3主人公のパラメーター、アイテム名、
マップチップの通行設定、コモンイベントなど、"データベース"の項目全般、
スイッチ・変数の名前と最大数
RPG_RT.lmt *4マップの並び順と、
"マップの設定"の項目のうち「マップ名」「BGM」など (下の画像の緑色の項目)
RPG_RT.ini *5ゲームの名前、編集時のズーム倍率、RTP同梱か否かのフラグなど
Save01.lsd *61番目のセーブデータそのもの
名前の数字部分を変えれば別の番号にできる
 
  • マップの設定
    青色の項目が Map****.lmu に、緑色の項目が RPG_RT.lmt に記録されている。
    mapSetting_mu_or_mt.png
 

ファイル名のイニシャルで頭出し

BGMや画像を選んでいる時、キーボードのアルファベットや数字を押すことで
その文字で始まるファイルのところまで自動的にスクロールするぞ。

例えば、キーボードの「s」を押せば
「syujinkou」「system」など、sで始まるファイルの所までスクロールしてくれる。

ファイル数が膨大な2っきでは地味に役立つ機能だ。

 

インポートを省略する

インポートをしなくても、素材の入っているフォルダにコピーすれば
同じようにツクールで使う事ができるのだ!
ただし、それぞれ特徴があるので用途に合わせて使い分けるのが良いだろう!

 インポートコピー
容量微妙に減る変わらない
画像の大きさ大きすぎると怒られる大きさは無関係
手間少しメンドウラクラク
 

処理落ちの原因を特定しよう

  • 処理落ちする可能性の高い実装
    • ファイル読み込みを伴うイベントコマンドを何度も実行する。
    • イベントコマンドを大量に実行する。
      この例ではウェイトが無いので、◆変数の操作をものすごい回数繰り返して処理落ちを発生させる。
      ◆繰り返し処理
       ◆変数の操作:[0001]代入, 0
       ◆
      :以上繰り返し
    • 比較的サイズが大きな画像のピクチャーを回転する。(RPG_RTで顕著)
       
  • 可能性は低いが処理落ちに影響することがある実装
    • ◆イベントの呼び出しを何度も実行する。
    • イベント数、イベントページ数が多いマップ。
      イベント出現条件に関わるイベントコマンドを大量に実行する場合は影響が大きい。
    • 画面に半透明なものが多い。
       
  • 処理落ちではなく、ツクールの仕様で処理が遅れる場合
    • ◆イベントの一時消去を実行したマップイベントを呼び出す。
      各コマンド(ステップ)の実行に1フレームかかる。
    • ステップ数上限に達する。
      上限に達すると、以降の処理は次のフレームに実行する。
 

変数にたくさんの情報を詰め込む

ゆめ2っきでは自由に使える変数に限りがあるので、情報をたくさん記憶しておくのは難しい。
この方法を使うと、少ない変数にできるだけ多くの情報を記憶しておくことができる。

この方法は分かりにくいので、多くのツクラーの目に触れる場所(共用マップなど)では避けたほうがいい。
他の制作者や未来の自分のために、どの変数にどんな情報を記憶しているのか注釈に書き残すことを推奨する。

やり方

変数の値を2進数として捉えると、各桁に0か1かの情報を記憶しておくことができる。
ツクール2000では変数の上限値が999999なので、変数1つに19bit分の情報を記憶できる。

2進数に限らず、3進数や4進数、桁ごとに基数が異なるような数値表現も同じ考え方で実装できる。
実装方法はこんな感じ。(2進数で考える場合は、基数のa~eが全て2になる)

桁数54321
基数edcba

5桁まで情報を記憶している場合、この変数の値は最大 (a * b * c * d * e) - 1 となる。
値が999999を超えてしまうと、情報を記憶しておくことができないので要注意。

以下、V[0001]が計算用の変数、V[0002]が情報を記録している変数、とする。

1桁目の情報を取り出す

◆変数の操作:[0001]代入, 変数[0002]の値
◆変数の操作:[0001]剰余, a
 

2桁目の情報を取り出す

◆変数の操作:[0001]代入, 変数[0002]の値
◆変数の操作:[0001]除算, a
◆変数の操作:[0001]剰余, b
 

3桁目の情報を取り出す

◆変数の操作:[0001]代入, 変数[0002]の値
◆変数の操作:[0001]除算, a * b
◆変数の操作:[0001]剰余, c
 

4桁目の情報を取り出す

◆変数の操作:[0001]代入, 変数[0002]の値
◆変数の操作:[0001]除算, a * b * c
◆変数の操作:[0001]剰余, d
 

5桁目の情報を取り出す

◆変数の操作:[0001]代入, 変数[0002]の値
◆変数の操作:[0001]除算, a * b * c * d
◆変数の操作:[0001]剰余, e
 

5桁目の情報が0なら値を記録する

◆変数の操作:[0001]代入, 変数[0002]の値
◆変数の操作:[0001]除算, a * b * c * d
◆変数の操作:[0001]剰余, e
◆条件分岐:変数[0001]が0
 ◆変数の操作:[0001]代入, 記録したい情報
 ◆変数の操作:[0001]剰余, e
 ◆変数の操作:[0001]乗算, a * b * c * d
 ◆変数の操作:[0002]加算, 変数[0001]の値
:分岐終了
 

5桁目の情報を上書きする

◆変数の操作:[0001]代入, 変数[0002]の値
◆変数の操作:[0001]除算, a * b * c * d
◆変数の操作:[0001]剰余, e
◆変数の操作:[0001]乗算, a * b * c * d
◆変数の操作:[0002]減算, 変数[0001]の値  ←これで5桁目の情報を消去した(0にした)ことになっている
◆変数の操作:[0001]代入, 記録したい情報
◆変数の操作:[0001]剰余, e
◆変数の操作:[0001]乗算, a * b * c * d
◆変数の操作:[0002]加算, 変数[0001]の値
 

この原理を分かっていれば、CEV0278【呼】2進数操作補助を使うこともできる。
詳しくはCEV0278の注釈で。

 

古い体験版向けの情報

マップやイベントの作成数に制限がついていた頃の体験版で役立つ情報。
かつてスレのテンプレとして書かれていたものをそのままコピペ。

Q 体験版だとデータベースで最大数が変えられない
A 増やしたい項目を選択し、適当な場所(空データは×)で右クリック。
  複数コピーを選択し、適当な数のコピー項目数を選択する。
  増やしたい項目の一番下で貼り付けをする。

Q 他人の作ったマップにイベント追加できない
A イベント三百個のマップを用意。「イベントを増やしたいマップ」と
  イベント三百個のマップを全く同じにする。
  Map(xxxx).lmu(イベントを増やしたいマップ)をフォルダの外へ捨てる。
  Map(yyyy).lmu(イベント三百個のマップ)の名前をMap(xxxx).lmuと同じにする。

Q スイッチと変数増やしたい
A まず2003体験版でプロジェクト作成
  今作ってるゲームのRPG_RT.ldbをそのプロジェクトのRPG_RT.ldbに上書き。
  その後データベースを開き、キャンセル、そして一回開いたら、
  データベースが今作っているゲームと同じになる。
  後はスイッチ変数増やしまくりんぐ
  OKすると確認画面出るが承知でやってるのでOK。
  後はそのプロジェクトのRPG_RT.ldbをコピーして自分のゲームに上書きして終わり

Q 体験版でもピクチャーを50枚使いたい
A まず、2k3体験版でプロジェクト作って、適当なピクチャーをインポートする。
  んで、データベースのコモン(もしくはマップイベント)を開き
  「ピクチャーの表示」で21~50番のピクチャー表示のコマンドを一個づつ作る。
  続いて21~50番のピクチャーの消去、ピクチャーの移動のコマンドを作る。
  んで全選択してコピー。2kに貼り付ければ完璧
  後はコピーしてきた奴を弄くればおk。
  ピクチャー番号いじらなければその後も設定変更し放題
 

◆豆知識EX 非参加者むけ
ショートカットを上手く使うとツクールを入れなくても
デバッグモードで起動できる。ただ、ツクールを入れるついでに
参加したいという人を増やすため、あえてやり方は割愛する。


*1 メニュー画面を開閉すると、画面の暗転が解除される
*2 LcfMapUnitの略、Lcfはルシファー(Lucifer)の略らしい
*3 LcfDataBaseの略
*4 LcfMapTreeの略、なおコレが破損するとツクールで開けなくなる
*5 INItializationの意
*6 LcfSaveDataの略