「EnDlEss DREamER」ブログ

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

§ RGSS講座06「メモ欄と正規表現」

・メモ欄の取得

ツクールのヘルプで「note」で検索すると「RPG::BaseItem」「RPG::Enemy」「RPG::State」の3つが出ます。
コレって言うのはつまり「スキル」「アイテム」「武器」「防具」「敵キャラ」「ステート」の設定項目ですね。
実際の記述では・・・

item = @item.note

となります。

メモ欄は言うまでもなく「文字列」なので「Stringクラス」です。
で、皆さんが気になるのは「どうやってメモ欄の文字を取得させるか?」ということですね。
その辺りが次の項目となります。


・正規表現(Rage_xp)

説明が難しいのですが「文字列クラスの一つ」という感覚で覚えればいいと思います。正確には違うのですが細かいことはまぁ・・・

正規表現は

「/」で始まり「/」で終わります。

str = "あいう"

if /(あいう)/ =~ str
 処理
end


「=~」「正規表現 =~ 文字列」でマッチするかどうか調べるメソッドです。

(あいう)のように()でくくっているのは「グループ化」というもので、「あいう」の3文字にマッチします。

str = "あいう"
rage = "あいう"

if /#{rage}/ =~ str
 処理
end


上記例文で出てくる「/#{rage}/」があります。
「//」は先に説明した通り、正規表現に必要な始まりと終わりです。
「rage」には文字列「あいう」が格納されています。
「#{}」は「正規表現の中で変数を使う」為の記述です。
他にも色々あるのですが、参考書なりヘルプなりを参照して調べるといいでしょう。
あとでも必要箇所は説明していきます。


・メモ欄から取得してマッチさせる

こっからが本番です。


#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle < Scene_Base

