메뉴 건너뛰기

창조도시 기록보관소

RPGXP 아이템의 타입을 새로 정의하고 싶은데요.

2007.07.30 09:36

PENJi 조회 수:359

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


 


 


-사용방법-


우선 스크립트창을 띄어서 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


 


 


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


 


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


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


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


 


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


 


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


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


 


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



 

번호 제목 글쓴이 날짜 조회 수
359 걸어갈때 Chemistry 2008.01.20 377
358 rpgxp 스크립트 에러 질문 엔젤레기온 2008.02.18 376
357 간단한 질문 한가지만 드릴게요 ^ㅡ^ [1] 황혼의새벽 2006.10.19 373
356 스크립트를 껐다켰다 할수 없나요?? 잘생긴넘 2007.05.12 373
355 좌표구하기에 관한 질문입니다. contect 2007.10.11 373
354 링메뉴스크립트의 문제점발견.고치는방법좀. [2] sky- 2006.12.29 370
353 2k몬스터칩은 xp에서못쓰는건가요? 카롤스 2008.01.01 370
352 게임 만드는 것에대한 질문 블라블라울라블라 2009.08.14 370
351 제가 오늘 RPG만들기 2000 을 처음 하는데요 .... 꼭 답변좀 [2] 둥근해가떡섭니다 2006.08.22 364
350 sp를 회복하는 스킬을 만드는 법 yakanhikou 2007.08.11 364
349 xp 그림 화면에 맞추는 방법. [2] 아미상 2006.12.31 362
348 온라인스크립트와 말하기스크립트 랜덤상장 2007.07.25 360
» 아이템의 타입을 새로 정의하고 싶은데요. PENJi 2007.07.30 359
346 횡스크롤 스크립트... [1] 오징어쪼아 2006.08.07 357
345 RPGXP의 도트와 게임에 대해서 ㅇㅁㅇ;;왕초보 『덩키동크』 2006.12.08 357
344 간단한건지 안되는건지모르겠는데.질문이요... [2] 왜다중복인거야 2006.10.30 356
343 RPGXP 캐릭터 이동?...에..대해서.. RPGgood 2006.08.06 354
342 다섯가지 질문요^^;; [1] Roger 2007.02.01 353
341 전투방식을 이렇게 할순 없을까요? [2] 퀘니히크 2007.02.01 352
340 오프닝 만들때... 로에군 2007.02.22 351