コピペで使える ちょっとしたテクニック

プレイヤー系

キャラクターポジション

$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マス以外で通行可能かつイベントに重ならないように配置します。