【MZ】日付天候システム
サンプルプロジェクトDL 2023/04/18 更新
◆暦システムの基礎 2023/05/10 修正
執筆者:神凪洸
ゲーム世界のようなきれーな場所で、のんびりと暮らす……。憧れですよね。
そんな世界にも暦は存在するわけで。
暦システムを作る時、皆さんまずはプラグイン素材を探しますよね。
ええ、ええ。簡単に見つかりますとも。設定も楽ちんだぜ!ありがてぇありがてぇ。
で、実際に実装してみたけどなんかこう……色々足りない!!!
そう、あくまで暦を作って暦を表示するだけなのだ!!!
そういうプラグイン多いと思います。素材は汎用的なものなので仕方ないことなんです。
そして、今回別の講座にて「畑システム」を作りました。
このシステム拡張性があって大変便利なんすけど、既存の暦プラグインではどうにもこうにもならん!!ってことで自作するしかありません。
本システムはこういう感じのが作れます。これ単体でも勿論使えます。
◆当講座の日付天候システムの仕様
■機能あり
- 季節の概念
- 月の概念(当講座では季節=月の仕様)
- 年の概念
- 全ての月は一ヶ月=31日で固定(日にち自体は何日でも可)
- 曜日の概念(当講座では4曜日 曜日数はいくつでも可)
- 24時間制
- 時間経過の速度指定は自由(リアルタイムもできる)
- 指定の月日や時間に変更(過去に指定も可)
- 時間の一時停止
- 時間の表示は針表示でも数字表示でも可
- 季節や時間と紐付けられた天候指定
- 天候は一日固定。晴れなら一日中晴れ
- 天候アニメは屋内屋外で自動切り替え
- 天候の種類は自由
- 特定MAPによって天候が変化(雨の日に雪国に行くと雪に変わる等)
- 時間で画面色調変化
- MAP上に表示される日付天候のグラフィック自由(数字も全て画像化)
- 天気予報
- 天候の強制変更
- 白黒洋菓子店の畑システムとの併用(雨の日だと水やりが自動的にされるとかで利用)
■機能なし(システムを理解すれば、実装は可能)
- 閏年
- 月毎に日数が違う(リアル暦のように1月は31日まで、4月は30日までのような事)
- 時間で画面色調変化の際、特定MAPで基本指定とは違う色調に変更
- 時間で天候が変化していく(天気予報も再構築する必要あり)
◆下準備
■コモンイベントの用意
「暦システム」「日/曜日 画像更新」「時間画像更新」「天候画像更新」「天候再生」の5つ。
「時間天候 画像更新」は時間や季節で天候画像を変更する場合用。不要な場合は作成しなくてもよい。
■スイッチと変数の用意
【スイッチ】
「暦システム」「ベッドで日付変更用」「昼OFF/夜ON」「春」「夏」「秋」「冬」「室内天候」の8つ。
「砂漠天候」「雪国天候」などは、特定MAPによって天候を変える場合用。必要な分用意してね。
【変数】
「年」「月」「日」「曜日」「時間」「分」「【配列】天候」「天候配列取得位置」
の8つを確保しましょう。
ポイントヽ(`Д´)ノ
各変数には数値だけでなく直接、文字列を代入させて使う事がある!
「年」や「日」は数値のみですが
「月(季節)」や「曜日」は直接、"春"や"冬"、"火曜日"や"日曜日"と文字列を入れ込むっす。
もちろん、数値で1の時は月曜日、2の時は火曜日としてもいいんすけど
後々メニュー画面や会話など、なんらかの場面で制御文字を使用する場合に便利なので。
後は単純に条件分岐の視認性が上がるという面もあり。
◆暦システムの基礎
【サンプルプロジェクト コモンイベントID32】
コモンイベント「暦システム」では、時間や月日曜日などの基本的な部分の処理を作るっす。
このコモンイベントは、スイッチ「暦システム」がONの時に並列で処理されるぞ。
これでスイッチON/OFFするだけで暦システムの停止が出来るのだ!
↓実際の処理内容はこうだ!↓
24時間制!ゲーム内1分は60フレーム(1秒)!曜日は4種類!一年4ヶ月(季節と合併)!
条件分岐で変数「分」が60になったら変数「時間」がプラス1されるぞ。
ただし「時間」が23だったら0にするぞ。
そして「時間」が0になったら日にちと曜日と天候を更新するぞ。
さらにさらに日にちが一ヶ月の最大日(サンプルでは31)だったら月を更新するぞ。
曜日が最後の曜日だったらまた最初の曜日に更新するぞ。
またまたさらに月が一年最後の月(サンプルだと冬)だったら年をプラス1するぞ。
しかもしかも、昼間になったら夜間になったら画面色調も変えちゃうんだぞ。
条件分岐終わり!
時間の経過間隔を決めるぞ。1分=1秒にしたぞ。
と、雑に言うとこういう事をコモンイベント「暦システム」では行っています。
細かい解説はサンプルプロジェクト通りなので、そちらを参照してください。
◆画像の用意
本システムではあらゆるものが全て画像で表示させるので、サンプルプロジェクトの「pictures」フォルダにある画像を参考に自分好みのものを作ってね。
◆暦システムを表示する画像の座標を決める
用意した画像をMAP画面内のどこに表示するか?それをまず決めましょう。
テキトーなMAPで日付天候で使う画像を表示するイベントを作って
地道にエディタとテストプレイを繰り返して調整だ!
ポイントヽ(`Д´)ノ
最大数の表示で位置調整せよ!
日にちは1~31日など、一桁と二桁の時があるっすね。
また、使用するフォントによっても一桁目と二桁目の空白バランスが変わったりも……。
年を表示するなら999年?それとも9999年?!
こういったのを想定して、全て表示した場合の状態で位置調整しましょう。
◆画像の更新
【サンプルプロジェクト コモンイベントID33~36】
お次は実際に画面に表示させる為の処理っす。
■日/曜日 画像更新(コモンイベントID33)
すでに暦システムで必要なデータは各変数に入っているので
ひたすら条件分岐で画像指定していくだけ。
前段階で画像の位置は決まってる筈なので、コピペで指定画像だけを変更していけばおk。
■時間 画像更新(コモンイベントID34)
時間表示はサンプルプロジェクトのような時計盤っすか?それともデジタル?
時計盤であれば0時と12時は同じ画像になるので、条件分岐のスクリプトで変数「時間」が0又は12の時 という感じで分岐させてるっす。
デジタルであれば、普通に「時間」が0だったら、12だったらで分岐させればおk。
画像更新の後に指定時間毎に行う処理を入れるっす。
昼と夜でわけるとか、一日の始まりの時間に畑成長更新フラグをONにするとか。
■天候 画像更新(コモンイベントID35)
このコモンイベントではスクリプトコマンドで諸々の処理を行っています。
理由は配列を利用している為っす。→配列とは?
変数「【配列】天候」と変数「天候配列取得位置」を使うっすよ。
●「【配列】天候」の仕様
初期値は["晴れ","晴れ","雨","曇り","晴れ"];となってるっす。
配列1番目は、本日の天候。配列2番目からは予報となるっす。
つまり、明日から4日分の天候が予め決められてるっす!
サンプルでは4日ですが、7日でもなんなら30日分でもいくらでもおk。
ただ予報が多ければ多いほど設定が大変になるので一般的な7日までがいいでしょう。
初期値["晴れ","晴れ","雨","曇り","晴れ"];で言えば["今日","4日後","明日","明後日","明々後日"];という事になるっす。
●「天候配列取得位置」で配列の参照位置を決める
そういうわけで、このコモンイベントは更新が行われた時に呼び出されるので
必要なのは「明日」の天候っすね。
明日に該当するのは一番最初は配列3番目。その次は4番目、5番目……となっていくっす。
そして5番目が参照されていたら、次の日は2番目になるので……
n = $gameVariables.value(48)//天候配列取得位置
if(n == 4){//配列の5番目の数値を参照していたら2番目を参照させる
n = 1;
}else{//5番目でなければ1加算して、次の配列を参照させる
n += 1;
};
という風に書くことになるっす。
配列取得位置を「n」という箱に取得したら、天候配列取得位置にその数値を代入しましょう。→$gameVariables.setValue(48,n);
これで明日の天候を呼び出す準備はおk。
●天候を代入する
条件分岐で配列に入っている天候が〇〇だったら、この画像を表示させるという条件分岐を
ひたすらスクリプトで書いていく。
そして配列0番目に天候を代入してあげましょう。これで今日の天候が更新されるぞ。
設定が終わったら、コモンイベント「天候再生」を呼び出せば、画面も変わるようになるっす。
●天気予報を更新する
明日の天候はこれで使われたので、明日にあった天候を今度は4日目の天候として新しく入れてあげる必要があるっすね。
適当にランダムで代入してもいいけど、季節の概念があるなら当然なりやすい天候というものがあるっす。
夏なら台風が来やすいとか、同じ季節内でも後半になると次の季節の天候が低確率でなるとか、梅雨とか。
この部分は色々やり方があるので、サンプルプロジェクトは一例として見てくださいっす。
まず最初に乱数でテキトーな変数に数値を入れる。
次に季節ごとに入れる天候を条件分岐で決めて、最初に決めた乱数の結果で
ランダム性を持たせてあげる。
これがサンプルプロジェクトでの作り方。
■時間天候 画像更新(コモンイベントID36)
サンプルプロジェクトの注釈に書いてあるとおり
このコモンイベントでは、季節や時間帯毎に画像を変更させる場合用っす。
もちろん、それぞれのコモンイベントに複合してしまってもいいんすけど
このコモンイベントが不要な場合の時用で別個にしてあります。
例:昼は太陽マーク、夜は月マーク
例:春秋冬の晴れは同じだけど、夏の晴れの時はギラギラ感のある画像になる
◆天候再生
天候を自動的に再生させる処理をまとめたものっす。
注釈に書いてある通り、屋内屋外で再生ON/OFFとか特定MAPで切り替わるとか。
基本的には場所移動の際に必要なスイッチ(「屋内天候」「砂漠天候」「雪国天候」など)をON/OFFしておくっす。
その後にコモンイベント「天候再生」を呼び出すことで半自動的に切り替えられるっす。
屋内に入ったら環境音が小さくなったり、外に出たらでかくなったり
天候エフェクトの再生をどうのこうのしたりとか。
必要な分だけ、条件分岐させて用意してくださいっす。
◆初期化
【サンプルプロジェクト MAP「事前準備」】
テストプレイする前に正しく表示させる為に初期化を行いましょう。
(;・∀・){これでシステムは完成だ!さぁ、テストプレ……
ヽ(`Д´)ノ{まぁったァァァァ!!!
(^ω^){スタートは何月何日の何曜日で何時何分の天気はなんですかぁ???
(´・ω・`){なにその小学生の台詞感……
(^ω^){え?地球が何回まわったって????
■各種変数にスタート日を設定
「月(季節)」と「曜日」には直接文字列を代入しちゃってね。
「【配列】天候」では、今日と予報分の配列を作るっす。
予報が4日分なら、4+今日分で配列は5番目まで必要っすね。
1番目にはスタート時の天候を。2番目からは明日以降の天候を入れるっす。
「天候配列取得位置」は必ず1にしましょう。
そして該当季節のスイッチもONに設定しておくのを忘れずに。
注意ヽ(`Д´)ノ
配列2番目は4日目の天候!
最初は2番目が明日ではないんす。3番目が明日に該当するんす。
そして何番目=明日でもないよ!!配列はどんどん上書きされていくので
その時々で変わるっす。
■画像の設定
日付天候で使う画像を全て表示させておきましょう。
◆完成
(;・∀・){ヨシ!動いたぞ!更新もされてるぞ!
(・∀・){やったね!でもまだ、作るものあるよね?
■場所移動
場所移動時にスイッチ「室内天候」の切り替えを忘れずに。
このスイッチ処理の後にコモンイベント「天候再生」を呼び出しましょう。
コモンイベントは場所移動後でも前でも自分が自然だと思う方で。
■時間の指定
【サンプルプロジェクト MAP「家」ベッド】
ベッドで寝たら翌日になるとか、特定の日に変えたい場合。
まずスイッチ「暦システム」をOFF、スイッチ「ベッドで日付変更用」をON!
画像等の更新を行わせるため、指定する時間の直前に変数「時間」「分」をセット。
朝5時にしたいなら、4時59分とか。
そしてスイッチ「暦システム」「ベッドで日付変更用」を切り替えてオシマイ。
ポイントヽ(`Д´)ノ
翌日にする場合は変更する時の時間に注意!
0時~23時の間の時に変更する場合は、月日天候等の更新が必要になるので
最初に強制的に23時59分とか58分とか日付が変わる直前の時間にセットするっす。
そしてスイッチ「暦システム」をONにして更新処理が終わるタイミングで再びスイッチOFF。
この処理の後に本来の時間指定イベントを行いましょう。
ポイントヽ(`Д´)ノ
完全に指定した時間で暦システムを止めたい時は全部手動!
暦システムを一時停止した状態のままでピッタリ指定時間にしたい場合は
各種変数や画像は全て手動で指定してあげましょう。
■天気予報
【サンプルプロジェクト MAP「家」ベッド横の鏡】
予報分の変数を用意しましょう。サンプルプロジェクトだと4日分なので4つの適当な変数を用意するっす。
「n」という箱に変数「天候配列取得位置」の値を代入。
この時の天候配列取得位置は「4日目(予報最終日)」を指しているのでこれを基準にします。
用意した1つ目の変数に「明日の天候」を入れましょう。
nは予報最終日なので、n+1の配列位置が明日に該当するっす。
この時、nが配列最後だった場合は配列2番目の値を用意した変数に入れます。
この時、間違っても直接 変数「天候配列取得位置」に加算代入しないこと。
元の天候配列取得位置が変わってしまうと、暦システムがバグります。
明後日の場合は、n+2
明々後日ならn+3となっていくっすよ。
後は、会話イベントなりなんなり必要なところで、用意した変数を制御文字で指定してあげれば予報の完成!
■天候の変更
【サンプルプロジェクト MAP「家」ベッド横の鏡】
明日の天候を変える場合は、予報と同じように配列取得位置を決めます。
$gameVariables.setValue(変数「【配列】天候のID」)[n] = ”お好きな天候”; で変更だ!
まとめて天候を変える場合は
直接$gameVariables.setValue(変数「【配列】天候のID」)[1] = ”お好きな天候”;
てな感じで配列を指定して天候を変えればおk。
◆まとめ
さぁこれで君も暦マスターだ!
イベントコマンドで作る最大のメリットは、あらゆる情報を自由に取り出せて
暦システムと紐づけた色んなシステムと一緒に使いやすいところっすかね。
天気予報とか大きな違いじゃないっすか?
また、全てが画像で表示しているので凝った画面作りが出来るというのもメリット。
またトリアコンタンさんの「カスタムメニュー画面」を使ってればコモンイベントを呼び出して表示出来るので暦をそっくりそのまま表示出来ちゃったりするぞ。
実装の仕方は……うんガンバレ(説明がめんどいんだ)