コモンイベント例

こういう処理を作りたい、というときの組み方の例。
文字列の半角【¥】はフォントの都合で【\】表記になりますので、間違えの無いようお願いします。

乱数が偏るような気がするとき

セーブしてロードしても同じ結果ばかり出る、同じ行動したら同じ結果になる、この数字の後にはこの数字しか出ない、乱数おかしくない?というとき。
細かい話は省きますが、乱数を使う(演算子【~】の使用か、呼び出し値8000000+XX)ときとゲーム初回起動時に乱数のシード(\sys[110])が決定・変更されます。逆に言うとそのタイミングでしか変更されないので、なんだか同じような展開になるなーという現象が起こります。

解決策1:毎フレーム乱数の無駄遣い

■変数操作: CSelf0 = 0 ~ 0

使うと変更されるなら、毎フレーム乱数使いましょう。1フレームに1コマンド増えるだけなので、処理が重くなったりはしません。
この1行だけのコモンを作って、並列常時でどこかに置いておきましょう。フレーム単位で同じ動きをしない限り、違う結果になります。

解決策2:シード値の変更

■変数操作: Sys110:現在の乱数のシード(種) = Sys80:現在の[時] * 10000
■変数操作: Sys110:現在の乱数のシード(種) += Sys81:現在の[分] * 100
■変数操作: Sys110:現在の乱数のシード(種) += Sys82:現在の[秒] + 0

セーブ/ロード時だけでいいという場合は、ロード時だけの処理(後述)でシステム変数110番に直接数字を入れてしまいましょう。上の例では10時25分59秒の場合【102559】という数字がシードになるので、その後同じ行動しても違う結果になります。

ロード直後だけ処理

データをロードした時だけの処理(並列コモンリセット、表示していたピクチャの消去、セーブ改造対策のチェック、日時改変チェック、セーブデータごとのバージョンチェック、久しぶりにロードした場合あらすじ機能、などなど)の実装。

コモン1:セーブ処理に追加

■データのセーブ: 1
■セーブデータに書き込み:セーブデータ[1]の V9-0[ロード直後] = 1

【ロード直後】のような変数を通常/予備変数に作っておき、セーブしたデータに直接書き込む。

コモン2:自動実行(起動条件: V9-0[ロード直後] = 1のとき)

▼ 行ないたい処理をここに書く
■変数操作: V9-0[ロード直後] = 0 + 0

自動実行でその変数が1のときに起動するようにすれば実装できます。実行後は変数を0に戻しましょう。

キーが離されたら抜ける

キー入力を受け付けた後、押しっぱなしだと何回も判定されてしまう時の保険的な処理。

■ループ開始
|■キー入力:CSelf0 4方向 決定(10) キャンセル(11) サブキー(12)
|■条件分岐(変数): 【1】 CSelf0 が 0 と同じ
|-◇分岐: 【1】 [ CSelf0 が 0 と同じ ]の場合↓
| |■ループ中断
| |■
|◇分岐終了◇
|■ウェイト:1 フレーム
|■
◇ループここまで◇◇

指定されたキーが離されたら抜けるループなので、自作メニューなど使う場合は必須な処理だと思っています。

はみ出す時だけ縮小

メニューとか文章表示とか、文字列ピクチャを既定の幅に収めたいときなどに。まずピクチャ表示してから現在の幅を変数操作+の【ピクチャ番号】の【画像サイズ(幅)】で取得して、以下の処理で計算。

■変数操作: CSelf4[拡大率] = CSelf1[最大] * 100
■変数操作: CSelf4[拡大率] /= CSelf0[現在] + 0
■変数操作: CSelf4[拡大率] 上限= 100 + 0

横幅を拡大率にすれば、その範囲に収まります。3行目が無い場合は、幅が足りない場合広がっちゃうので注意。

テストプレイ中だけの処理

テストプレイ中(エディタからゲームを起動したとき)だけの処理を作りたいとき。

■条件分岐(変数): 【1】Sys112:[読]テストプレイ中?(1=YES) が 1と同じ
-◇分岐: 【1】 [ Sys112:[読]テストプレイ中?(1=YES) が 1と同じ ]の場合↓
|■
◇分岐終了◇

処理のコメントアウト

いったん消したいけどまた書き直すのもなー、どうしよう。というとき。

■回数付きループ [ 0 ]回
|■
◇ループここまで◇◇

回数付きループ0回の中に切り取って入れれば、いったん消えます。復活するときは1回にすればOK。デバッグ時にも便利。

お手軽ウィンドウのサイズ変更

