プレイヤー系
キャラクターポジション
$game_player.x $game_player.y
プレイヤーのX座標、Y座標
$game_map.events[n].x $game_map.events[n].y
イベントID n番のX座標、Y座標
これを応用して、
($game_player.x - $game_map.events[n].x).abs + ($game_player.y - $game_map.events[n].y).abs
プレイヤーとイベントID n番が何マス離れているか?*.absは絶対値を求める命令。
abs_x = ($game_player.x - $game_map.events[n].x).abs abs_y = ($game_player.y - $game_map.events[n].y).abs result = (abs_x + abs_y)
イベントコマンド:スクリプトにおさまる複数行バージョン。
アイテム系
アイテムの所持数
$game_party.item_number($data_items[n]) $game_party.item_number($data_weapons[n]) $game_party.item_number($data_armors[n])
上から順にアイテム、武器、防具 n番の所持数
*items weapons armorsの部分はこれに限らず、アイテム・武器・防具のどれに属するかを指定するためによく使います。
アイテムの入手
$game_party.gain_item($data_items[n], 1)
n番のアイテムを 1個入手
減らしたい場合はgainの部分をloseに変えるか、1 の部分を-1にしても可能。
n = $game_variables[1] $game_party.gain_item($data_items[n], 1)
このようにすれば、変数1番に入れた値のid番号アイテムを入手というイベントが作れる。
マップ系
通行可能かどうか?
$game_map.passable?(x, y)
マップのx, yの位置が通行可能かどうか判定する。
ピクチャ系
ピクチャの表示、移動、消去
screen.pictures[n].show('Name', 0, 0, 0, 100, 100, 255, 0)
Nameというファイル名の画像をピクチャの n番に表示 それぞれの数字は以下に対応している。
screen.pictures[n].show('name', origin, x, y, zoom_x, zoom_y, opacity, blend_type)
name : ファイル名(拡張子とかはいらない)、origin : 原点(0が左上、1が中心)、x : x座標 、y : y座標
zoom_x : X 方向拡大率 、zoom_y : Y 方向拡大率、opacity : 不透明度(0〜255) 、blend_type : ブレンド方法(0:通常,1:加算,2:減産)
screen.pictures[n].move(0, 0, 0, 100, 100, 255, 0, 60)
ピクチャn 番を移動 表示と違ってファイル名は指定する必要がないかわりに、移動完了までのウェイト数が必要。
screen.pictures[n].move(origin, x, y, zoom_x, zoom_y, opacity, blend_type, duration)
duration : 移動完了までのウェイトフレーム数
screen.pictures[i].erase
ピクチャn 番を消去
for i in 1..20 screen.pictures[i].erase end
これで一括消去も可能。
イベント関連
スタートイベント
$game_map.events[n].start
イベントID n番のイベントを実行する。
向かい合うテーブルに設定したり、共通のイベントを起こしたい場合に遠隔実行できる。
イベント実行中?
$game_map.interpreter.running?
並列処理などで、ボタンが押されているとき?などをすると、会話中でも反応してしまうが、
これを分岐に入れれば他のイベントが実行中かどうか?を判定できる。
実行中のイベントのIDを取得する
@event_id
初めて知ったとき神だと思いました。
イベントの名前を取得
class Game_Event < Game_Characterに
attr_reader :event
を追加して、↓
$game_map.events[n].event.name
ID n番のイベントの名前を取得。
スクリプト関連
ゲットランダム byアレイ
plm = [1,2,3,4,5,6] plm[rand(plm.size)]
配列の中からランダムに一つの要素を取得する。
ランダムソート
plm = [1,2,3,4,5,6] plm.sort_by{rand}
配列の中身をランダムに並び替える。
ディープコピー
Marshal.load(Marshal.dump(obj))
これはよくわからないんだけど、例えば
a = [1] b = a b[0] += 1 p a # => [2]
こんな感じで a という配列を元にコピーした b に対して +1 したにもかかわらず、
コピー元であるaも変わってしまうという。こういうコピーをシャローコピー(浅いコピー)というらしく、これを防ぐのに
a = [1] b = Marshal.load(Marshal.dump(a)) b[0] += 1 p a # => [1]
こんな風にして使えるというものです。
配列コピーして計算してたらなんかおかしい!というときはこれのせいだったりするので、
これを知らないとドツボにはまるかもしれないです……わたしです……。
汎用セット
セルフスイッチリセット
for i in 1..$game_map.events.values.size next if $game_map.events[i] == nil $game_self_switches[[@map_id, i, "A"]] = false $game_self_switches[[@map_id, i, "B"]] = false $game_self_switches[[@map_id, i, "C"]] = false $game_self_switches[[@map_id, i, "D"]] = false end
そのマップのイベントのセルフスイッチを全てOFFにする。
ランダムアイテム入手
loop do item = $data_items[rand($data_items.size-1)+1] redo if item.name == "" redo if item.price == 0 $game_party.gain_item(item, 1) break end
全アイテムのうちからランダムで一つ入手します。名前が空白か値段が0のアイテムは除外。
$data_items[rand(20)+11]こうすると11番〜30番のアイテムとかにもできます。
item = $data_weapons[rand($data_weapons.size-1)+1] item = $data_armors[rand($data_armors.size-1)+1]
武器・防具の場合はこちらをどうぞ。
指定座標にあるイベントのIDを取得
x = x; y = y ev_id = 0 events = $game_map.events.values ev_f = events.find_all { |e| e.x == x && e.y == y } unless events.empty? ev_id = (ev_f.max { |a, b| a.id <=> b.id }).id end
現在のマップの x と y に入力した座標と一致するイベントのIDをev_id に入れる。
複数存在する場合最も高い ID を取得し、イベントがない場合は0が返ります。
KGC Softwareさんとこの旧イベントコマンド:get_event_idから抜き出してきただけなので、
このスクリプトを入れているなら必要ないです。
ランダムリポジション
マップ通行判定やイベントの取得を駆使して実現しています。
注:get_event_idはKGC Softwareさんとこの旧イベントコマンドに含まれる機能です。
導入していない場合は、上記の指定座標にあるイベントのIDを取得などで代用してください。
for i in 1..$game_map.events.values.size next if $game_map.events[i] == nil evn = $game_map.events[i].event.name next if not ["ランダム","random"].include?(evn) x = rand($game_map.width - 10) + 5 y = rand($game_map.height - 10) + 5 redo if not $game_map.passable?(x, y) redo if not get_event_id(x, y) == 0 get_character(i).moveto(x, y) end
イベント名に ランダム もしくは random と書かれているイベントをマップ内のランダムな位置に配置しなおす。
位置はマップの端から5マス以外で通行可能かつイベントに重ならないように配置します。