お返事

 2018-05-26
お久しぶりです。

RGSS3 スクリーンショットの不具合報告ありがとうございます。
エラー行の module Graphics を class << Graphics に変更していただければと思います。
このスクリプト変更箇所が少なかったので、動作確認したものをコピーせずに手打ちしたため、
勘違いで修正を間違ったようです。申し訳ありません。
サイトの修正は、6月の頭頃できると思います。
スマホからFTPに繋げれたので修正しました。

> ポリフェノール さん
すみません、帰省した1日では書ききれなくて、お返事遅くなりました。
出張先にネット環境がないので、スマホからの投稿でおかしな所あれば申し訳ありません。

1.イベントコマンド「移動ルートの設定」のスクリプトについて
便利なスクリプトと言われましても、使用した経験がないのでよくわかりません。
スクリプトの項目は用意されてはいますが、プリセットを拡張して、それを呼び出せるように用意されているものではないでしょうか?
キャラクターの移動は、そこまで単純なものではないので、きちんと整備された機能を作成して呼び出さないとうまく動作しないと思います。
特定のマスへの移動もデフォルトでは経路探索の処理がありませんので、拡張するかイベントコマンドを使った正攻法が楽な方法かと思います。
半生@Page さんの『移動ルートの拡張』や DAIpage さんの『移動ルート機能ぱわーあっぷ』などを導入されてはいかがでしょう?

例にある "@x -= 4" に関しても、これだけでは、ぱっと見た感じ、向きが変わらない、すり抜ける、無効な座標が使用できてしまうなどの問題があるようです。
ループするマップに対応したいとのことですが、無効な座標が関係しているようです。
これを正すには、$game_map.round_x や $game_map.round_y を使用します。
しかし、@x = $game_map.round_x(@x-4) では、移動方向が逆になる場合があるため
@x -= 4 の実行・移動後、moveto(@x,@y) で正しい座標に移動させるなどの方法をとる必要があります。
moveto は、イベントコマンドの「イベント位置の設定」みたいなものです。
@x = $game_map.round_x(@x) とするより短くて済みます。
201805262011441b0.png
ちなみにマップのループに関して、修正されていない不具合があるので、修正するスクリプトを導入して下さい。

何にしろ、一行では難しい、可読性が悪くなるなどの問題からスクリプトは使用しない方が良いと思います。
それでもと言われるのでしたら移動ルートのスクリプトは、Game_Character クラスに使用できる機能が定義されています。
Game_Character#move_type_custom には、移動ルートコマンドのスクリプトの一覧がありますので、参考にされてください。

一行で記述しなければならないことから、デフォルトの状態では多くのことはできませんが、
移動ルート内で条件分岐がしたい場合は、次のような3つの記述できます。
1)真のとき実行 if 条件
2)条件 ? 真のとき実行 : 偽のとき実行
3)先に実行 && 結果が真のとき実行
例えば、move_forward && turn_right_90 とすれば、一歩前進できなければ右を向くという処理になります。

これを利用して実践的ではないですが、迷路の出口を探す処理を実装したのが次のスクリプトです。
移動ルート1つ設定するだけでゴールまで進んでくれます。
turn_left_90 && move_forward && turn_right_90 && move_forward && turn_right_90 && move_forward && turn_right_90 && move_forward
2018052620112675b.png


他にも、向かって右に進む処理など
__send__(“move_#{%w(left up down right)[@direction/2-1]}”)

このようなことができますが、小手先というか裏技的なテクニックより可読性を優先すべきと思いますので、きちんとスクリプトに組み込むべきだと思います。
向かって左に進む処理を組み込むには、
class Game_Character
def move_left_forward
case @direction
when 2; move_right(false)
when 4; move_down(false)
when 6; move_up(false)
when 8; move_left(false)
end
end
のようになります。
これで、移動ルートのスクリプトに move_forward_left と書けば機能するようになります。


2.エンカウントについて
これはシンボルエンカウントで検索すれば、スクリプトがあるんじゃないかと思います。

実装方法としては、プレイヤーの位置とイベントの位置から距離を求めて範囲内ならイベントをプレイヤーに近づけるという感じかと思います。
距離は、ループするマップまで考慮するならスクリプトを使った方が簡単です。
Game_Character#distance_x_from_player
Game_Character#distance_y_from_player
プレイヤーからイベントまでの距離を取得できます。
「このイベント」を取得するには get_character(0) なので get_character(0).distance_x_from_player といったところです。

プリセットを拡張して、イベントの前方にプレイヤーがいるかを調べるためのスクリプトは、次のようになります。
単純に距離だけみて前方にプレイヤーがいるかだけを調べる簡単なものですが。
class Game_Interpreter
def is_player_front?(range = 1)
character = get_character(0)
if character && range > 0
sx = character.distance_x_from_player
sy = character.distance_y_from_player
case character.direction
when 8 # 上
return sx == 0 && sy > 0 && sy.abs <= range
when 2 # 下
return sx == 0 && sy < 0 && sy.abs <= range
when 4 # 左
return sy == 0 && sx > 0 && sx.abs <= range
when 6 # 右
return sy == 0 && sx < 0 && sx.abs <= range
end
end
return false
end
end

201805262011552ef.png 20180526201207a87.png


3.条件分岐のスクリプトについて
アクターの情報は、Game_Battler、Game_Actor クラスに定義されています。
そして、アクターのオブジェクトは、$game_party.members[パーティの何番目か]もしくは
$game_actors[アクターのID]で取得できます。
Game_Actor#actor では、アクターのデータベース情報
Game_Actor#class では、クラスのデータベース情報が取得できます。
これらのデータベースの情報は、リファレンスに定義が載っています。

たとえば、パーティの先頭がHP30%未満かは
$game_party.members[0].hp/$game_party.members[0].maxhp*100 >= 30

アクターIDが1のクラス名が勇者かは
$game_actors[1].class.name == “勇者”

パーティ全メンバーがレベル10以上
$game_party.members.all? {|a| a.level >= 10 }

パーティ全メンバーが生存
$game_party.dead_members.empty?

イベントコマンド「条件分岐」の内容は、Game_Interpreter#command_111 で定義されています。
ここを見ればイベントコマンドにある条件は、すべてスクリプトにできると思います。
コメント




 

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


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

トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/769-132a0006
≪ トップページ ≫
カレンダー
10 << 2019/11 >> 12
- - - - - 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

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

リンク