お手軽ウィンドウをなめらかに拡大縮小させたいとき、ピクチャ【移動】だと生成サイズがグレーアウトして入力できません。

■ピクチャ表示:1 [左上]ウィンドウ「file」サイズ[100,100] X:CSelf10[X] Y:CSelf11[Y] / 拡 CSelf12[幅]xCSelf13[高さ]%

サイズを100*100にして、実際のサイズを拡大率(横)と拡大率(縦)に入力して【表示】すれば、ピクチャ【移動】でXフレームかけてなめらかに変形させることができます。

マウスクリック受け付け

マウスクリックの状態取得は2種類あります。

■キー入力:CSelf0 マウス 左クリック(20)
■変数操作+: CSelf0 = マウス左クリック状態

キー入力の場合、マウスが左クリックされたら【20】が入ります。
変数操作+の場合、マウス左クリックが新たに押された場合だけ【2】、長押し中の場合【1】、押されていない場合【0】が入ります。
押している間ずっと処理するときはキー入力、押されたら1回だけ処理したい場合は変数操作+、のように使い分けると便利。

■キー入力:CSelf0[入力待ち] マウス 左クリック(20)

入力待ちのキー入力でもいいんですが、入力待ちで止まってほしくない(並列なしでマウスオン処理とかしたい)場合は変数操作+のほうが簡単。

自作選択肢カーソル位置

自作選択肢を作るときのカーソル位置。一定の範囲内をループしたいとき。(例:4-5-6-7-4-5-…)
セルフ0-3を入力値、セルフ4を戻り値とする以下のようなコモンを作っておく。

■変数操作: CSelf10[割る数] = CSelf1[最大] - CSelf0[最小]
■変数操作: CSelf10[割る数] += 1 + 0
■変数操作: CSelf4[返り値] = CSelf2[現在] + CSelf3[増減]
■変数操作: CSelf4[返り値] -= CSelf0[最小] + 0
■変数操作: CSelf4[返り値] += CSelf10[割る数] + 0
■変数操作: CSelf4[返り値] %= CSelf10[割る数] + 0
■変数操作: CSelf4[返り値] += CSelf0[最小] + 0

あとはキーの受け付けと描画処理を足せば、選択肢がすっきり書けます。

■変数操作: CSelf10[最小] = 4 + 0

■変数操作: CSelf11[最大] = 7 + 0

■変数操作: CSelf12[カーソル位置] = 4 + 0

■ループ開始

|■キー入力:CSelf20[キー入力][入力待ち] 4方向 決定(10) キャンセル(11)

|■条件分岐(変数): 【1】 CSelf20[キー入力] が 2 と同じ 【2】 CSelf20[キー入力] が 8 と同じ 【3】 CSelf20[キー入力] が 10 以上

|-◇分岐: 【1】 [ CSelf20[キー入力] が 2 と同じ ]の場合↓

| |■変数操作: CSelf13[増減] = 1 + 0

| |■イベントの挿入[名]: CSelf12[カーソル位置] = ["選択肢カーソル位置"] <コモンEv 27> / CSelf10[最小] / CSelf11[最大] / CSelf12[カーソル位置] / CSelf13[増減]

| |■イベントの挿入[名]: ["選択肢カーソル描画"] <コモンEv 28> / CSelf12[カーソル位置]

| |■

|-◇分岐: 【2】 [ CSelf20[キー入力] が 8 と同じ ]の場合↓

| |■変数操作: CSelf13[増減] = -1 + 0

| |■イベントの挿入[名]: CSelf12[カーソル位置] = ["選択肢カーソル位置"] <コモンEv 27> / CSelf10[最小] / CSelf11[最大] / CSelf12[カーソル位置] / CSelf13[増減]

| |■イベントの挿入[名]: ["選択肢カーソル描画"] <コモンEv 28> / CSelf12[カーソル位置]

| |■

|-◇分岐: 【3】 [ CSelf20[キー入力] が 10 以上 ]の場合↓

| |■ループ中断

| |■

|◇分岐終了◇

|■

◇ループここまで◇◇

配列

ウディタで配列使えないよね?という話題は定期的に見かける気がしますが、配列を使いたい目的によっては使えます。ちょっと工夫が必要ですが。

文字列変数で仮想配列

