14.その他
1.ウェイト処理
イベントコマンドにもあるウェイトと同じようなものです。
一時的に処理を中断させるものです。
Graphics.frame_rate によって、1秒間に何回画面を更新するのかが決まっています。
つまり、Graphics.wait(Graphics.frame_rate) で1秒間のウェイト処理になります。
そのような場合に、使用します。
一時的に処理を中断させるものです。
Graphics.wait(Graphics.frame_rate * 秒数)Graphics.wait(duration) これは、指定回数 Graphics.update を呼び出す処理と同じものです。
Graphics.frame_rate によって、1秒間に何回画面を更新するのかが決まっています。
つまり、Graphics.wait(Graphics.frame_rate) で1秒間のウェイト処理になります。
sleep(秒数)処理によっては、Graphics.wait が使用できない場合があります。
そのような場合に、使用します。
2.プレイ時間
Graphics.frame_count には、フレームの更新回数が記録されています。
フレーム数から算出するため不正確なものですが、それでも十分だと思います。
フレーム数から算出するため不正確なものですが、それでも十分だと思います。
time = Graphics.frame_count / Graphics.frame_rate hour = time / 3600 # 時間 min = time / 60 # 分 sec = time % 60 # 秒
3.ボタン入力の判定
ボタン入力は、Input.update が呼ばれたときに押されているキーで判断されます。
下記のような3種類の判定処理時ではないので注意してください。
ボタン入力は、Input.update が呼ばれなければ判定できないのですが、
p などでメッセージボックスを表示して、それを Enter キーで消してしまうと、
Cボタンが押されたことになってしまうようです。
ゲーム中には、そのようなことは無いと思いますが、デバッグ中などで挙動がおかしくなった場合は、
このことを思い出してマウスでメッセージボックスを閉じるなど対策してください。
Input.update を使うと、ボタン入力がリセットされるので注意してください。
下記のような3種類の判定処理時ではないので注意してください。
- Input.press?
-
単純にボタンが押されているのかを判定します。
押されていれば true そうでなければ false を返します。
2つのボタンが同時に押されているかなどの判定に
Input.trigger? などと組み合わせて使います。
- Input.trigger?
-
ボタンが新たに押されたかを判定します。
ボタンが押されると1度だけ true を返します。
押したボタンを離して、もう一度押すまでは false を返します。
1回の入力で1度だけ実行したい処理などに使います。
- Input.repeat?
-
ボタンが押され続けているかを判定します。
Input.press? は、押されていれば常に true を返しますが、こちらは、一定の間隔で true を返します。
まず、ボタンが新たに押されたときに true が返ります。
さらに、ボタンが押され続けていると 22フレーム空けた24フレーム目で true が返ります。
それからは、5フレーム間隔で true を返すようになります。
(TFFFFFFFFFFFFFFFFFFFFFFTFFFFFTFFFFFTFFFFFFTFF ... )
これは、カーソルの移動処理などで使われています。
毎フレームの処理では、多すぎる場合などに使います。
ボタン入力は、Input.update が呼ばれなければ判定できないのですが、
p などでメッセージボックスを表示して、それを Enter キーで消してしまうと、
Cボタンが押されたことになってしまうようです。
ゲーム中には、そのようなことは無いと思いますが、デバッグ中などで挙動がおかしくなった場合は、
このことを思い出してマウスでメッセージボックスを閉じるなど対策してください。
Input.update を使うと、ボタン入力がリセットされるので注意してください。
4.オブジェクトの複製
Object#clone
Marshal.load(Marshal.dump(obj))
ループとかでまとめて処理するときは気をつけてください。
例外じゃなくて self 返してくれればいいのにね。
オブジェクトの完全な複製を行います。
freeze、taint、特異メソッドの情報が含まれます。
オブジェクトの内容のみ複製します。
Marshal.load(Marshal.dump(obj))
参照先も含めた全く新しいオブジェクトを作成します。
上記2つの方法は浅いコピーであり、自身の複製は行いますが、
参照先のオブジェクトまでは複製しません。
ary = %w[0 1 2] # 浅いコピー copy = ary.dup # 配列をコピーする p ary, copy # => ["0", "1", "2"], ["0", "1", "2"] ary[0] << "00" # 参照しているオブジェクトは同じもの p ary, copy # => ["000", "1", "2"], ["000", "1", "2"] copy.clear # 配列は複製されている p ary, copy # => ["000", "1", "2"], [] # 深いコピー copy = Marshal.load(Marshal.dump(ary)) p ary, copy # => ["000", "1", "2"], ["000", "1", "2"] ary[1] << "11" # 参照しているオブジェクトは違うもの p ary, copy # => ["000", "111", "2"], ["000", "1", "2"]※ clone と dup は、数値やシンボル、nil/true/false には使用できません。
ループとかでまとめて処理するときは気をつけてください。
例外じゃなくて self 返してくれればいいのにね。
5.オブジェクトのフリーズ
Object#freezeを使用すると、オブジェクトの状態を変更できなくなります。
特異メソッドの定義もできません。
定数などをフリーズすることによって安全性がグッと増すのではないでしょうか。
Object#dupを使用して、オブジェクトのコピーを作成してください。
特異メソッドの定義もできません。
定数などをフリーズすることによって安全性がグッと増すのではないでしょうか。
ary = [1, 2, "3"] ary.freeze # => フリーズ # オブジェクトに変更を加えようとすると例外発生 ary.clear # => ERROR ary[1] = 0 # => ERROR # オブジェクト内のオブジェクトは変更可能 ary[2] << "3" # => "33" # 変数の内容も変更可能 ary = nil # => nil # Fixnum, Symbol と nil, true, false はフリーズできないみたい n = 1 n.freeze n.frozen? # => falseフリーズしたオブジェクトを解凍する方法はないので、
Object#dupを使用して、オブジェクトのコピーを作成してください。
6.イベントコマンド「スクリプト」
このスクリプトは、Game_Interpreter#command_355 で実行されます。
記述したスクリプトは文字列として扱われ、このメソッド内で eval されます。
Game_Interpreter のインスタンスは、ゲーム開始時に作成され終了まで残りますが、
並列処理のイベントとコモンイベントは、それぞれ別のインスタンスとして作成されます。
つまり、これら3つのイベントでインスタンス変数は別の変数となります。
また、並列処理のイベントは、実行中のイベントページが変更されるまで、
コモンイベントは、実行が終わるまでインスタンスが保持され、役割を終えると削除されます。
記述したスクリプトは文字列として扱われ、このメソッド内で eval されます。
Game_Interpreter のインスタンスは、ゲーム開始時に作成され終了まで残りますが、
並列処理のイベントとコモンイベントは、それぞれ別のインスタンスとして作成されます。
つまり、これら3つのイベントでインスタンス変数は別の変数となります。
また、並列処理のイベントは、実行中のイベントページが変更されるまで、
コモンイベントは、実行が終わるまでインスタンスが保持され、役割を終えると削除されます。