解決済 【VX Ace】バトル画面の属性アイコン表示について

モミジ
記事: 4
登録日時: 2018年10月12日(金) 22:54

解決済 【VX Ace】バトル画面の属性アイコン表示について

投稿記事by モミジ » 2018年10月13日(土) 00:03

現在VX Aceにてゲームを制作しているゲーム制作初心者です。

ゲームでよく見る「〇属性は△属性に強く×属性に弱い」という
設定を使いたいと考えています。
そこでバトル画面にて敵味方問わず名前の隣に属性アイコンを
表示したいのですが上手くいかず長らく作業が滞っています。

スクリプトのことはよく分からないのですがゲーム内スクリプトを
見て応用したものを書いたり、公式や自作VX Aceスクリプトを
公開している方のサイトを拝見しているのですがエラーが発生するか
ゲーム上では何も変化がないかのどちらかです。
(私の認識ではありますが、目的と合致するスクリプトはあり
ませんでした。)

皆様のお知恵を拝借したい点は
・バトル画面にて敵/味方の名前の隣に属性アイコンを表示する方法
・そのスクリプトを書く場所
になります。
(物理→魔法→防御→、という3属性で考えています。)

見落としや表現が間違っている箇所もあるかと思いますが、お願いいたします。
最後に編集したユーザー モミジ on 2018年10月17日(水) 01:52 [ 編集 2 回目 ]

faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 【VX Ace】バトル画面の属性アイコン表示について

投稿記事by faida » 2018年10月13日(土) 10:00

https://tm.lucky-duet.com/viewtopic.php?f=37&t=5833
上記のスクリプトはどうでしょう。アクターや敵キャラの名前に制御文字を使うことができ、
制御文字\I[n]でn番目のアイコンを描画することができます。

もしそういうのではない(属性やその相性がゲーム中で変化する等)、もしくは他に名前描画に関するスクリプトを
入れている場合は、

コード: 全て選択

draw_icon(index, x, y) # indexはアイコン番号、xyは座標
で任意の箇所にアイコンを描画することができるので、これを
・Window_Baseのdraw_actor_name(もしくはWindow_BattleStatusのdraw_basic_area)
・Window_BattleEnemyのdraw_item
に入れれば動くかなと思います。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
モミジ
記事: 4
登録日時: 2018年10月12日(金) 22:54

Re: 【VX Ace】バトル画面の属性アイコン表示について

投稿記事by モミジ » 2018年10月13日(土) 12:24

faida 様

