2013-11-05

カラスのくちばし~RGSS小技集

Comment ShareLink
«RGSS一覧

RGSSの基本から役に立つかわからないものまで、
色々いじって活用できそうなものを集めてみました(・ω・)
多くはRPGツクールXPのヘルプに書かれているものを烏守が勝手に解釈して書いたものなので、ヘルプを見る事を強くオススメします。
間違ってることが書いてあるかもしれないので強く!おすすめします。
一部はヘルプに載っていないRubyスクリプト参考。


~ 基本 ~~ 小技メモ ~
クラス
メソッド
グローバル変数
インスタンス変数
ローカル変数
整数に変換
浮動小数点に変換
文字列に変数
配列
ハッシュ
条件分岐
ループ
returnでメソッド終了?
同じマップのイベント実行
セルフスイッチ遠隔操作
同マップ場所移動でイベント位置初期化
指定位置に移動
表示ピクチャの一部変更
テキストに出力
フォルダ作成
EC「スクリプト」の不具合修正



クラス

スクリプトエディタを見て言うところの「class ~~」
class~からendまでがひとつのクラス。
変数 = クラス名.new
で呼び出す事ができる。

これでウィンドウを表示させたり、シーンを呼び出したりできるので覚えておいて損はしないハズ。

メソッド

スクリプトエディタを見て言うところの「def ~~」
def~からendまでがひとつのメソッド。

同クラス内でメソッド名を書くと、メソッドを呼び出すことができる。
例えば def karasu のメソッドを呼び出すなら karasu という記述をすれば良い。

「イベントの編集」での自律移動カスタム・移動ルートの設定は
Game_Characterで行われるので
Game_Characterのメソッド呼び出し、インスタンス変数が使えます。
なので
 イベントの位置が横18でなければ左に移動
@x != 18 ? move_left : nil

のように、ちょっぴり凝った自律行動ができる(・ω・)


グローバル変数

頭に「$」が付く。
例:$silver
どこからでも使用できる変数。
便利だけど、あまり使いすぎても困る…かもしれない。


インスタンス変数

頭に「@」が付く。
例:@silver
同じクラス内なら使用できる変数。

「イベントの編集」で
イベントの移動ルートやイベント実行内容の中でも使用できます。
グローバル変数にする必要がないならこれでいいかも。


ローカル変数

頭に何も付かず、小文字かアンダーバーから始まるもの。
例:silver
同じメソッド内のみで使用できる変数。

イベントの編集の「スクリプト」では
ひとつのスクリプト入力の中でしか機能しないが
自律移動・移動ルートの設定の中では機能するっぽい(・ω・)


整数に変換

to_i
例)a = "123".to_i # 123
  b = 3.5.to_i # 3


文字列の場合、数字がそのまま整数に変換されます。
その場合、文字列の中身が「半角数字」じゃないとダメ。
月日を整数にする場合は日にちが一桁の場合
例えば1月1日であれば整数は「101」になります。


浮動小数点に変換

to_f
例)a = 1.to_f # 1.0
整数を小数点に変換します。


文字列に変数

"#{変数}"
シャープとカッコで囲むことで変数を文字列に含めることができます。
この方法で整数から文字列に変換することもできます。


配列

例1)a = [1, 5, "みぃたん"]
  a[0] # 1
  a[1] # 5
  a[2] # "みぃたん"
  a[0] = 10 # [10, 5, "みぃたん"]
  a[1] -= 1 # [10, 4, "みぃたん"]

例2)b = [[0,1,"ぴよたん"], [3,4,5]]
  b[0] # [0,1,"ぴよたん"]
  b[1] # [3,4,5]
  b[0][2] # "ぴよたん"

例のように配列は変数や文字列等を一纏めにできます。
例2のように配列の中に更に配列を作り、呼び出す事も可。
代入もできるし、数値なら足したり引いたりだってできる。
便利なので覚えておいてもソンはないハズ(・ω・)
詳細はヘルプの「配列」と「Array」を参照。


ハッシュ