#--------------------------------------------------------------------------
# ● スキルアニメのメモ欄取得
#--------------------------------------------------------------------------
def skill_anime_memo(skill)
 skill_note = []
 a = skill.note.scan(/<#{COUNTINUITY_ANIME_MEMO}[::](\d+(?:[ ]*,[ ]*\d+)*)>/)
 unless a == [] and a.empty?
  $1.scan(/\d+/).each { |num|
  skill_note.push(num.to_i)}
  @skill_continuity_anime = skill_note
 else
  @skill_continuity_anime = []
 end
end


「連続アニメーション」の記述の一部を出してみました。
このメソッドは「skill_anime_memo」というメソッドで引数に「skill」を取得するようにしています。
この実行元が「execute_action_skill」メソッドで「skill = @active_battler.action.skill」がメソッド内に
記述されて「skill」に攻撃者の使用スキルが格納されます。それを引数として「skill_anime_memo」を実行しています。


a = skill.note.scan(/<#{COUNTINUITY_ANIME_MEMO}[::](\d+(?:[ ]*,[ ]*\d+)*)>/)


が引数「skill」のメモ欄を取得してマッチしています。
このスクリプトでは「<連続アニメ:10,20,30>」とメモ欄に記述して連続でアニメーションを表示します。
まず「.scan(正規表現)メソッド」は文字列を正規表現で検索してマッチした部分を「配列」で返します。
「/」で始まるのは説明した通り。
次の「<」は単なる文字でメモ欄記述の「< 内容 >」の両端ですね。
「#{COUNTINUITY_ANIME_MEMO}」も説明した通り正規表現内での変数使用です。
この「COUNTINUITY_ANIME_MEMO」は定数で「連続アニメ」の文字列が格納されています。
「[::]」で「[ ]」はマッチさせたい文字の集合で、この場合は「半角のコロン」と「全角のコロン」をマッチさせています。
ここまででメモ欄の「<連続アニメ:」までの説明が終わりました。



次に数字のマッチを行ないます。
「()」は先に説明した通り「グループ化」で括弧内にマッチしないといけません。
「\d+」というのは「\d」で「0~9の数字にマッチ」して「+」は「1回以上の繰り返し」という意味です。
これで「何桁もの整数」にマッチするようになります。
「(?: )」「後方参照を伴わないグループ化」「$1」などに入らない「単なるグループ化」の為の記述です。
「[ ]*」は半角スペースの文字列と「*」が「0回以上の繰り返し」で「,(カンマ)」は文字通りカンマの文字。
でまた「[ ]*」で半角スペースのマッチを行ない、「\d+」で数字のマッチを行ないます。
「(?: )」の終わりに「*」を付けることで「(?: )」の「0回以上の繰り返し」にマッチさせています。
そして「[::]」の直後の「(\d+(?: )*」の「*」の後に「)」を付けて「(\d+(?: )*)」となり
「[::]」以降の括弧のグループ部分が終わります。
この括弧では「\d+」最初のグループの中「繰り返しマッチ」させる「(?:)」のグループが内包されています。
既にグループの中のグループなので「後方参照しない単純なグループ化」ということなのです。
で、最後に忘れずに「>」を入れて「/」で正規表現を終えています。

つまり

<連続アニメ:(100( , 999)*)>

という表現となり「(, 999)」の部分は「0回以上の繰り返し」で単なるグループ化により最初の「100」の部分以降は
いくら付け足してもいいということになります。
なので「<連続アニメ:100,999>」とメモ欄に表記すれば「skill_anime_memo」でマッチするというわけです。
いくらでも付け足して良いので「<連続アニメ:1,2,3,4,5,6,7,8,9,10,11,12,13・・・>」でもマッチします。



・後方参照

先の説明でメモ欄の文字をメソッド内でマッチさせて結果を「a」という変数の中に「配列」として格納されました。

unless a == [] and a.empty?

で「a」の配列が「[]」空っぽなのか「empty?」配列の要素数が「0」のとき真を返すメソッドで「true」なのか?
を判断しているのですが「if」ではなく「unless」なのでこの場合は逆の意味で
「配列が空っぽでなく、配列の要素が0ではない場合」に次の処理へと移ります。
unlessの先にあるのが「$1」というのがあるのですがこれはヘルプから抜粋で
「最後に成功したパターンマッチで n 番目の括弧にマッチした値が格納されます。該当する括弧がなければ nil が入っています」
マッチに成功したなん番目の括弧がこの「$1」で、この場合は「1番目の括弧」にマッチした値が格納されています。
つまり「(100,999)」の部分が「文字列」で格納されています。

  $1.scan(/\d+/).each { |num|
  skill_note.push(num.to_i)}
  @skill_continuity_anime = skill_note


$1の中に格納されている文字列をさらに正規表現でマッチをしていきます。
この場合は「\d+」だけなので数字だけにマッチするようにしています。
「scan」メソッドはマッチした結果を「配列」で格納します。
その配列を「each」メソッドでさらにブロック評価を行ない個別に処理していきます。
「skill_note」はローカル変数で最初に「skill_note = []」で空の配列を作成してます。
eachによる評価結果を「skill_note」に追加しているのですが「to_i」メソッドで「文字列」を「整数」に変換しています。
メモ欄からの取得は「文字列」による取得なので「"1"」のように1という文字で格納されているのを数字に変換します。

@skill_continuity_anime = skill_note

で追加し終わったskill_noteをインスタンス変数に入れてます。
これによってScene_Battleクラス内でアニメーションの表示に使えるようになります。


・おわりに

この正規表現はかなり面倒な部分で色々とややこしいです。
ヘルプや辞書を引っ張りながら、他の人のスクリプトではどういった記述をしているかなど
調べながらやっていくといいです。

http://www.rubular.com/

ではサイト上で正規表現の記述が正しいかどうかをマッチングしてくれます。





2010/03/14/Sun 15:28:44  RGSS講座/CM:1/TB:0/
new 久々にIRON MAIDEN ネタ / MAIN / 装備生産システム old

COMMENT

  from - -
RegularExpressions…
2013.05.28-15:05//URL/EDIT/

COMMENT POST

/
/
/
/



 
 内緒です♪

TRACK BACK

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


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