閲覧数 681 推奨数 0 コメント 0
?

Shortcut

Prev前へ 書き込み

Next次へ 書き込み

Larger Font Smaller Font 上へ 下へ Go comment 印刷
?

Shortcut

Prev前へ 書き込み

Next次へ 書き込み

Larger Font Smaller Font 上へ 下へ Go comment 印刷

아래의 스크립트는 아이템을 종류별로 분류하여 보여주는 스크립트 입니다.


 


 


-사용방법-


우선 스크립트창을 띄어서 Main 이라는 곳에 마우스 우클릭 '삽입' 하고 빈 클래스를 만드세요.
그 다음 그 빈 클래스 이름을 Harts_Window_ItemTitle 로 정하고 아래 스크립트를 전부 복사해서 내용에 붙이고 저장하세요.
 


 


#==============================================================================
# ■ Harts_Window_ItemTitle
#------------------------------------------------------------------------------
#  아이템 화면에서 타이틀을 표시하는 윈도우。
#==============================================================================


class Harts_Window_ItemTitle < Window_Base
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 160, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120, 32, $data_system.words.item, 1)
  end
end


#==============================================================================
# ■ Harts_Window_ItemCommand
#------------------------------------------------------------------------------
#  아이템의 종별 선택을 실시하는 윈도우입니다.
#==============================================================================


class Harts_Window_ItemCommand < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(0, 64, 160, 288)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 8
    @commands = ["유즈 아이템", "배틀 아이템", $data_system.words.weapon, $data_system.words.armor1, $data_system.words.armor2, $data_system.words.armor3, $data_system.words.armor4, "이벤트 아이템"]
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i, normal_color)
    end
  end
  #--------------------------------------------------------------------------
  # ● 항목의묘화
  #     index : 항목번호
  #     color : 문자색
  #--------------------------------------------------------------------------
  def draw_item(index, color)
    self.contents.font.color = color
    y = index * 32
    self.contents.draw_text(4, y, 128, 32, @commands[index])
  end
  #--------------------------------------------------------------------------
  # ● 헬프텍스트 갱신
  #--------------------------------------------------------------------------
  def update_help
    case self.index
    when 0
      @text = @commands[0]
    when 1
      @text = @commands[1]
    when 2
      @text = @commands[2]
    when 3
      @text = @commands[3]
    when 4
      @text = @commands[4]
    when 5
      @text = @commands[5]
    when 6
      @text = @commands[6]
    when 7
      @text = @commands[7]
    end
    @help_window.set_text(@text)
  end
end


#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
#  아이템 화면에서, 소지 아이템의 일람을 표시하는 윈도우입니다.
#==============================================================================


class Harts_Window_ItemList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(160, 0, 480, 416)
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 아이템의 취득
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● 리프레쉬
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
  end
  #--------------------------------------------------------------------------
  # ● 아이템 일람 설정
  #     command : 선택중의 커맨드
  #--------------------------------------------------------------------------
  def set_item(command)
    refresh
    case command
    when 0
      for i in 1...$data_items.size
        if ($data_items[i].occasion == 0 or $data_items[i].occasion == 2) and $game_party.item_number(i) > 0
          @data.push($data_items[i])
        end
      end
    when 1
      for i in 1...$data_items.size
        if ($data_items[i].occasion == 1 and $game_party.item_number(i) > 0)
          @data.push($data_items[i])
        end
      end
    when 2
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons[i])
        end
      end
    when 3
      for i in 1...$data_armors.size
        if $data_armors[i].kind == 0 and $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    when 4
      for i in 1...$data_armors.size
        if $data_armors[i].kind == 1 and $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    when 5
      for i in 1...$data_armors.size
        if $data_armors[i].kind == 2 and $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    when 6
      for i in 1...$data_armors.size
        if $data_armors[i].kind == 3 and $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    when 7
      for i in 1...$data_items.size
        if $data_items[i].occasion == 3 and $game_party.item_number(i) > 0
          @data.push($data_items[i])
        end
      end
    end
    # 항목수가 0 이 아니면 비트 맵을 작성해, 전항목을 묘화
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      self.contents.clear
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 종류별 아이템 수의 취득
  #--------------------------------------------------------------------------
  def item_number
    return @item_max
  end
  #--------------------------------------------------------------------------
  # ● 항목의 묘화
  #     index : 항목번호
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    if item.is_a?(RPG::Item) and
       $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4
    y = index * 32
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 400, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 416, y, 24, 32, number.to_s, 2)
  end
  #--------------------------------------------------------------------------
  # ● 헬프 텍스트 갱신
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end


