リリカルリミテッドが販売しているゲームやイラスト集のサポート用のブログです。
$game_message.add("文章")
gm = $game_message gm.choices.push("1","2","3","4","5","6","7","8") gm.choice_cancel_type = 9 gm.choice_proc = Proc.new {|n| $branch = n } Fiber.yield while $gm.choice? case $branch when 0 then $game_variables[61] = 1 when 1 then $game_variables[61] = 2 when 2 then $game_variables[61] = 3 when 3 then $game_variables[61] = 4 when 4 then $game_variables[61] = 5 when 5 then $game_variables[61] = 6 when 6 then $game_variables[61] = 7 when 7 then $game_variables[61] = 8 when 8 then $game_variables[61] = 9
end
コード解説
選択肢を表示させるには「$game_message」というクラスを使います。
イベントスクリプトに入れるには省スペースにしなければならないため、gmという変数に$game_messageを代入しています。
これはつまり「$game_message.choices.push」と書かれているわけですが、()内にはそれぞれの選択肢に表示したい文字を「,」で分けて書いています。
この「$game_message.choices.push("1","2","3","4","5","6","7","8")」はこのように書くこともできます。
$game_message.choices.push("1") $game_message.choices.push("2") $game_message.choices.push("3") $game_message.choices.push("4") $game_message.choices.push("5") $game_message.choices.push("6") $game_message.choices.push("7") $game_message.choices.push("8")
こうして描くとただコードが冗長になったように感じますが、「$game_message.choices」をgmcという変数に代入した場合
gmc = $game_message.choices gmc.push("1") gmc.push("2") gmc.push("3") gmc.push("4") gmc.push("5") gmc.push("6") gmc.push("7") gmc.push("8")
と縦にすっきりした形で書くことができます。
この縦書き選択肢の使った方が良い場合というは選択肢の中身が長くなる場合でしょう。
例えば
選択肢
勇者よ!魔王を倒せ!と叫ぶ
勇者よ!ほどほどに頑張れ!と声をかける
勇者よ!気楽にな。と肩を叩く
勇者よ!無理はするな!と引き止める
勇者よ!お前じゃ無理だ!と叫ぶ
という選択肢を作りたい場合、横に長くすると
gmc = $game_message.choices gmc.push("選択肢","勇者よ!魔王を倒せ!と叫ぶ","勇者よ!ほどほどに頑張れ!と声をかける","勇者よ!気楽にな。と肩を叩く","勇者よ!無理はするな!と引き止める","勇者よ!お前じゃ無理だ!と叫ぶ")
となり、これをイベントスクリプトに入れるとツクールの方で強制改行され、エラーが出る原因になります。
これを縦に書くと
gmc = $game_message.choices gmc.push("選択肢") gmc.push("勇者よ!魔王を倒せ!と叫ぶ") gmc.push("勇者よ!ほどほどに頑張れ!と声をかける") gmc.push("勇者よ!気楽にな。と肩を叩く") gmc.push("勇者よ!無理はするな!と引き止める") gmc.push(勇者よ!お前じゃ無理だ!と叫ぶ"")
となり、横幅に何とか間に合い、直感的にも分かりやすいコードの形になります。
それぞれの場面でやり易いやり方を選択してください。
これは選択肢が表示された時にキャンセルボタンが押された時の挙動を決めているコードです。
choice_cancel_typeプロパティの値で、以下のように挙動が決まります。 choice_cancel_type = 0 でキャンセルボタン無効に。 choice_cancel_type = 1 でキャンセルボタンが押された時に選択肢1を選択 choice_cancel_type = 2 でキャンセルボタンが押された時に選択肢2を選択 choice_cancel_type = 3 でキャンセルボタンが押された時に選択肢3を選択 ・ ・ ・
というように反映されます。
選択肢がない場合にも値は返され、次のコードのnにその値に-1された値が代入されます。
選択肢の表示をスクリプトで行う上で難しいのがこのコードでしょう。
よくわからない場合は一先ず、ここでは"どの選択肢にしたかを記憶する準備をしている"と考えて、5行目まで読み飛ばしてください。
以下は何を行っているかという説明です。
"Proc.new {|n| $branch = n }"はブロックと呼ばれる処理の塊で、それをgm.choice_procという変数に入れることにより、Procオブジェクトとしています。
このブロックというのは基本的には要素の数だけ{}内の処理を繰り返すといもので、ここではどの選択肢にしたかという値を$branchに代入しています。
この$branchは選択肢1が選択されたら0を、選択肢2を選択されたら1を、選択肢2を選択されたら2を返します。
あとはこの$branchによってどのような処理をするのかを書くだけです。
Procとはなんなのか、ブロックとは何なのか興味のある方はこちらのサイトを参考にしてください。
この行は選択肢が選択されるまで処理を待つための行です。
これがないと最後まで処理が流れてしまい選択肢に応じた処理ができなくなります。
Fiber.yieldというのは処理を一旦この行で止める処理と考えてください。
こちらで$branchに代入された数値に応じて指定した変数を代入しています。
今回はcase文を使って場合分けして文章表示させるという方法を取りましたがもっとスマートな方法もあるかと思います。
スクリプトエディタ画面でなく、イベント画面で編集したいのでこのような形にしました。
選択肢を4つ以下にしたいときはサンプルコードの{}の中とcase文を減らすことで可能です。
$game_message.num_input_digits_max = 桁数
$game_message.num_input_variable_id = 受け取る変数ID
Fiber.yield until Input.trigger?(:C)
$game_message.add("表示する文章")
$game_message.scroll_mode = true
$game_message.scroll_speed = 2
$game_message.scroll_no_fast = false
wait_for_message
$game_actors[アクターID].learn_skill(スキルID) #スキルを覚える
$game_actors[アクターID].forget_skill(スキルID) #スキルを忘れる
$game_player.followers.visible = trueかfalse #("ON"か"OFF"でもok)
$game_player.refresh #これが無いと変更が反映されない。
$game_player.followers.gather
#メンバーが集合するまでウェイトするなら以下のコードを追加
Fiber.yield until $game_player.followers.gather?
character = get_character(イベントのID)
character.animation_id = アニメーションのID
#表示終了までウェイトするなら以下のコードを追加
Fiber.yield while character.animation_id > 0
character = get_character(イベントID)
character.balloon_id = フキダシアイコンのID
#表示終了までウェイトをかけるときは以下のコードを追加
Fiber.yield while character.balloon_id > 0
#フェードアウト
Fiber.yield while $game_message.visible
screen.start_fadeout(フェードアウトするまでの時間)
wait(フェードアウトに合わせてイベントを止める時間)
#フェードイン
Fiber.yield while $game_message.visible
screen.start_fadein(フェードインするまでの時間)
wait(フェードインに合わせてイベントを止める時間)
tn = Color.new(赤,緑,青,強度)
screen.start_flash(tn, 時間)
#フラッシュが終わるまでウェイトするなら以下のコードを追加
wait(ウェイト時間)
$sp = screen.pictures[番号]
$tn = Tone.new(赤, 緑, 青 (,グレー))
$sp.start_tone_change($tn, 変化にかける時間)
bm = BattleManager #バトル処理の下準備
bm.setup(敵グループID, 逃走可能か,負けた場合も継続か)
bm.event_proc = Proc.new{|n| @branch[1] = n}
#戦闘の結果を@branchに代入、nに選択肢の数値を代入
$game_player.make_encounter_count
SceneManager.call(Scene_Battle)
Fiber.yield #戦闘までウェイト
if @branch[1] == 0 #勝利した場合の処理
$game_message.add("勝利した場合の処理")
elsif @branch[1] == 1 #逃走した場合の処理
$game_message.add("逃げた場合の処理")
elsif @branch[1] == 2 #負けた場合の処理
$game_message.add("負けた場合の処理")
end
g = [アイテムの種類,アイテムのID,価格を指定するか,値段]
#アイテムの種類 0:アイテム 1:武器 2:防具
#価格の指定 0:標準 1:指定
goods = [g]
SceneManager.call(Scene_Shop)
SceneManager.scene.prepare(goods, 購入のみか)
Fiber.yield
game_system.battle_bgm.name = ファイルの名前
$game_system.battle_bgm.volume = 音量
$game_system.battle_bgm.pitch = ピッチ
$game_system.battle_end_me.name = 名前
$game_system.battle_end_me.volume = 音量
$game_system.battle_end_me.pitch = ピッチ
$game_system.encounter_disabled = trueかfalse
#trueでエンカウント禁止、falseでエンカウント許可
#("ON"か"OFF"でもok)
ga = $game_actors[アクターのID]
ga.set_graphic(歩行グラのファイル名前, 歩行グラのID, 顔グラのファイル名前, 顔グラのID)
$game_player.refresh #アクターのグラフィックの再設定
ve = $game_map.vehicles[乗り物ID]
#乗り物ID 小型船:0 大型船:1 飛行船:2
ve.set_graphic("ファイル名", 何番目のチップか)
fn = "ファイル名"
$game_map.change_parallax(fn, x方向にループさせるか, y方向にループさせるか, x方向へのスクロールの速度, y方向へのスクロールの速度)
$game_map.terrain_tag(x座標, y座標) #地形タグを取得
$game_map.event_id_xy(x座標, y座標) #イベントIDを取得
$game_map.tile_id(x座標, y座標, レイヤー) #タイルIDを取得
#L=0でLayer1、L=1でLayer2、L=2でLayer3
$game_map.region_id(x座標, y座標) #リージョンIDを取得
value = operate_value(増減, 定数か変数か, 値)
#0:増やす 1:減らす/0:定数 1:変数
#変数を選択した際、値は変数のIDを示す
iterate_enemy_index(敵ID) do |enemy| #敵ID=-1以下で敵グループ全体
return if enemy.dead? #敵が戦闘不能で中断
enemy.change_hp(value, true)
if enemy.dead? #戦闘不能を許可するか
enemy.perform_collapse_effect
end
end
value = operate_value
(増減, 定数か変数か, 値)
#0:増やす 1:減らす/0:定数 1:変数
#変数を選択した際、値は変数のIDを示す
iterate_enemy_index(敵ID) do |enemy|
#敵ID=-1以下で敵グループ全体
enemy.mp += value
end
iterate_enemy_index(敵ID) do |enemy|
#敵ID=-1以下で敵グループ全体
already_dead = enemy.dead?
enemy.add_state(ステートID)
#敵の戦闘不能を許可するなら以下のif文を追加
if enemy.dead?
enemy.perform_collapse_effect
end
end
iterate_enemy_index(敵ID) do |enemy| #-1以下で敵全員
enemy.appear
$game_troop.make_unique_names
end
iterate_enemy_index(敵ID) do |enemy| #-1以下で敵全員
enemy.transform(変身させる敵キャラID)
$game_troop.make_unique_names
end
iterate_battler(敵キャラかアクターか,キャラクターID) do |battler|
#0で敵キャラ、1でアクター指定
next if battler.death_state?
battler.force_action(スキルID, 行動対象ID(Index))
BattleManager.force_action(battler)
Fiber.yield whileBattleManager.action_forced?
end
ツクールVXAceでウェイトをスクリプトで行うなら以下の通りです。
wait(ウェイトをかける時間(フレーム))
60フレームウェイトをかける
wait(60)
コード解説
ウェイトはスクリプトで行うとあっけないものですが、内部では以下のような処理となっています。
duration.times { Fiber.yield }
durationとはウェイトをかける時間で設定したフレーム数で、timesとはそのフレーム数{}内の処理を繰り返すというメソッド、処理です。
つまり、ここでは設定したフレーム数"Fiber.yield"を呼んでいるという処理になります。
Fiber.yieldとはここでは「今の処理を待機させ、他の処理行う」ものとして考えておいてください。
VXAceにおいてよく使われるウェイトの本質はFiber.yieldです。
ちなみにスクリプトエディタの中でウェイトをするならGraphics.waitを使うことが多いです。
Graphics.wait(60)
$game_party.all_members.all? { |a| a.hp == a.mhp }
$game_party.members.any? {|m| m.equips.include?($data_weapons[x]) }
$game_party.members.any? {|m| m.equips.include?($data_armors[x]) }
$game_party.members.any? { |m| m.skills.include?($data_skills[x]) }
$game_party.members.any? { |m| m.state?(x) }
($game_party.members.collect { |m| m.state?(x) }).size >= 2
$game_actors[x].element_rate(n) < 1.0
$game_actors[x].equips[n].nil?
ようするに無装備か?をスロット別に判定する。武器0,盾1,etc...
$game_party.members.include?($game_actors[x])
$game_party.battle_members.include?($game_actors[x])
戦闘外では隊列歩行に加わっているか?と同じ意味で分岐できるが、隊列歩行OFFの場合や細かく指定するなら以下を使う。
先頭から数えて4人目までのメンバーに入っているか?
$game_party.members[0..3].include?($game_actors[x])
$game_party.item_number($data_items[x]) >= 10
$game_party.leader.level >= 10
$game_party.members[0..1].any? { |m| m.equips[0] && m.equips[0].wtype_id == 4 }
条件を連ねる的なサンプル。
全種類
$game_party.all_items.empty?
アイテム
$game_party.items.empty?
武器
$game_party.weapons.empty?
防具
$game_party.armors.empty?
アイテム未所持ならコマンドをグレー表示させたい時にも使える。
そのままだとtrueを返すため、先頭に「!」を付ける。
【Window_MenuCommand】
add_command(Vocab::item, :item, !$game_party.all_items.empty?)
$game_self_switches[[$game_map.map_id, xx, "A"]]
$game_map.map_id は現在のマップを指すが、任意の数字にすれば遠隔のマップ内から読み取ることもできる。(そもそも同じマップならここを省略して書ける)
$data_mapinfos[$game_map.map_id].name.include?("ダンジョン")
データベース上の名前であって表示名ではないので注意。
特定のマップでしか使えないアイテムなんかの条件分岐に使う。
RPG::BGM.last.name == "Battle1"
DataManager.save_file_exists?
$game_player.moving?
$game_player.dash?
Input.dir4 == 0
Input.trigger?(:B) && Input.press?(:A)
例だとSHIFTキーを押しながらキャンセルキーが押されているか?になる。
$game_player.check_touch_event
イベント同士の衝突を避けたい時に使う。
$game_map.interpreter.running?
$game_message.visible
$game_party.in_battle
または
SceneManager.scene_is?(Scene_Battle)
$game_variables[x] = "薬草を届けよう!"
実際に表示するには\V[x]の制御文字を使ったりする。アクターの説明文に入れたりとか。ヘルプウィンドウに表示する場合はエディタ側で更新させる必要が出るかも。
$game_variables[x] = "王様に会いに行こう!"
$game_variables[x] += "いや、その前に!"
$game_variables[x] += "寝ておこう!"
のようにすると、「王様に会いに行こう!いや、その前に!寝ておこう!」と繋げられる。特に使い道はないと思う。
$game_variables[x].gsub!("王様","将軍")
で「王様」の部分を「将軍」に書き換えることができる。これも特に使い道はry
$game_variables[x] = $game_party.members.inject(0) { |a, m| a + m.atk }
$game_variables[x] = $game_party.members.max_by{ |a| a.level }.level
$game_variables[x] = $game_party.members.min_by{ |a| a.level }.level
a = $game_party.members.inject(0) { |n, m| n += m.level }b = a /= $game_party.members.size$game_variables[x] = b
$game_variables[x] = $game_actors[1].instance_variable_get("@param_plus")[2]
ドーピングアイテムで攻撃力が100→105に上昇したなら、変数には5が入る。
最後の[2]を変えれば他のパラメータにも対応する。0=HP,1=MP,2=攻撃力,3=防御力etc...
$game_variables[x] = @event_id
$game_variables[x] = $game_map.width(height)
$game_variables[x] = $game_map.events.values.select {|e| e.instance_variable_get(:@event).name.include?("宝箱") if !$game_self_switches[[e.id, "A"]]}.size
セルフスイッチAがONなら数に含まない。
$game_variables[x] = RPG::BGM.last
保存したBGMを再生
$game_variables[x].play
※n1,n2は好きな変数の番号
n1 = 1
n2 = 2
$game_variables[n1] = []
$game_variables[n2] = []
$game_party.all_items.each do |item|
$game_variables[n1].push(item)
x = $game_party.item_number(item)
$game_variables[n2].push(x)
$game_party.lose_item(item,x,false)
end
※保存したアイテムを元に戻す。
n1 = 1
n2 = 2
$game_variables[n1].each_index do |index|
item = $game_variables[n1][index]
x = $game_variables[n2][index]
$game_party.gain_item(item,x)
end
※変数[x]にアクターID[n]の装備を格納する。
a = $game_actors[n]
v = a.equips
a.clear_equipments
$game_variables[x] = v
※保存した装備を付け直す。
a = $game_actors[n]
v = $game_variables[x]
5.times do |index| a.change_equip(a.equip_slots[index], v[index])
end
$game_player.followers.each { |f| f.turn_toward_character($game_map.events[x]) }
$game_player.followers[x].set_direction(n)
隊列[x]は先頭(プレイヤー)を除くので、2人目以降を0から数える。
向き(n)は数字で指定する。2(↓) 4(←) 6(→) 8(↑)
$game_player.followers[x].move_forward
$game_player.followers[x].move_backward
$game_player.followers[x].jump(0, 0)
$game_player.followers[x].animation_id = n
表示終了までウェイトさせる場合は次のように記述する。
$game_player.followers[x].animation_id = n
Fiber.yield while $game_player.followers[x].animation_id > 0
$game_player.followers[x].balloon_id = n
1 = びっくり
2 = はてな
3 = 音符
4 = 怒り
5 = 汗
6 = くしゃくしゃ
7 = 沈黙
8 = 電球
9 = Zzz
$game_player.turn_toward_character($game_player.followers[0])
正確には後ろに付いてるキャラに振り向く。
$game_map.events[n].direction == $game_player.direction
$game_map.events[@event_id].direction == $game_player.direction
$game_map.events[n].pos?(x, y)
岩を押すイベントとかの条件分岐で使ったり。
$game_switches[x] = [2,4,6].all? { |i| $game_map.events[i].region_id == 63 }
条件分岐によるスイッチ操作を一括で行うサンプル。
get_character(n).start
テーブルの先にいるキャラに話しかけたりとか、離れたイベントを遠隔操作できる。
$game_player.turn_toward_character($game_map.events[self.event_id])
$game_map.events[n].instance_variable_set(:@priority_type,A)
A = 0 通常キャラの下
A = 1 通常キャラと同じ
A = 2 通常キャラの上
小数点を入れて更に上の2.5とかにすれば、イベント同士の重なりも防げるはず。(未検証)
$game_map.events.each {|id, ev| ev.lock }
$game_map.events.each {|id, ev| ev.unlock }
会話中とかに他のイベントの自律移動を止めたい時に使うが、lockをするとプレイヤーの方に全イベントが視線を向ける怖い仕様があるので、それが嫌ならエディタを書き換える。
$game_self_switches[[@map_id, @id, "A"]] = true
※跳ばせるイベントの移動ルートで設定する
スクリプト:@move_speed = 20
スクリプト:@y -= 0.7
SE:'Jump2', 80, 100
スクリプト:@y += 0.7
スクリプト:@move_route_index = -1
某所でよく使われるピョンピョン跳ねるジャンプの再現。
動作を繰り返すにチェックを入れるなら最後の行は無くてもいい。
a = $game_actors[1]
b = a.character_name
c = a.character_index
$game_map.events[n].set_graphic(b, c)
次のようにすれば、パーティメンバーの任意のキャラと同じにもできる。
a = $game_party.members[x]
x = 0 隊列の1人目
x = 1 隊列の2人目
etc...
$game_map.events[n].set_direction($game_player.direction)
if $game_player.moving?
$game_map.events[n].
move_straight($game_player.direction)
Fiber.yield while $game_player.moving?
end
場合によっては移動速度の設定やすり抜けONなどを忘れずに。
dx = ($game_player.x - $game_map.events[n].x).abs
dy = ($game_player.y - $game_map.events[n].y).abs
$game_variables[x] = (dx + dy)
v = $game_variables[x]
p = $game_player
e = $game_map.events[n]
a = (p.x - e.x).abs
b = (p.y - e.y).abs
v = (a + b)
f = 25
d = ((11 - v) < 0 ? 0 : (11 - v))
o = ((f * d > 255) ? 255 : (f * d))
e.instance_variable_set(:@opacity,o)
上記の使用例。適当なイベントから並列処理で動かす。
距離が離れてると見えないけど、近づくと徐々にイベント[n]の姿が見えるようになる。
p = $game_player
e = $game_map.events[n]
$game_switches[x] = false
dx = (e.x - p.x)
dy = (e.y - p.y)
case p.direction
when 2; $game_switches[x] = dx == 0 && dy == 1
when 4; $game_switches[x] = dx == -1 && dy == 0
when 6; $game_switches[x] = dx == 1 && dy == 0
when 8; $game_switches[x] = dx == 0 && dy == -1
end
set = RPG::MoveRoute.new
set.repeat = false
set.skippable = true
set.wait = true
set.list = []
set.list.push( RPG::MoveCommand.new(37, []) )
set.list.push( RPG::MoveCommand.new(1, []) )
set.list.push( RPG::MoveCommand.new(1, []) )
set.list.push( RPG::MoveCommand.new(1, []) )
set.list.push( RPG::MoveCommand.new(39, []) )
set.list.push( RPG::MoveCommand.new )
$game_map.events.each do |i,e|
next if [5, 6, 7].include?(i)
e.force_move_route(set)
end
イベントをスクリプトで移動させるサンプル。
火事だ~!で全員逃げるイベントとか組むのに使える。
見ての通りだけど、このままだと行数が多すぎてスクリプト欄に入り切らないので注意。
$game_map.airship.set_location($game_map.map_id, $game_player.x, $game_player.y)
airshipをboatやshipに変えると飛行船以外にできる。
もしくはvehicles[x]にする。0=boat,1=ship,2=airship
if $game_map.ship_passable?($game_player.x, $game_player.y - 1)
$game_player.animation_id = 57
$game_map.ship.set_location($game_map.map_id, $game_player.x, $game_player.y - 1)
else
Audio.se_play("Audio/SE/Buzzer1")
end
プレイヤーの1マス上が船の通行範囲かどうかを判定。
OKなら船を召喚して、ダメならブザー音。
呼ぶ際にアニメーションを設定してるが、そのままだとプレイヤーが炎を浴びるだけなので(謎)、アニメーション自体の設定で基準位置を頭上にするとそれっぽくなる。
$game_map.data[x, y, 2]
例:コーヒーカップをプレイヤーの1マス下に出現させる
(デフォルトかつマップのタイルセットが内装の場合)
$game_map.data[$game_player.x, $game_player.y + 1, 2] = 260
場所移動などでリセットされるので、その場限りのイベント演出で使う。いちいちスイッチやグラフィックの変更を行う必要がなくなる。最後の数字がタイルセットのオブジェクトで、タイルセットBの左上が0となる。
[2,4,6,8].each{|id|$game_switches[id] = true}
(1..$game_map.events.values.size).each{|ev|$game_self_switches[[@map_id, ev, "A"]] = true}
SW = [(2..5).to_a, 8, 9, (15..20).to_a].flatten
SW.each{|ev|$game_self_switches[[@map_id, ev, "A"]] = false}
複数かつ飛び番号ありの方法。(イベントID2~5、8、9、15~20が対象)
$data_actors.compact.each{ |actor| $game_party.add_actor(actor.id) if !actor.name.empty? }
$game_party.members.each { |actor| $game_party.remove_actor(actor.id) if actor.id > 1 }
(2..10).each{|id|$game_actors[1].learn_skill(id)}
※上から、アイテム、武器、防具。
$data_items.compact.each{|item|
$game_party.gain_item(item, 99) if
!item.name.empty? }
$data_weapons.compact.each{|item|
$game_party.gain_item(item, 99) if
!item.name.empty? }
$data_armors.compact.each{|item|
$game_party.gain_item(item, 99) if
!item.name.empty? }
ひとまずレイヤーは全て分かれている状態で大丈夫です。
レイヤーウィンドウのどこでもいいので、右クリックを押して「表示レイヤーのコピーを結合」を選択。
すると、今表示されている部分を結合したレイヤーが、元レイヤーを壊さない状態で追加されます。
STEP.1でできたレイヤーを選び、モザイクをかける部分よりちょっと広めに、投げ縄ツールなどで選択します。ざっくりで大丈夫です。
選択した部分を複製し、新しいレイヤー(以下、モザイクレイヤー)とします。
Ctrl + C、Ctrl + V と入力すればパパっとできます。
コピー元のレイヤーは、使わないので非表示にします。
さらに、Ctrl +Dで選択状態を解除しておきます。
そのままモザイクをかけると汚くなりがちですが、ガウスぼかしをかけてからモザイクをかけると、なぜかけっこうマシになります。
というわけで、モザイクレイヤーを選んでいる状態で、「フィルター→ぼかし→ガウスぼかし」を選択します。ぼかす範囲は、10くらいでいいです。
モザイクレイヤーを選んでいる状態で、「フィルター→効果→モザイク」をかけます。ブロックサイズはお好みで。
これでいい感じのモザイクができました!え?汚いって?うーん、確かに枠が汚い!なんてこった!
というわけで、綺麗にしましょう。
エアブラシツールの「強め」の透明色を使って、モザイクのフチの汚い部分を、優しく削っていきます。