ご対応いただき、ありがとうございます。
動作確認いたしました。
こちら[ draw_icon(index, x, y) # indexはアイコン番号、xyは座標 ]の
方法で進めたいと考えているのですが1つ質問がございます。

敵/味方IDに紐づけて属性アイコンを指定することは可能でしょうか?
初歩的なこととは思いますが、やはり私では正しく書けずエラーが
発生してしまいました。

見当違いな質問でしたら申し訳ございません。
お手数をおかけしますが、お返事いただけると幸いです。
お願いいたします。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 【VX Ace】バトル画面の属性アイコン表示について

投稿記事by faida » 2018年10月13日(土) 13:47

IDで条件分岐したいのであれば、アクターデータはどちらにおいても「actor.id」で、
敵キャラは「$game_troop.alive_members[index].enemy_id」で取得できます。

が、属性が3つしかないのであれば、IDで分岐するよりも耐性で分岐したほうが早いかもしれません。
以下は敵キャラの耐性で条件分岐した例です。

コード: 全て選択

class Window_BattleEnemy < Window_Selectable
  def draw_item(index)
    change_color(normal_color)
    name = $game_troop.alive_members[index].name # おなまえ
    rect = item_rect_for_text(index) # 描画領域の取得
    if $game_troop.alive_members[index].element_rate(1) > 1.0 # 属性1が弱点
      icon_index = 101
    elsif $game_troop.alive_members[index].element_rate(1) < 1.0 # 属性1に耐性
      icon_index = 102
    else # 属性1が弱点でも耐性もない
      icon_index = 103
    end
    draw_icon(icon_index, rect.x, rect.y) # アイコン描画
    rect.x += 24 # アイコン描画領域の分だけ右にずらす
    rect.width -= 24 # アイコン描画領域の分だけ長さを減らす
    draw_text(rect, name) # おなまえ
  end
end

他にはメモ欄を使った条件分岐とかはありますが、もしそちらを知りたければまた聞いてください。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
モミジ
記事: 4
登録日時: 2018年10月12日(金) 22:54

Re: 【VX Ace】バトル画面の属性アイコン表示について

投稿記事by モミジ » 2018年10月13日(土) 15:56

faida 様

動作確認いたしました。
より最適な方法をご提示くださり、ありがとうございます。

参考にさせていただきたいのでメモ欄を使用したケースをご教示のほど、
何卒お願いいたします。

お手数をおかけしますが、お願いいたします。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 【VX Ace】バトル画面の属性アイコン表示について

投稿記事by faida » 2018年10月15日(月) 08:42

遅くなって申し訳ありません。

メモ欄を使ったケースは少し難しいですが、基本的には「複数の要素を考慮する」ことが重要です。
①メモ欄を読み込む
メモ欄の読み込み方は多岐に渡ります(私も色々な場でかなりの回数言及していますが)。
以下は一例です。

コード: 全て選択

class RPG::BaseItem
  def name_icon
    return @name_icon if @name_icon
    @name_icon = (note =~ /<名前アイコン\s*(\d+)>/ ? $1.to_i : 0)
  end
end
この方法では<名前アイコン n>でアイコンnを表示する、という設定になります。

②メモ欄の内容をバトラー(アクター、敵キャラ)に反映する
ここで、アクターにのみ、敵キャラにのみ設定する場合は、そこから読み込んでおしまいです。
アクターなら「actor.actor.name_icon」、敵キャラなら「$game_troop.alive_members[index].enemy.name_icon」で
読み込めるので、提示したicon_indexの代わりにこれらを用いて完成となります。
が、(私はモミジさんがどのような手法で解決したかよくわかっていないので、)
装備やステートで耐性が変化した場合、そのままアクターや敵キャラのメモ欄を読み込むと
不都合が生じる場合があります。

そこで、予めバトラー側で読み込むデータを整理することが重要となります。
例えば、アクターならステートを最優先し、その次に装備品、職業、アクターの順で読み込む
という設定にするとします。敵キャラはステートと敵キャラしかないので、ステートを優先するとします。
そうすると、以下のようになるはずです。

コード: 全て選択

class Game_Actor
  def name_icon
    result = states.find{|a|a.name_icon > 0}
    return result.name_icon if result
    result = feature_objects.reverse.find{|a|a.name_icon > 0}
    result ? result.name_icon : 0
  end
end
class Game_Enemy
  def name_icon
    result = feature_objects.find{|a|a.name_icon > 0}
    result ? result.name_icon : 0
  end
end
feature_objectsは、アクターなら中身が[ステート、アクター、職業、装備品]の順で並んでいます。
なので、ステートだけ先に読んでしまって、残りを逆順で読み込む、というわけですね。

③バトラーのデータから読み出す
あとは特にコメントする必要もないと思います。

コード: 全て選択

class Window_BattleEnemy < Window_Selectable
  def draw_item(index)
    change_color(normal_color)
    name = $game_troop.alive_members[index].name # おなまえ
    icon_index = $game_troop.alive_members[index].name_icon # アイコン
    rect = item_rect_for_text(index) # 描画領域の取得
    draw_icon(icon_index, rect.x, rect.y) # アイコン描画
    rect.x += 24 # アイコン描画領域の分だけ右にずらす
    rect.width -= 24 # アイコン描画領域の分だけ長さを減らす
    draw_text(rect, name) # おなまえ
  end
end

何か不明点等ありましたら、お手数ですがお知らせください。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
モミジ
記事: 4
登録日時: 2018年10月12日(金) 22:54

Re: 【VX Ace】バトル画面の属性アイコン表示について

投稿記事by モミジ » 2018年10月17日(水) 01:49

faida 様

ご連絡が遅くなり、大変失礼いたしました。
ご多忙のところ迅速なご対応をいただき、ありがとう
ございます。
所用のため申し訳ございませんが動作確認は再来週末に
なります。そのため誠に勝手ながら以上をもちまして
本件を終結いたします。

細やかなご対応をいただき、深く感謝申し上げます。

“VX / Ace:質問” へ戻る