■文字列操作:CSelf5[配列] = "1,2,3\n4,5,6\n7,8,9"
■変数操作: CSelf10[行番号] = 2 + 0
■変数操作: CSelf11[列番号] = 3 + 0
■回数付きループ [ CSelf10[行番号] ]回
|■文字列操作:CSelf6[内容] =<上1行切出> CSelf5[配列]
|■
◇ループここまで◇◇
■文字列操作:CSelf6[内容] =<から文字列を置換> "," → "\n"
■文字列操作:CSelf5[配列] = CSelf6[内容]
■回数付きループ [ CSelf11[列番号] ]回
|■文字列操作:CSelf6[内容] =<上1行切出> CSelf5[配列]
|■
◇ループここまで◇◇

※文字列【\n】は、【改行】です。イベントコマンドの表示だとこれらは区別できないのでご了承ください。

配列を、適当な区切り文字と改行で表現します。
【6】を取り出したいときは、2行目の3番目なので、まず2回【上一行切り出し】で2行目を取り出します。(この時点で内容には【4,5,6】が入っています。)
次に【,】を【改行】に置換します。(4【改行】5【改行】6になる)
同じく3番目を取り出すので、3回【上一行切り出し】で3行目を取り出すと、内容には【6】が入っています。

※この書き方だと配列の始まりは【1】になります
※内容は文字列なので、数値にしたい場合は【変数操作】CSelfXX=1600006(呼び出し値による変換)が必要。

■文字列操作:CSelf5[配列] = "1-2-3,4-5-6,7-8-9\n10-11-12,13-14-15,16-17-18"

■変数操作: CSelf10[行番号] = 2 + 0

■変数操作: CSelf11[列番号] = 1 + 0

■変数操作: CSelf12[3次元め] = 2 + 0

■回数付きループ [ CSelf10[行番号] ]回

|■文字列操作:CSelf6[内容] =<上1行切出> CSelf5[配列]

|■

◇ループここまで◇◇

■文字列操作:CSelf6[内容] =<から文字列を置換> "," → "\n"

■文字列操作:CSelf5[配列] = CSelf6[内容]

■回数付きループ [ CSelf11[列番号] ]回

|■文字列操作:CSelf6[内容] =<上1行切出> CSelf5[配列]

|■

◇ループここまで◇◇

■文字列操作:CSelf6[内容] =<から文字列を置換> "-" → "\n"

■文字列操作:CSelf5[配列] = CSelf6[内容]

■回数付きループ [ CSelf11[列番号] ]回

|■文字列操作:CSelf6[内容] =<上1行切出> CSelf5[配列]

|■

◇ループここまで◇◇

このように区切り文字を工夫すれば、3次元以上の配列も扱えます。ただ、2次元や3次元以上の配列を文字列に入力する処理のほうが複雑になります。動的に使いたいなら、配列の宣言(名称と大きさの決定、空の配列生成)コモンと、任意の配列に入力するコモン(配列[a,b]の位置にcを代入)が必要になるので大変。また、文字列の切り出しを大量に使うので(数値の処理に比べて)重くなり、頻繁に使うようならおすすめできません。

可変DB使用

可変データベースなら、タイプ1つにつきデータ数10,000項目数100使えるので、2次元配列までなら素直に可変DB使ったほうがいいです。収まらないようなら、データの仕様変更をおすすめします。

データベース項目種類判定

可変・ユーザ・システムの各データベースの項目が数値か文字列かを知りたいとき。

■変数操作: CSelf10[呼び出し値] = 1000000000 + 0  //100万以上の大きい数値には【データを呼ばない】にチェックが入っています、以下同じ

■変数操作: CSelf10[呼び出し値] += CSelf0[種類] * 100000000

■変数操作: CSelf10[呼び出し値] += CSelf1[タイプ] * 1000000

■変数操作: CSelf10[呼び出し値] += CSelf2[データ] * 100

■変数操作: CSelf10[呼び出し値] += CSelf3[項目] * 1

■文字列操作:CSelf5[判定文字列] = 位置[CSelf10[呼び出し値]]の文字列

CSelf0[種類]には、ユーザ[0]・可変[1]・システム[3]で選択できるようになっています。データベースの呼び出し値を計算して、文字列操作の【ロード位置を変数で指定】で呼んでやると、文字列の場合はその文字列が入り、数値の場合は<<ERROR>>という文字列が入ります。
なので、判定文字列が<<ERROR>>と同じ場合はその項目は数値、それ以外は文字列となります。

条件分岐【X~Yの間】

例えば【2以上6以下】は普通に書くと以下になります。

■条件分岐(変数): 【1】 CSelf0 が 2 以上

-◇分岐: 【1】 [ CSelf0 が 2 以上 ]の場合↓

|■条件分岐(変数): 【1】 CSelf0 が 6 以下

|-◇分岐: 【1】 [ CSelf0 が 6 以下 ]の場合↓