#==============================================================================
# ■ Harts_Scene_Item
#------------------------------------------------------------------------------
#  아이템 화면의 처리를 실시하는 클래스입니다. 재정의
#==============================================================================


class Scene_Item
  #--------------------------------------------------------------------------
  # ● 메인 처리
  #--------------------------------------------------------------------------
  def main
    # 타이틀 윈도우를 작성
    @itemtitle_window = Harts_Window_ItemTitle.new
    #커멘드 윈도우를 작성
    @itemcommand_window = Harts_Window_ItemCommand.new
    @command_index = @itemcommand_window.index
    #아이템 윈도우를 작성
    @itemlist_window = Harts_Window_ItemList.new
    @itemlist_window.active = false
    #헬프 윈도우를 작성
    @help_window = Window_Help.new
    @help_window.x = 0
    @help_window.y = 416
    # 헬프 윈도우를 관련지어
    @itemcommand_window.help_window = @help_window
    @itemlist_window.help_window = @help_window
    # 타겟 윈도우를 작성 (불가시·비액티브하게 설정)
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_window.active = false
    # 아이템 윈도우 내용 표시
    @itemlist_window.set_item(@command_index)
    # 트란지션 실행
    Graphics.transition
    # 메인 루프
    loop do
      # 게임 화면을 갱신
      Graphics.update
      # 입력 정보를 갱신
      Input.update
      # 프레임 갱신
      update
      # 화면이 바뀌면 루프를 중단
      if $scene != self
        break
      end
    end
    # 트란지션 준비
    Graphics.freeze
    # 윈도우를 해방
    @itemtitle_window.dispose
    @itemcommand_window.dispose
    @itemlist_window.dispose
    @help_window.dispose
    @target_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신
  #--------------------------------------------------------------------------
  def update
    # 윈도우를 갱신
    @itemtitle_window.update
    @itemcommand_window.update
    @itemlist_window.update
    @help_window.update
    @target_window.update
    if @command_index != @itemcommand_window.index
      @command_index = @itemcommand_window.index
      @itemlist_window.set_item(@command_index)
    end
    # 커멘드 윈도우가 액티브의 경우: update_itemcommand 를 부른다
    if @itemcommand_window.active
      update_itemcommand
      return
    end
    # 아이템 윈도우가 액티브의 경우: update_itemlist 를 부른다
    if @itemlist_window.active
      update_itemlist
      return
    end
    # 타겟 윈도우가 액티브의 경우: update_target 를 부른다
    if @target_window.active
      update_target
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (커멘드 윈도우가 액티브의 경우)
  #--------------------------------------------------------------------------
  def update_itemcommand
    # B 버튼이 밀렸을 경우
    if Input.trigger?(Input::B)
      # 캔슬 SE 를 연주
      $game_system.se_play($data_system.cancel_se)
      # 메뉴 화면으로 전환해
      $scene = Scene_Menu.new(0)
      return
    end
    # C 버튼이 밀렸을 경우
    if Input.trigger?(Input::C)
      # 선택중의 커멘드의 아이템이 없는 경우
      if @itemlist_window.item_number == 0
        # 버저 SE 를 연주
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 결정  SE 를 연주
      $game_system.se_play($data_system.decision_se)
      # 아이템 윈도우를 액티브하게 한다
      @itemcommand_window.active = false
      @itemlist_window.active = true
      @itemlist_window.index = 0
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (아이템 윈도우가 액티브의 경우)
  #--------------------------------------------------------------------------
  def update_itemlist
    # B 버튼이 밀렸을 경우
    if Input.trigger?(Input::B)
      # 캔슬 SE 를 연주
      $game_system.se_play($data_system.cancel_se)
      # 아이템 윈도우를 액티브하게 한다
      @itemcommand_window.active = true
      @itemlist_window.active = false
      @itemlist_window.index = 0
      @itemcommand_window.index = @command_index
      return
    end
    # C 버튼이 밀렸을 경우
    if Input.trigger?(Input::C)
      # 아이템 윈도우로 현재 선택되고 있는 데이터를 취득
      @item = @itemlist_window.item
      # 사용 아이템이 아닌 경우
      unless @item.is_a?(RPG::Item)
        # 버저 SE 를 연주
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 사용할 수 없는 경우
      unless $game_party.item_can_use?(@item.id)
        # 버저 SE 를 연주
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 결정 SE 를 연주
      $game_system.se_play($data_system.decision_se)
      # 효과 범위가 아군의 경우
      if @item.scope >= 3
        # 타겟 윈도우를 액티브화
        @itemlist_window.active = false
        @target_window.x = 304
        @target_window.visible = true
        @target_window.active = true
        # 효과 범위 (단체/전체)에 따라 커서 위치를 설정
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        else
          @target_window.index = 0
        end
      # 効果範囲が味方以外の場合
      else
        # コモンイベント ID が有効の場合
        if @item.common_event_id > 0
          # コモンイベント呼び出し予約
          $game_temp.common_event_id = @item.common_event_id
          # アイテムの使用時 SE を演奏
          $game_system.se_play(@item.menu_se)
          # 消耗品の場合
          if @item.consumable
            # 使用したアイテムを 1 減らす
            $game_party.lose_item(@item.id, 1)
            # アイテムウィンドウの項目を再描画
            @itemlist_window.draw_item(@itemlist_window.index)
          end
          # マップ画面に切り替え
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 프레임 갱신 (타겟 윈도우가 액티브의 경우)
  #--------------------------------------------------------------------------
  def update_target
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # アイテム切れなどで使用できなくなった場合
      unless $game_party.item_can_use?(@item.id)
        # アイテムウィンドウの内容を再作成
        @itemlist_window.refresh
      end
      # ターゲットウィンドウを消去
      @itemlist_window.active = true
      @target_window.visible = false
      @target_window.active = false
      @itemlist_window.set_item(@command_index)
      return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # アイテムを使い切った場合
      if $game_party.item_number(@item.id) == 0
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # ターゲットが全体の場合
      if @target_window.index == -1
        # パーティ全体にアイテムの使用効果を適用
        used = false
        for i in $game_party.actors
          used |= i.item_effect(@item)
        end
      end
      # ターゲットが単体の場合
      if @target_window.index >= 0
        # ターゲットのアクターにアイテムの使用効果を適用
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      end
      # アイテムを使った場合
      if used
        # 아이템의 사용시 SE 를 연주
        $game_system.se_play(@item.menu_se)
        # 소모품의 경우
        if @item.consumable
          # 사용한 아이템을 1 줄인다
          $game_party.lose_item(@item.id, 1)
          # 아이템 윈도우의 항목을 재묘화
          @itemlist_window.draw_item(@itemlist_window.index)
          @itemlist_window.set_item(@command_index)
        end
        # 타겟 윈도우의 내용을 재작성
        @target_window.refresh
        # 전멸의 경우
        if $game_party.all_dead?
          # 게임 오버 화면으로 전환해
          $scene = Scene_Gameover.new
          return
        end
        # 코먼 이벤트 ID 가 유효의 경우
        if @item.common_event_id > 0
          # 코먼 이벤트 호출 예약
          $game_temp.common_event_id = @item.common_event_id
          # 맵 화면으로 전환해
          $scene = Scene_Map.new
          return
        end
      end
      # 아이템을 사용하지 않았던 경우
      unless used
        # 버저 SE 를 연주
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end


 


 


