メモ欄の取得方法

 2009-07-08
VXの目玉機能の1つとして、メモ欄があると思います。

このメモ欄、ただのメモとして使うだけでなく
スクリプトでその内容を読み込んで、いろいろな処理に役立てる事が出来ます。

さて、これらのメモ欄の内容は、どのように取得するのでしょう?

[関連] http://cacaosoft.web.fc2.com/tkool/lecture/rgss2/010.html


ヘルプで「メモ」と検索すれば出るんじゃないかな?
その中から、RPG::○○というのを探しましょう。
そこにデータベースの値を受け取る変数が書かれています。

データベースの値は、ここ見ればどこに入ってるかすぐ分かるんで、ここで調べてください。

3つくらいあったと思います。

とりあえず、ポーションで説明したいと思います。
$data_items[1].note
こんな感じで参照できます。
これにキーワードが含まれているかで分岐すればいいのですが、
include? とか使う人がたまにいます。
競合しちゃうのでやめましょう。

include?って言うのは、その文字が含まれているかを調べるものなんで、
例えば、"AB"と"ABCD"というキーワードがメモ欄に書き込まれているとすると、
$data_items[1].note.include?("AB")
とすると、どちらにもマッチしてしまいます。

ですので、メモ欄を調べたいときには、正規表現を使用します。
/AB/ =~ $data_items[1].note
これが先ほどと同じものを正規表現で記述しました。

とりあえず、正規表現については
http://cacaosoft.web.fc2.com/tkool/lecture/rgss2/008.html
を見てください。
※ 説明が載っているわけではないので、青文字で書かれた部分をヘルプで探しいて見て下さい。

んで、これでは不十分なので、"先頭"という条件を付け加えます。
/^AB/ =~ $data_items[1].note
これで、"AB~"という文字だけにマッチするようになりました。
"aAB"や" AB"があっても無視するわけですね。

これだけで、ずいぶん違いますが、文字の前に記号を入れたり
記号で囲んだりすれば、なお結構です。

レクトールでいう"*"ですね。
/^\*AB/ =~ $data_items[1].note
これで、同じ単語でも安心。
*は、正規表現において特別な意味を持つので、
その文字が単なる文字である事をあらわすために*の直前に\を記述します。
バックスラッシュ記法といいます。詳しいことは調べてください。

お次は、数値を取得したいと思います。
"*ABC[12]"とメモ欄に記入されていた場合に、12 という数値を取得します。
/^\*ABC\[(\d+)\]/ =~ $data_items[1].note
p $1.to_i
じゃあ、青文字の説明を。
\[\]というのは、[]の部分ですね。
[]という文字も、正規表現内では特殊な意味を持ちますので、
バックスラッシュ記法を用いて次の文字は、単なる文字であることを教えてあげます。
\dで、数値を表します。ただし、1文字です。0~9も数値ですね。
+が、直前も文字が1回以上繰り返させるという意味です。
つまり、数値が1回以上繰り返されている文字です。
1とか12とか123とか。この文字が[]で囲まれているとなります。
ですので、[1]や[2345]はOKですが、[a1]や[1e3]などはダメです。
()っていうのが、なんだろう?その部分を別に保持しておくみたいな感じでいいんじゃないかな?
とりあえずは。。。
$1というのが、この別に保持している文字が格納されている変数。
この値は、文字列なので to_i メソッドを使用して数値に変換してあげます。

まぁ、こんな感じ。

もっと詳しく知りたい場合は、正規表現のところを熟読するといいと思うよ。
コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。


管理人のみ閲覧許可 [?]