| |▼ ここが2以上6以下

| |■

|◇分岐終了◇

|■

◇分岐終了◇

ちょっと工夫すると以下。

■条件分岐(変数): 【1】 CSelf0 が 2 未満 【2】 CSelf0 が 6 超

-◇分岐: 【1】 [ CSelf0 が 2 未満 ]の場合↓

|■

-◇分岐: 【2】 [ CSelf0 が 6 超 ]の場合↓

|■

-◇上記以外

|▼ ここが2以上6以下

|■

◇分岐終了◇

ぱっと見は分かりづらいですが、分岐ひとつで実装できます。可読性低いのでコメント推奨。

数値をひと桁ずつ取り出す

■変数操作: CSelf0[元の数値] = 12345 + 0

■変数操作: CSelf10[1] = CSelf0[元の数値] / 1

■変数操作: CSelf11[10] = CSelf0[元の数値] / 10

■変数操作: CSelf12[100] = CSelf0[元の数値] / 100

■変数操作: CSelf13[1000] = CSelf0[元の数値] / 1000

■変数操作: CSelf14[10000] = CSelf0[元の数値] / 10000

■変数操作: CSelf10[1]~CSelf14[10000] %= 10 + 0

10進数なので、10のn乗で割って10の剰余(ウディタでは演算【%】)を計算すると、(n+1)桁目の数字が出ます。

■変数操作: CSelf20[呼び出し値] = 1600010 + 0

■変数操作: CSelf21[桁数] = 5 + 0

■変数操作: CSelf22[割る数] = 1 + 0

■回数付きループ [ CSelf21[桁数] ]回

|■変数操作: V[CSelf20[呼び出し値]] = CSelf0[元の数値] / CSelf22[割る数]

|■変数操作: V[CSelf20[呼び出し値]] %= 10 + 0

|■変数操作: CSelf20[呼び出し値] += 1 + 0

|■変数操作: CSelf22[割る数] *= 10 + 0

|■

◇ループここまで◇◇

一般化したい、もしくは桁が多いときはコモンセルフの呼び出し値を使って、ループで繰り返し処理するといいです。

■変数操作: CSelf21[桁数] = 5 + 0

■変数操作: CSelf22[割る数] = 1 + 0

■変数操作: CSelf23[現在の桁] = 1 + 0

■回数付きループ [ CSelf21[桁数] ]回

|■変数操作: CSelf24[この桁の数値] = CSelf0[元の数値] / CSelf22[割る数]

|■変数操作: CSelf24[この桁の数値] %= 10 + 0

|■可変DB書込:DB[ 桁 : CSelf23[現在の桁] : 数値 ] (0 : - : 0) = CSelf24[この桁の数値]

|■変数操作: CSelf22[割る数] *= 10 + 0

|■変数操作: CSelf23[現在の桁] += 1 + 0

|■

◇ループここまで◇◇

もしくはCDB使えば綺麗になります。同じような処理ですが、呼び出し値は少し重めな処理なのと可読性低めなので、データベースのほうが無難。

時刻表示

Sys30(プレイ時間ミリ秒単位)や、変数操作+で取得できる【BGMの現在再生位置(ミリ秒)】など、ミリ秒(1/1,000=0.001秒)を時刻に変換したい場合があります。

■変数操作: CSelf19[ミリ秒] = 123456789 + 0

■変数操作: CSelf20[時] = CSelf19[ミリ秒] / 3600000

■変数操作: CSelf20[時] %= 24 + 0

■変数操作: CSelf21[分] = CSelf19[ミリ秒] / 60000

■変数操作: CSelf21[分] %= 60 + 0

■変数操作: CSelf22[秒] = CSelf19[ミリ秒] / 1000

■変数操作: CSelf22[秒] %= 60 + 0

■デバッグ文:\cself[20]:\cself[21]:\cself[22]

1秒=1000ミリ秒、1分=60秒*1000ミリ秒、1時間=60分*60秒*1000ミリ秒なので、割る数はそれぞれ上のような感じになります。しかし、これでは10の位が0のときに表示が微妙になる(1時間2分3秒が1:2:3となり時刻に見えない)ので01:02:03のようにしたい場合は前に示した【桁を取り出す】を使ってそれぞれ10で割って10の剰余でひと桁ずつ取り出してやれば表示が整います。追加するコマンド文は以下。

■変数操作: CSelf10[10時] = CSelf20[時] / 10

■変数操作: CSelf10[10時] %= 10 + 0

■変数操作: CSelf11[1時] = CSelf20[時] % 10

■変数操作: CSelf12[10分] = CSelf21[分] / 10

