ページ 11

【解決】VX RGSS2【アイテム消費スキル】に残りの所持数表示

Posted: 2018年10月07日(日) 00:26
by 金田一光彦
毎度お世話になっております。
Space not farさんのhttp://muspell.raindrop.jp/file/rgss2_itemcost.txt
アイテム消費スキルで、本来MP使用料がでる場所に消費アイテムの残り所持数を「残り〇〇」の様に表示したいのですが、どうすれば改造できるかわからずつんでいます。
$game_party.item_number($data_items[$1.to_i])
このコードがキーとなると思うのですが…自分なりに色々改造に挑戦したもののできない状態です。
スキル画面で、スキル名の横に(MP表示される場所に)「所持数〇〇」と表示できるようになるのであれば改造してくださる方の書きやすいように改造してくださってもかまいません。
よろしくお願いいたします。

Re: VX RGSS2【アイテム消費スキル】に残りの所持数表示

Posted: 2018年10月07日(日) 12:24
by faida
こんにちは。

改造を試したということは、改変場所については既知のものであるとしてよろしいですかね。
一応、Window_Skill内該当箇所を載せておきます。

コード: 全て選択

  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    skill = @data[index]
    if skill != nil
      rect.width -= 4
      enabled = @actor.skill_can_use?(skill)
      draw_item_name(skill, rect.x, rect.y, enabled)
      self.contents.draw_text(rect, @actor.calc_mp_cost(skill), 2)
    end
  end
さて、スキルの消費アイテムIDに関しては「SNF.skill_itemcost(skill, 0)」を、その個数に関しては
「SNF.skill_itemcost(skill, 1)」を使用することによって得られます。
そしてその所持数に関しては、金田一光彦さんの見立て通り、$game_party.item_number(item)で取得できますが、
そのitemの取得方法は$data_items[SNF.skill_itemcost(skill, 0)]となります。

さて、ここで重要となるポイントは2つとなります。
1. そのスキルがアイテム消費スキルかを判別する
2. そのスキルの消費アイテムの所持数を描画する
1は至極簡単、消費アイテムIDが存在すればよいので、「if SNF.skill_itemcost(skill, 0)」で事足ります。
2もまぁ……テキスト描画領域が限られているので、テキストに関してはお任せします。
改変を行ったスクリプトを以下に示します。お持ち帰り用ですので、多分このまま使えると思います。

コード: 全て選択

class Window_Skill
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    skill = @data[index]
    if skill != nil
      rect.width -= 4
      enabled = @actor.skill_can_use?(skill)
      draw_item_name(skill, rect.x, rect.y, enabled)
      if SNF.skill_itemcost(skill, 0)
        item = $data_items[SNF.skill_itemcost(skill, 0)]
        num = $game_party.item_number(item).to_s
        self.contents.draw_text(rect, "残り "+num, 2)
      else
        self.contents.draw_text(rect, @actor.calc_mp_cost(skill), 2)
      end
    end
  end
end
何か不明点等あれば遠慮なくどうぞ。

Re: VX RGSS2【アイテム消費スキル】に残りの所持数表示

Posted: 2018年10月07日(日) 22:19
by 金田一光彦
faida様

毎度のことながらお世話になっております。
教えていただいたスクリプトをそのまま使うと他のMP表示系(Kamesoftさんのオーバードライブ技でMP0は非表示など)と競合してしまうのでエイリアス化したら効果がなくなってしまいました。
以下のようにしたのですが効果がなくなってしまったのですが、どこがいけないのかご検討付きますでしょうか?
スクリプトの導入位置を変えたりしてみましたがそれでも直りませんでした…

コード: 全て選択

class Window_Skill
 alias snf_item_use_skill draw_item
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    skill = @data[index]
    if skill != nil
      rect.width -= 4
      enabled = @actor.skill_can_use?(skill)
      draw_item_name(skill, rect.x, rect.y, enabled)
      if SNF.skill_itemcost(skill, 0)
        item = $data_items[SNF.skill_itemcost(skill, 0)]
        num = $game_party.item_number(item).to_s
        self.contents.draw_text(rect, "残り "+num, 2)
      else
        self.contents.draw_text(rect, @actor.calc_mp_cost(skill), 2)
      end
      snf_item_use_skill(index)
    end
  end
end

Re: VX RGSS2【アイテム消費スキル】に残りの所持数表示

Posted: 2018年10月08日(月) 08:01
by faida
答えは簡単です。

コード: 全て選択

    rect = item_rect(index)
    self.contents.clear_rect(rect)
ここの二行は「描画領域の取得」ならびに「その部分の削除」となっています。
これは元々のメソッドに存在する処理で、おそらくどのスクリプトでも搭載されているでしょう。
つまりエイリアスで元の処理に飛ばすと、もちろん描画したものが消えてしまいます。

こういう場合には処理を入れる箇所を工夫しましょう。以下は一例です。

コード: 全て選択

class Window_Skill
 alias snf_item_use_skill draw_item
  def draw_item(index)
    snf_item_use_skill(index)
    skill = @data[index]
    if skill != nil
      enabled = @actor.skill_can_use?(skill)
      if SNF.skill_itemcost(skill, 0)
        rect = item_rect(index)
        self.contents.clear_rect(rect)
        rect.width -= 4
        draw_item_name(skill, rect.x, rect.y, enabled)
        item = $data_items[SNF.skill_itemcost(skill, 0)]
        num = $game_party.item_number(item).to_s
        self.contents.draw_text(rect, "残り "+num, 2)
      end
    end
  end
end

Re: VX RGSS2【アイテム消費スキル】に残りの所持数表示

Posted: 2018年10月09日(火) 23:25
by 金田一光彦
faida 様

解説ありがとうございます。

コード: 全て選択

    rect = item_rect(index)
    self.contents.clear_rect(rect)

の意味をあまり理解していなかったのでとても勉強になりました。
エイリアスも、導入行を変えてみると言う工夫、参考になります。 ありがとうございました。