RGSS3のヘルプと組み合わせてやっとわかりました
ヘルプだけだと理解不能だったので感謝
【2014/10/14 20:44】 | 匿名希望 | [編集]
どうも
最近ツクールを始めた者ですが、この記事は大変参考になりました。
ありがとうございます♪
【2009/10/23 01:00】 | KG | [編集]
> これってスキルのクラスですよね?
クラスってのが何を指しているのか分かりかねますが、
データベースのスキルの内容が入ってますよ。
ヘルプに書いてますよね。
【2009/07/12 16:59】 | CACAO | [編集]
これってスキルのクラスですよね?
【2009/07/12 10:36】 | まーくん | [編集]
あ、すいません。
前の投稿「って」が抜けてましたね。


> for skill in $data_skills
re = /^変数(d+):([=+-*/])(?:(d+)|変数(d+)|(atk|def|spi|agi))/
 if re =~ skill.note
とすればいいんですか?

そうですよ。
【2009/07/12 01:21】 | CACAO | [編集]
すいません、理解力がなくて…
最初の
for skill in $data_skills
 if re =~ skill.note
のところに
for skill in $data_skills
re = /^変数(d+):([=+-*/])(?:(d+)|変数(d+)|(atk|def|spi|agi))/
 if re =~ skill.note
とすればいいんですか?
【2009/07/12 00:45】 | まーくん | [編集]
いや、だから忘れずに書いてるじゃん。

/^変数(\d+):([=\+-\*\/])(?:(\d+)|変数(\d+)|(atk|def|spi|agi))/
投稿するときに消えちゃいますが、
バックスラッシュもとい円マークも忘れずに記述してくださいね。
【2009/07/11 23:14】 | CACAO | [編集]
re = /^変数(d+):([=+-*/])(?:(d+)|変数(d+)|(atk|def|spi|agi))/
は含めなくていいんですか?
【2009/07/11 22:32】 | まーくん | [編集]
いいと思いますよ?
re の正規表現を忘れずに。

【2009/07/11 22:06】 | CACAO | [編集]
では、
for skill in $data_skills
 if re =~ skill.note
 if $3
  val = $3.to_i
 elsif $4
  val = $game_variables[$4.to_i]
 elsif $5
  case $5
  when "atk"
   val = actor.atk
  when "def"
  # (省略)
  end
 end
 case $2
 when "="
  $game_variables[$1.to_i] = val
 when "+"
 # (省略)
 end
end
end
でいいのですか?
【2009/07/11 19:36】 | まーくん | [編集]
> アイテム全体のID1からID999までの全部のメモ欄にキーワードが記入してあるかを調べる
アイテムの場合は、次のようにすると順番に取得できます。
for item in $data_items
 p item.note
end

$data_○○という変数には、データベースで設定した値がすべて格納されています。
ヘルプのデータベースってとこに載ってます。


> 実装までの処理
これらの処理をどこで行うか、実行のタイミングなどです。
メモ欄の取得が出来れば後は自分で出来るよ。って方なら喜んで力を貸しますが、
あれもこれも分からないから全部教えてという事にならないか心配だったので聞きました。


> (色は対応する括弧)で取得できるんですか?
違います。余計なものが含まれてます。
/^変数(\d+):([=\+-\*\/])(?:(\d+)|変数(\d+)|(atk|def|spi|agi))/
後方参照のために記憶されるグループは、(...)のみです。
(?:)は、グループ化はしますが、記憶はしません。
ですので、
$1 ... 操作する変数の番号(\d+)数値
$2 ... 操作方法([=\+-\*\/])[]内の文字いずれか1つ
$3 ... 定数(\d+)数値
$4 ... 変数の番号(\d+)数値
$5 ... パラメータ(atk|def|spi|agi)()内の単語いずれか1つ
また、$3~$5のうちいずれか1つにマッチします。
というように、この5つになります。


> これは変数12へ攻撃力を加算することだけに対応しているということですか?
そうです。
これは「変数12へ攻撃力を加算する」という指示が
メモ欄に含まれていた場合に、以降の処理を実行する判定を行っています。
ですので、この文字列を任意の変数に変更する必要があります。
ここは、最初のデータベースの変数を使用するところですね。
for item in $data_items
 if re =~ item.note
  # (省略)
 end