여기서 제가 하려는 것은 뭐냐면,


 


무기, 방어구 등의 아이템들은 아예 안나오고,(게임 내에서 사용하지 않아서)


게임 내에선 이벤트성 아이템(편지같은 거.....)를 용도에 따라 여러가지로 분류해서


이 스크립트가 제가 정의한 아이템 타입대로 아이템을 분류해서 보여줬으면 합니다.


 


나름 도움말과 스크립트를 몇시간째 노려보고 있지만 루비를 잘 몰라서 그런지 잘 모르겠네요


 


다시 요약하면, 사용자 정의의 아이템 타입(게임 내에선 이벤트 아이템과 동일합니다)을 여러개 만들고,


위 스크립트가 새로 정의된 타입에 맞게 아이템을 분류해주길 원합니다.


 


완벽한 답변을 요구하는게 아니니 조금이라도 도움을 주셨으면 하는 바람입니다.



 

?

  1. @brrsim_7텔레그램 선불유심내구제 급전 뽀로로통신 선불유심매입 뽀로로통신 선불유심현금화하는업체 선불유심구매 간편무서류소액급전

    Date2026.07.07 By선불유심내구제뽀로로통신 Views76
    Read More
  2. 선불유심내구제 텔레그램@brrsim_7 선불유심매입 선불유심구매 뽀로로통신 급전 대학생내구제 비상금 연체자바로소액급전 주말소액급전

    Date2026.07.07 By선불유심내구제뽀로로통신 Views108
    Read More
  3. @brrsim_7텔레그램 선불유심내구제 선불유심매입 선불폰내구제 뽀로로통신 급전 선불유심현금화하는업체 선불유심구매 무직신불자소액급전

    Date2026.07.07 By선불유심내구제뽀로로통신 Views80
    Read More
  4. 선불유심내구제 텔레그램@brrsim_7 급전 선불유심매입 뽀로로통신 청년비상금급전 내구제소액 소액급전 정식업체 선불유심구매

    Date2026.07.07 By선불유심내구제뽀로로통신 Views98
    Read More
  5. 선불유심내구제 텔레그램@brrsim_7 뽀로로통신 급전 선불유심매입 신불자소액내구제 연체자바로소액급전 선불유심구매 바로모바일급전

    Date2026.07.07 By선불유심내구제뽀로로통신 Views97
    Read More
  6. 선불유심삽니다 텔레그램@brrsim_7 선불유심내구제 뽀로로통신 선불유심매입 선불유심구매 소액내구제 급전 연체대납 바로소액급전 법인소액작업급전

    Date2026.07.07 By선불유심내구제뽀로로통신 Views100
    Read More
  7. @brrsim_7텔레그램 선불폰유심내구제 선불유심매입 뽀로로통신 급전 선불유심내구제 급전해결내구제 선불유심현금화하는업체 선불유심구매 바로무직자급전

    Date2026.07.07 By선불유심내구제뽀로로통신 Views81
    Read More
  8. 선불유심매입 텔레그램@brrsim_7 선불유심내구제 뽀로로통신 바로소액내구제급전 선불유심구매 급전 선불유심매입 바로소액급전 무서류무방문급전

    Date2026.07.07 By선불유심내구제뽀로로통신 Views103
    Read More
  9. @brrsim_7텔레그램 선불유심내구제 선불유심매입 뽀로로통신 급전 선불유심현금화하는업체 선불유심구매 백수바로급전내구제

    Date2026.07.07 By선불유심내구제뽀로로통신 Views107
    Read More
  10. 선불유심내구제 텔레그램@brrsim_7 선불유심매입 뽀로로통신 소액급전내구제 급전 연체자바로소액급전 선불유심구매 대학생용돈

    Date2026.07.07 By선불유심내구제뽀로로통신 Views96
    Read More
  11. @brrsim_7텔레그램 선불유심내구제 뽀로로통신 급전 선불유심매입 유심현금화하는업체 무직비상금바로급전 선불유심구매

    Date2026.07.07 By선불유심내구제뽀로로통신 Views86
    Read More
  12. 선불유심내구제 정식업체 텔레그램@brrsim_7선불유심매입 뽀로로통신 소상공인긴급생활안정자금 급전 선불유심구매 선불유심내구제 소액급전대출 바로신불급전가능

    Date2026.07.07 By선불유심내구제뽀로로통신 Views78
    Read More
  13. @brrsim_7텔레그램 선불유심매입 선불유심내구제 뽀로로통신 선불유심현금화하는업체 프리랜서소액급전 선불폰유심매입합니다 급전 선불유심구매 바로정산

    Date2026.07.07 By선불유심내구제뽀로로통신 Views97
    Read More
  14. @brrsim_7텔레그램 선불유심내구제 선불유심매입 뽀로로통신 급전 선불유심현금화하는업체 선불유심구매 백수바로급전내구제

    Date2026.07.06 By선불유심내구제뽀로로통신 Views135
    Read More
  15. 쯔꾸르 mv 게임을 apk 파일로 변환했는데...

    Date2023.01.14 By박하맛 Views2256
    Read More
  16. 쯔꾸르 젖소이야기 결혼 방법좀 알려주세요...

    Date2021.12.20 By백지씨 Views3711
    Read More
  17. apk포팅 승인 어케 하나요?

    Date2021.11.29 Bygame메이커xp Views2137
    Read More
  18. Yanfly님의 Action Sequence Pack 질문드립니다

    Date2021.07.15 ByNeuromancer Views2676
    Read More
  19. 싸게 MV 를 먼저? 아니면 돈을 더 들어서라도 MZ?

    Date2021.07.06 ByXatra Views2919
    Read More
  20. RMMV - 스탯창과 대화창 변견 관련 질문입니다. (초보입니다 도움좀 주세요 ㅜㅜ)

    Date2021.01.22 Byscribble Views2506
    Read More
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 443 Next
/ 443