「EnDlEss DREamER」ブログ

最近はunity5メインで活動中。以前はツクールRGSSネタなど。

§ RGSS講座08「競合対策」

久しぶりのRGSS講座~~~♪
基本的な所は全部やっちゃってるんで、皆さんが素材を導入して一番苦労するところ・・・

「競合」

について解説したいと思います。



一言で「競合」と言っても原因は沢山あります。

http://www5f.biglobe.ne.jp/~delusion/index.html

「Delusional Field」様の所にある「RGSSエラー対策」で基本的なエラーが解説されています。

http://wiki.quiet-labs.net/

「静寂の研究所」様の「エラーメッセージ改良」を利用すると更にエラーの原因が追及しやすくなります。



・再定義について

大抵は「alias(エイリアス)」を使って再定義します。正確には「別名定義」といいます。

class Item

 def self.hoge
  'hoge'
 end

 class << self
  alias :fuga :hoge
 end

end


Item.hoge # => hoge
Item.fuga # => hoge



というように「Itemクラス」の「hoge」メソッドをエイリアスすると「fuga」が使えるようになります。
実行結果が「同じ」と言うのには理由があります。
エイリアスを実行すると「別名定義」の名の通り、別の名前でメソッドを作り何かをしたいのですが
「元の名前」メソッドは「保持されている」ので、新たに別名で定義するときに
元のメソッド名を新たなメソッド内で使用することで、元のメソッドの記述が実行されます。
平たく言えば、スーパークラスの同じ名前のメソッドを実行したいときの「super」のメソッドと似てます。



 #--------------------------------------------------------------------------
 # ● 終了処理
 #--------------------------------------------------------------------------
 alias ed_battle_layout_terminate terminate
 def terminate
  format_battler
  $ed_battle_layout_surprise = nil
  dipose_enemy_hp
  if $ed_rgss2["ed_active_time_battle"]
   dipose_enemy_atb
  end
  ed_battle_layout_terminate
 end


これは「バトルレイアウト変更:scene」の記述の一部です。
これもエイリアスを使って定義しています。
「terminate」メソッドを「ed_battle_layout_terminate」という名前で別名定義しています。
なにやら少々記述がありますが省略。
最後に「ed_battle_layout_terminate」というエイリアスしたメソッドを記述しています。
これは「元のメソッド」つまり「terminate」メソッドを実行しているのです。
そうすることで、わざわざコピー&ペーストしなくてもこの記述一つで変更内容を実行しつつ
元のメソッドの働きも行うことが出来ます。


ですが、実はそこに罠も潜んでいます。
元のメソッドが実行されるので、記述内容によっては変更しても元のメソッドで値が元に戻ってしまう。
または、追加したメソッドや値が元のメソッドには存在しない為にエラーが発生する。
などなど、エイリアスは決して万能ではないのです。



そこで「本当の再定義」を使用したりします。
「本当の再定義」とは、元のメソッド名と同じ名前でまた作ること。
そうした場合、元のメソッドは同じ名前で作った時点で無関係となります。
ツクールの場合は、「上にあるスクリプト」より「下にあるスクリプト」が優先されるので
先のバトルレイアウト変更の例の場合は「Scene_Battleクラス」と「バトルレイアウト変更:scene」が関係しており
エイリアスを使わない場合はScene_Battleの「terminate」の記述をコピー&ペーストする必要があります。
なぜならば、Scene_Battleのメソッドはバトルレイアウト変更:sceneのメソッドの時点で無効化されるからです。


使い道としては、元のメソッドの記述の途中で処理を別に行いたい、追加したいなどなど
エイリアスで語った「罠」を回避する場合に使ったりします。



・競合とは?

上記で語った「再定義」で何らかのメソッドが値を失い「nil」となりエラーを吐く場合が多いです。
ツクールでは色んなサイト様から様々な素材を導入するわけですが
よく「導入位置」を指定している場合があります。
それは、素材により「再定義」しているヶ所が多いとか「本当の再定義」で素材導入位置までの
メソッドが無効化されてしまうから上部にとかで指定している場合があるのです。