■変数操作: CSelf12[10分] %= 10 + 0

■変数操作: CSelf13[1分] = CSelf21[分] % 10

■変数操作: CSelf14[10秒] = CSelf22[秒] / 10

■変数操作: CSelf14[10秒] %= 10 + 0

■変数操作: CSelf15[1秒] = CSelf22[秒] % 10

あとは1日が24時間、1週間が7日、までの計算なら上の応用でできます。

UNIX時間を時刻表記

1970/01/01 00:00:00を0として、1秒増えるごとに1を足すような時間表記のことを【Unix時間】といい、あちこちで使われていたりします。日付の計算はうるう年や月の日数が複雑なため難しいので、以下にUnix時間を含む時刻を扱うコモンを置いておきます。複雑なものはあらかじめ計算してデータベースに置いてあるため、それほど重い処理ではないはずです。興味があればコモンにコメントも書いてあるので見てみてください。

汎用時刻コモン

ピクチャ表示位置判定

ピクチャの表示位置(左上、左下、中心、右上、右下)を判定する方法。本来はDBなどで管理すべきですが、どうしようもなくなったらこちら。

変数操作+で座標を取得すると、左上表示なら左上の座標が出ます。1フレームの間にシステム変数71と72でマウスカーソルを上下左右1ピクセルずつ動かして、変数操作+【マウス重なってる?】を判定すると、左上表示の場合は【左】と【上】に動かしたときに【重なっていない】と判定されます。中心ならすべて【重なってる】判定になります。以下がコマンドです。

■文字列操作:CSelf5[位置] = ""

■変数操作+: CSelf10[X] = ピクチャ:CSelf0[ピクチャ番号] の X座標

■変数操作+: CSelf11[Y] = ピクチャ:CSelf0[ピクチャ番号] の Y座標

■変数操作: Sys71:マウスX位置 = CSelf10[X] - 1

■変数操作: Sys72:マウスY位置 = CSelf11[Y] + 0

■変数操作+: CSelf12[重なってる?] = ピクチャ:CSelf0[ピクチャ番号] の マウス重なってる?(1=YES)

■条件分岐(変数): 【1】 CSelf12[重なってる?] が 0 と同じ

-◇分岐: 【1】 [ CSelf12[重なってる?] が 0 と同じ ]の場合↓

|■文字列操作:CSelf5[位置] += "左"

|■

◇分岐終了◇

■変数操作: Sys71:マウスX位置 = CSelf10[X] + 1

■変数操作: Sys72:マウスY位置 = CSelf11[Y] + 0

■変数操作+: CSelf12[重なってる?] = ピクチャ:CSelf0[ピクチャ番号] の マウス重なってる?(1=YES)

■条件分岐(変数): 【1】 CSelf12[重なってる?] が 0 と同じ

-◇分岐: 【1】 [ CSelf12[重なってる?] が 0 と同じ ]の場合↓

|■文字列操作:CSelf5[位置] += "右"

|■

◇分岐終了◇

■変数操作: Sys71:マウスX位置 = CSelf10[X] + 0

■変数操作: Sys72:マウスY位置 = CSelf11[Y] - 1

■変数操作+: CSelf12[重なってる?] = ピクチャ:CSelf0[ピクチャ番号] の マウス重なってる?(1=YES)

■条件分岐(変数): 【1】 CSelf12[重なってる?] が 0 と同じ

-◇分岐: 【1】 [ CSelf12[重なってる?] が 0 と同じ ]の場合↓

|■文字列操作:CSelf5[位置] += "上"

|■

◇分岐終了◇

■変数操作: Sys71:マウスX位置 = CSelf10[X] + 0

■変数操作: Sys72:マウスY位置 = CSelf11[Y] + 1

■変数操作+: CSelf12[重なってる?] = ピクチャ:CSelf0[ピクチャ番号] の マウス重なってる?(1=YES)

■条件分岐(変数): 【1】 CSelf12[重なってる?] が 0 と同じ

-◇分岐: 【1】 [ CSelf12[重なってる?] が 0 と同じ ]の場合↓

|■文字列操作:CSelf5[位置] += "下"

|■

◇分岐終了◇

■条件分岐(文字): 【1】 CSelf5[位置]が "" と同じ

-◇分岐: 【1】 [ CSelf5[位置] "" と同じ ]の場合↓

|■文字列操作:CSelf5[位置] += "中心"

|■

◇分岐終了◇

コモンは以下。ただし、1ピクセルの大きさの画像は正常に判定できません。

ピクチャ表示位置判定コモン

以下作成中

作成中です