a = {"みぃたん" => 300, "ぴよたん" => 5000}
a["みぃたん"] # 300
というように、名前で変数を管理することができます。
配列は順番、ハッシュは名前でひきだしを開けると考えるといいかも。


条件分岐

[ if ]
記述した式の条件と合っている場合に実行する。
(イベントでの条件分岐・スクリプトはこれなので直接スクリプト部分に式を記入する)

 if 変数 == true
  p "変数 が true"
 end

[ unless ]
ifの逆で、式の条件と合っていない場合に実行する。

 unless 変数 == true
  p "変数 が true ではない"
 elsif 変数 == nil
  p "変数が nil"
 else
  p "条件が当てはまらない"
 end

elseは、条件に当てはまらなかった場合の分岐。
「elsif 条件」にすると、別の条件に分岐できる。ifなども同様。

[ case ]
ひとつの変数から多数分岐する場合などに使用したりする。
数値であれば when に 1..5 を指定すると case に指定した変数が1~5の場合実行、
when に "文字列" を指定すると、caseに指定した変数に文字列 "文字列" が入っている場合に下に書いた分岐が実行される。

 case 変数
 when 0..5
  p "変数が0~5"
 when 6..10
  p "変数が6~10"
 when 11
  p "変数が11"
 else
  p "どれにも当てはまらない"
 end


その他の方法では…

 変数 == 100 ? p "変数が100" : p "変数は100以外"

といった記述方法もある。
"条件1 ? 一致1 : 条件2 ? 一致2 : それ以外"と続けて条件を書くこともできますが、長くなってしまう&見づらくなるのが欠点。



ループ

[ loop ]
良く使う単純なループ。

 loop do
  if 条件
   p "条件を満たしていればループから抜ける"
   break
  end
 end

breakがなければ延々とループしてエラーが起きてしまうので注意。
大体Graphics.updateと組み合わせて使う事が多いです。

[ while ]

 while 条件
  p "条件を満たしている限りずっとループ"
 end

こちらは条件から外れたらbreakなしでもループ終了します。

[ until ]

 until 条件
  p "条件を満たすまでずっとループ"
 end

whileの逆。条件を満たしている場合と満たさない場合。
条件が単純ならloopよりもこちらの方がすっきりしてるかも?



returnでメソッド終了?

条件分岐でよく見かける"return"てなに? とこれまで疑問に思っていたので書いておきます。
"return"はメソッドの処理を終了させることができる。

例えば、
 def miitan
  @piyotan += 1
  if @piyotan < 10
   return
  end
  p "GOAL!"
 end

というメソッド処理があるとする。
変数@piyotanがmiitanメソッドを実行する度に+1されるけれど、
ifの条件式で@piyotanが10未満の場合、p "GOAL!"は実行されずにそこでメソッドは終了。
10以上ならp "GOAL!"が実行されます。
returnの横に戻り値を書き込んでいるのもデフォルトでよく見られるので、どう動いているかデフォを眺めてみるといいかも。


同じマップのイベント実行

$game_map.events[イベントID].start
指定した同じマップのイベントを実行。
これは同マップに制限されますが、コモンイベントのように
複数のイベントに同じ処理をさせたい場合役に立つかもしれません。
実行内容は、普通に実行させた時と同じ中身。
しっかりスイッチ判定もされます。


セルフスイッチ遠隔操作

$game_self_switches[[マップID, イベントID, "スイッチ(A/B/C/D)"]] = true / false
$game_map.need_refresh = true

イベントコマンドでのセルフスイッチ操作以外に
スイッチを別イベント・マップから操作したい時便利。
need_refresh でマップの更新をする事によって、
即座にセルフスイッチの影響を受ける事ができます。
現在マップのセルフスイッチを操作する時は入れないと「あれ?」ってなります。
他マップならなくても大丈夫

同マップ場所移動でイベント位置初期化