例として「バトルレイアウト変更」を導入したとします。
次に「バトルレイアウト変更:extension」を導入したとします。
extensionの導入位置は「「scene」の直下に。」なので、通常はバトルレイアウト変更:sceneの真下に入れます。
これをバトルレイアウト変更よりも上に入れるとエラーを吐きます。
なぜならば、バトルレイアウト変更で定義されていないメソッドや値を実行しようとするからです。
更に「戦闘キーアクション追加」を導入する場合は「バトルレイアウト変更及びextensionよりも下」なので
それらよりも下に導入すると動作します。

実はこれらのスクリプトは「def execute_action_skill」が共通して「本当の再定義」が行われています。
上記3素材を「A」とします。
別素材を「B」としたときに、「def execute_action_skill」がエイリアスで再定義されている場合の
素材導入位置は何処になるでしょうか??

正解は「Aの下」になります。
Aで再定義が行われてAまでの「def execute_action_skill」の記述が無効化されます。
なのでAより上にBを導入してもAの素材で無効化されます。

では「B」でも「本当の再定義」が行われた場合はどうすればいいのか?
それはBの「def execute_action_skill」内でAの「def execute_action_skill」の記述をコピー&ペーストする。
そうすることで、AがBで無効化されてもBの中でAの内容が記述されていればエラーは出ません。



というように「導入する素材」「どの部分を再定義しているのか?」というのを理解することで
導入位置を変更するだけで解決するのか、エラーが出た場合には他に導入している素材と
共通するメソッドを見つけ出し、どの素材の、どのメソッドでエラーが出るのかを発見することが出来ます。

ツクールは「Vocab」から順に下に実行して「Main」で最終的な動作をします。
逆に言うと「Main」までは「下準備」なので、ゲームは動いていません。


・F12リセットエラー

「F12」をゲーム中に押すとリセットされます。
通常は大した気にならないのですが「RPGモジュール」などをエイリアスする場合に絡んできます。
普通に実行してウィンドウごと消せばうまく実行するが、F12でリセット後だとなぜかエラーが出る。
と言う場合に「unless $@」を入れると上手く動きます。

「$@」は例外情報を格納する変数で、F12を押すと例外が発生したことになっているみたいです。
一度しか実行しないはずのものを値が保持されたまま再度実行されてエラーが発生するとか
requireのように一度しか実行されず、リセットした場合は実行されないなど
リセットしたらどっかでエラーが起こった場合に利用するとリセットエラーを回避できます。

詳しくは「http://piscis.shime-saba.com/index.html」にて解説されています。




長々と語りましたが、競合は何かと面倒です。
単純な素材なら競合は少ないでしょうが、複雑な素材を複数導入する場合には覚悟が必要です。
競合解決の第一歩は「導入位置」
次に「どのクラス」「どのメソッド」を利用しているのか?
というのを調べて、またはテストプレイしてから競合対策していく必要があります。

私の場合は「自分の素材同士の競合」は解決してからUPするようにしていますが
数多くあるサイト様のスクリプト素材の競合までは面倒みれません。
なぜなら、導入する素材によって競合ヶ所など星の数だけ発生する可能性があるからです。

この解説がスクリプト導入の際に役立てればと思いますm(__)m








2011/07/08/Fri 20:34:35  RGSS講座/CM:0/TB:0/
new ふと思った「本当の戦車乗降システム」スクリプト / MAIN / 改造FF5ってスゴイ・・・ old

COMMENT

COMMENT POST

/
/
/
/



 
 内緒です♪

TRACK BACK

  この記事のURL:
   http://edlogtkool.blog36.fc2.com/tb.php/780-71591203


MAIN
copyright © 2006 「EnDlEss DREamER」ブログ. All Rights Reserved.
Template by TAE-3rd☆テンプレート工房