end
のようになります。

ちなみに私の正規表現は、
変数○:□△という文字にマッチします。
次のものがそれぞれ1つずつ記号内に入ります。
○:変化変数の番号
□:=代入, +加算, -減算, *乗算, /除算
△:操作する値(数値、変数○、パラメータ4つ)
例)
変数8=10:変数8に10を代入
変数32/変数6:変数32から変数6の値を除算

【2009/07/11 16:55】 | CACAO | [編集]
全体の取得というのは…
全体の取得というのは、アイテムID1の「ポーション」だけということではなく、アイテム全体のID1からID999までの全部のメモ欄にキーワードが記入してあるかを調べるってことです。

実装までの処理は、僕は、
スキルのほうは、
メモ欄の数値を取得→その数値を変数に代入や加算などをする
ステートの方は、
メモ欄の数値を取得→その変数の値を能力値に加算する値(@maxhp_plusなど)に代入する
という風にすればできると思ってますが間違っていますでしょうか?

あと、$1などの値は
re = /^変数(d+):([=+-*/])(?:(d+)|変数(d+)|(atk|def|spi|agi))/

$1$2$3$4$5$6
(色は対応する括弧)
で取得できるんですか?
それと、
if re =~ "変数12:+atk"
とありますが、これは変数12へ攻撃力を加算することだけに対応しているということですか?
【2009/07/11 14:42】 | まーくん | [編集]
こんにちは
> えっと、アイテム、武器、防具、スキル、ステート、敵キャラ
それぞれの全体の取得の仕方はどうすればいいんですか。

全体の取得って何の事ですか?

> 僕が今作ってみたいと思っているのは、スキルを使うと変数の値を変えるものと、
変数から上昇・下降値を取得するステートを作りたいと思っています。

これって、実装までの処理を大体思いついてるんですかね?
1つ2つのアドバイスは出来ますが、
全然分からないので教えてくださいだと困りますよ?
もしそうでしたら、私に聞くよりFSMなどで質問した方が
多くの人の意見を聞けると思いますが?

> どのようにに記入したらいいでしょうか?
re = /^変数(d+):([=+-*/])(?:(d+)|変数(d+)|(atk|def|spi|agi))/
if re =~ "変数12:+atk"
 if $3
  val = $3.to_i
 elsif $4
  val = $game_variables[$4.to_i]
 elsif $5
  case $5
  when "atk"
   val = actor.atk
  when "def"
  # (省略)
  end
 end
 case $2
 when "="
  $game_variables[$1.to_i] = val
 when "+"
 # (省略)
 end
end
こんなで良いんじゃないでしょうか?
【2009/07/11 08:01】 | CACAO | [編集]
メモ帳取得
こんにちは^^
名前入力拡張の事はスクリプト使わなくてもよかったですね^^

えっと、アイテム、武器、防具、スキル、ステート、敵キャラそれぞれの全体の取得の仕方はどうすればいいんですか。
(スキル全体とか)
僕が今作ってみたいと思っているのは、スキルを使うと変数の値を変えるものと、変数から上昇・下降値を取得するステートを作りたいと思っています。
1つ目のやつはメモ欄に
 変数1:+10  (変数1の値へ10を足す)
 変数3:=変数2 (変数3へ変数2の値を代入)
 変数5:+atk  (変数5へ攻撃力を足す)
みたいに記入して、加算、減算、乗算、除算、代入をできるようにしたいです。
数値は、直接(10など)、変数(変数2など)、パラメーター(atkなど)を使えるようにしたいです。
どのようにに記入したらいいでしょうか?
どうぞよろしくおねがいします。
【2009/07/11 01:41】 | まーくん | [編集]
トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/262-f3fd3ba5
≪ トップページへこのページの先頭へ  ≫
カレンダー
09 << 2017/10 >> 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

カテゴリー
最近の記事
最近のコメント
タグクラウド

リンク