デフォルトのままでは同じマップ内にイベントコマンドで「場所移動」しても、イベントの位置や一時イベントに変化がありません。
でも、同じマップのイベント位置や一時イベントをクリアしたいだけなのに、わざわざ別のマップに移動させるのはスムーズじゃない…
そんな時はスクリプトエディタを開いて
Scene_Map!
「プレイヤーの場所移動」
def transfer_player
というメソッドがあります。
この「移動先が現在のマップと異なる場合」の分岐を消してしまえば、同マップでもイベント位置などが初期化されます。

if $game_map.map_id != $game_temp.player_new_map_id ←消去
 # 新しいマップをセットアップ
 $game_map.setup($game_temp.player_new_map_id)
end

代わりに同マップの場所移動はmoveto(x,y)で行うようにすれば一件落着です。
※面倒なのでからすはよく
移動ルートの設定→スクリプト→対象:プレイヤー→スクリプト→moveto(xマス,yマス)で指定しています
↓の指定位置に移動も参照。

指定位置に移動

$game_player.moveto(x, y)
$game_map.events[イベントID].moveto(x, y)

(上)プレイヤー(下)指定したイベントの位置を変更。
イベントコマンドの「場所移動」
「イベントの位置設定」とほとんど同じですが、
格納変数以外で位置を指定したい場合に便利です。


表示ピクチャの一部変更

画像だけ変更したい時は
Game_Pictureに
def メソッド名(name)#←名前は何でもいい
 @name = name
end

のように追加し、
画像を変更したいところに
$game_screen.pictures[番号].メソッド名("画像名")
を入れるだけ。
同じようにスクリプトに追加して
好きな部分だけ変更できるようにするのもいいかも?
位置だけ変更や、透明度だけ変更などなど(・ω・)
イベントコマンドの「ピクチャの移動」の場合
全部設定しないといけないので、意外と役に立つ…?
※メソッド追加・呼び出しで応用が利くので他にもお試しあれ


テキストに出力

t ="メモ帳に出力する文字\n(←改行)"
t+="文字の続き"
file = File.open("メモ.txt", "w")
file.write(t)
file.close

wは空っぽにして書き込み、aにすると残して後ろに書き込みます。
セーブ日時や行動のログ、おまけ等に使うと面白いかもしれません。
例)
「年/月/日 (主人公の名前)は百人斬りを達成した!」
のような記念ログを作ってみるとか。


フォルダ作成

unless FileTest.exist?("名前")
 Dir::mkdir("名前")
end

これで新しく "名前" のフォルダが作成されます。
Dir::mkdirでフォルダを作成する処理となりますが、
既に同名のフォルダが存在する時に、このスクリプトが実行されると「Errno::EEXIST」というエラーが発生してしまうので、FileTestで判定し、フォルダが存在しない場合に実行させます。

イベントコマンド「スクリプト」の不具合修正

イベントコマンド「スクリプト」を使用すると、一行のみ記述した際に時々エラーが起きる事があったんです。
どうやら、一行目に false を入れる記述をするとエラーが起きてしまう仕様になっていたらしく、「Interpreter 7」の「command_355」のスクリプトを書き換える必要があるようです。
これまで一行目に改行を入れて対処していましたが、これで解決できそうです(いじるのが面倒なら一行目に改行入れるだけでいいかもですが)

青文字が追加・変更部分、赤文字が削除。

 def command_355
  # script に 1 行目を設定
  script = @list[@index].parameters[0] + "\n"
  memory_index = @index #インデックスを記憶
  # ループ
  loop do
  # 次のイベントコマンドがスクリプト 2 行目以降の場合
   if @list[@index+1].code == 655
    # script に 2 行目以降を追加
    script += @list[@index+1].parameters[0] + "\n"
   # イベントコマンドがスクリプト 2 行目以降ではない場合
   else
    # ループ中断
    break
   end
   # インデックスを進める
   @index += 1
  end
  # 評価
  result = eval(script)
  # 戻り値が false の場合
  if result == false
   # ☆スクリプト一行のみの記入でエラーが起きるためfalseの場合ひとつ進める
   if memory_index == @index
    @index += 1
   end

   # 終了
   return false
  end
  # 継続※消去
  #return true

 end

category: