질문과 답변

Extra Form
아방스 스크립트게시판에도 올라온 LEPIN님의
'아이템 선택 시스템'의 일부 개조를 시도하고 있는데요... 막혀버려서 질문 올립니다.

이 스크립트의 원래 기능은 Scene을 호출해 아이템 선택창을 띄우고, 아이템을 선택하면 해당아이템 ID를 지정변수에다 받는 겁니다.

그런데 원래대로라면, 가지고 있는 모든 아이템이 표시되지만 (메뉴의 아이템창과 마찬가지로)
제가 필요한 기능은... 일부 지정한 아이템들 중에서만, 소유중이면 표시되도록 하는 거거든요.
(목록에 뜰 대상을 소유중인 전체아이템 → 소유중인 일부 지정아이템으로)


활용하려는 상황은 이렇습니다.
예1) 보석상에게 소유중인 패물을 처분하려고 할 때, 보석상에게 말을 걸면 아이템선택창(Scene)을 호출,
이 창에서는 소유중인 아이템 중 패물들(스크립트에서 지정해둔 아이템들)만 표시되어, 패물들 중에서만 선택할 수 있도록 하는 겁니다.
(잡다구리한 무기, 방어구, 물약 등등은 뜨지 않고요)

예2) 펫에게 먹이를 주려고 할 때, 먹이선택창(Scene)을 호출,
이 창에서는 소유중인 아이템 중 먹이들(스크립트에서 지정해둔 아이템들)만 표시되어, 먹이가 되는 아이템 중에서만 선택할 수 있고요.

물론 선택한 다음에는, 받은 변수값에 따라 각 이벤트내용 전개하고요...



(사실 방법을 생각해보니
  1. 아이템을 item / weapon / armor로 구분하듯이 따로 구분을 하나 더 만들거나 ('food'라든가 'gem'이라든가)
  2. 아니면 '아이템선택창' 스크립트에서 표시할 아이템을 지정하거나
  둘 중 하나일 것 같았는데요.
  후자쪽이 비교적 간단하고...안전할 것 같아서요.)

일단 수정해야 할 부분은, 아이템을 표시하는 부분(분홍색글씨)인 것 같은데...
어떻게 고쳐야 할 지가...

특정아이템 소유 여부로 따지기 위해
if $game_party.item_number(70) >= 1 (ID:70번 아이템을 1개 이상 갖고 있는가?)
이 구문을 활용해야겠다 생각까지는 들었는데요.
for i in...이라든가...? item = @data[index] 라든가...?? 이런 부분을... 못 알아먹겠으니....... 손을 못 대겠네요.

어떻게 수정되어야 구현이 될 지, 조언을 좀 부탁드립니다.



(이하 스크립트 일부)

class Window_Item_Select < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 오브젝트 초기화
  #--------------------------------------------------------------------------
  def initialize
    super(0, 64, 640, 416)
    @column_max = 2
    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 = []
    # 아이템을 추가
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    # 항목수가 0 이 아니면 비트 맵을 작성해, 전항목을 묘화
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  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
    self.contents.font.color = normal_color
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    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 + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end



* 지금 스크립트게시판에 있는 원문 스크립트(http://avangs.info/rgss_xp/249354 이거)의 경우, 중간에 작은 오타(?) 때문에 오류가 납니다. 일단 저는 어떻게 수정해서 고쳐놨는데...
  LEPIN님의 허가가 있으면, 차후 수정된 스크립트 전문을 스크립트게시판에 올릴 수 있을지 모르겠네요.
Comment '7'
  • profile
    습작 2012.09.01 11:39

    0.

     

      위에서 소개하신 스크립트를 보다 확장성 있도록 수정하였습니다. 기존의 설정 모듈을 삭제하고, 설정모듈에서 담당하던 내용들을 호출시 입력하도록 변경하였습니다. 그럼 좋은 게임제작 활동 부탁드립니다.^^


    #==============================================================================

    # ★ 아이템 선택 시스템 ★ 2009.1.29

    #==============================================================================

    # 제작자 : lepin@naver.com 

    #==============================================================================

    # 수 정 : etude87@gmail.com

    #==============================================================================

    #

    # 호출 : $scene = Scene_Item_Select.new("속성의 이름", 변수번호[, 소비여부])

    #

    # 예> $scene = Scene_Item_Select.new("화염", 1, true)

    #

    # 소비여부는 생략 가능(생략시 false)

    #

    #==============================================================================

    #

    # 아이템일 경우 : 변수 값 = 아이템의 ID

    # 무기일 경우 : 변수 값 = 무기의 ID + 1000 

    # 방어구일 경우 : 변수 값 = 방어구의 ID + 2000

    # 선택하지 않을 경우 : 변수 값 = 0

    #

    #==============================================================================

    class Window_Item_Select < Window_Selectable

      #--------------------------------------------------------------------------

      def initialize(elements)

        @elements = elements

        super(0, 64, 640, 416)

        @column_max = 2

        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 = []

        for i in 1...$data_items.size

          if $game_party.item_number(i) > 0

            if $data_items[i].element_set.include?($data_system.elements.index(@elements))

              @data.push($data_items[i])

            end

          end

        end

        for i in 1...$data_weapons.size

          if $game_party.weapon_number(i) > 0

            if $data_weapons[i].element_set.include?($data_system.elements.index(@elements))

              @data.push($data_weapons[i])

            end

          end

        end

        for i in 1...$data_armors.size

          if $game_party.armor_number(i) > 0

            if $data_armors[i].guard_element_set.include?($data_system.elements.index(@elements))

              @data.push($data_armors[i])

            end

          end

        end

        @item_max = @data.size

        if @item_max > 0

          self.contents = Bitmap.new(width - 32, row_max * 32)

          for i in 0...@item_max

            draw_item(i)

          end

        end

      end

      #--------------------------------------------------------------------------

      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

        self.contents.font.color = normal_color

        x = 4 + index % 2 * (288 + 32)

        y = index / 2 * 32

        rect = Rect.new(x, y, self.width / @column_max - 32, 32)

        self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))

        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 + 240, y, 16, 32, ":", 1)

        self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)

      end

      #--------------------------------------------------------------------------

      def update_help

        @help_window.set_text(self.item == nil ? "" : self.item.description)

      end

    end

    #==============================================================================

    #==============================================================================

    class Scene_Item_Select

      #--------------------------------------------------------------------------

      def initialize(elements, item_variable, item_lose = false)

        @elements = elements

        @item_variable = item_variable

        @item_lose = item_lose

      end

      #--------------------------------------------------------------------------

      def main

        @help_window = Window_Help.new

        @item_window = Window_Item_Select.new(@elements)

        @item_window.help_window = @help_window

        s1 = "선택한다"

        s2 = "그만둔다"

        @command_window = Window_Command.new(192, [s1, s2])    

        @command_window.x = 320 - @command_window.width / 2

        @command_window.y = 240 - @command_window.height / 2

        @command_window.visible = false

        @command_window.active = false

        Graphics.transition

        loop do

          Graphics.update

          Input.update

          update

          if $scene != self

            break

          end

        end

        Graphics.freeze

        @help_window.dispose

        @item_window.dispose

        @command_window.dispose

      end

      #--------------------------------------------------------------------------

      def update

        @help_window.update

        @item_window.update

        @command_window.update

        if @item_window.active

          update_item

          return

        end

        if @command_window.active

          update_command

          return

        end

      end

      #--------------------------------------------------------------------------

      def update_item

        if Input.trigger?(Input::B)

          $game_system.se_play($data_system.cancel_se)

          $game_variables[@item_variable] = 0

          $scene = Scene_Map.new      

          return

        end

        if Input.trigger?(Input::C)

          @item = @item_window.item

          unless @item.is_a?(RPG::Item) or @item.is_a?(RPG::Weapon) or @item.is_a?(RPG::Armor)

            $game_system.se_play($data_system.buzzer_se)

            return

          end

          $game_system.se_play($data_system.decision_se)

          @item_window.active = false

          @command_window.index = 0

          @command_window.visible = true

          @command_window.active = true

          return

        end

      end

      #--------------------------------------------------------------------------

      def update_command

        @command_window.update

        if Input.trigger?(Input::B)

          $game_system.se_play($data_system.cancel_se)

          @item_window.active = true

          @command_window.visible = false

          @command_window.active = false

          return

        end

        if Input.trigger?(Input::C)

          case @command_window.index

          when 0

            $game_system.se_play($data_system.decision_se)

            case @item

            when RPG::Item

              value = 0

              if @item_lose == true

              $game_party.lose_item(@item.id, 1)

              end

            when RPG::Weapon          

              value = 1000

              if @item_lose == true

              $game_party.lose_weapon(@item.id, 1)

              end

            when RPG::Armor

              value = 2000

              if @item_lose == true

              $game_party.lose_armor(@item.id, 1)

              end

            end

            $game_variables[@item_variable] = @item.id + value

            $scene = Scene_Map.new

          when 1

            $game_system.se_play($data_system.decision_se)

            @item_window.active = true

            @command_window.visible = false

            @command_window.active = false

          end

          return

        end

        if Input.trigger?(Input::UP) or Input.trigger?(Input::L)

          @command_window.index = 0

        end

        if Input.trigger?(Input::DOWN) or Input.trigger?(Input::R)

          @command_window.index = 1

        end

      end

    end



  • ?
    하진 2012.09.02 21:33
    엌.....이렇게 전문을 다 올려주셔도 괜찮을까요?!! 물론 저야 무지 감사하지만요ㅠㅠㅠㅠ 원작자분 허가라든가 아직 못 받은 상태라ㅋㅋ; 그게좀 걸리네요. 나중에 보신다든가 하면 제가 말씀드려야겠습니다.

    그보다 아이템별로 부여한 속성으로 구분지을 수 있게 하신 거군요...!!
    그러면 $scene = Scene_Item_Select.new("화염", 1, true) 를 호출함으로써... 아이템선택창에 "화염" 속성을 띤 ID:1번의 아이템을 (선택시 소비되도록) 표시하게 되는 것, 맞나요?

    그러면... $scene = Scene_Item_Select.new("화염", 1, true), ("화염", 2, true), ("화염", 3, true)..... 이런 식으로 연이어서 쓰는 것으로, 여러 항목 표시가 되는...? 건가요??
    왠지 또 헤맬 것 같아서ㅋㅋㅋ 여쭤봅니다. 고맙습니다!
  • profile
    습작 2012.09.02 21:48

    1.

     

      연이어서 작성할 경우는 존재하지 않습니다. 여러 속성을 체크하는 부분이 구현 불가능 했던 것은 아닌데, 어차피 새로 속성 만들어서 해당 아이템들을 묶어주면 되리라는 생각에 가볍게 수정했기 때문에(좀 더 수정하면 되는 부분인데 게으르다보니...) 그러한 것은 불가능 합니다. 해당 아이템들을 새로운 속성으로 묶어서 재분류 부탁드립니다. ^^;;

     

  • ?
    하진 2012.09.02 22:07
    아뇨 그런 분류쯤이야 일도 아닙니다 ㅠㅠㅠ 그정도로 이 문제가 해결된다면요 ㅋㅋㅋㅋ
  • profile
    습작 2012.09.02 21:50

    2.

     

      $scene = Scene_Item_Select.new("화염", 1, true) 를 호출함으로써 아이템 선택창에 "화염" 속성을 띤 아이템들만 표시하고 해당 아이템을 사용시 소모되며, 변수ID:1번에 해당 아이템 ID를 표시하게 되는 것입니다.


  • ?
    하진 2012.09.02 22:06
    어...라
    그럼 이 호출로 "화염"속성을 가진 아이템이면 전부 아이템선택창에 표시되고, 변수ID:1번에 플레이어가 선택한 아이템의 ID를 받게 되는 건가요...? 맞나요? (종래의 '아이템의 ID를 취득하는 변수의 ID'를 스크립트에서 설정하지 않고, 매번 호출시마다 설정하게 되는 거군요??)
  • ?
    하진 2012.09.02 22:52

    방금 해보고 왔습니다. 맞네요!! ㅋㅋ
    진짜로 확장성이 확... 아주그냥 확 늘어났네요. 원래 스크립트를 이리저리 설정을 추가해 써야겠다 생각했었는데...
    이대로라면 다른 수정도 필요없고, 아이템들 속성만 분류해주면 땡이니... 정말 편해졌어요ㅠㅠㅠㅠ 고맙습니다 ㅠㅠㅠㅠㅠㅠㅠ완전 혁신이에요.ㅋㅋㅋ

    원본 만드신 레핀님 답변만 받으면, 여기 스크립트게시판에도 올려서 공유할 수도 있겠네요. 실로 XP이용자들을 널리 이롭게 할ㅋㅋ스크립트가 된 것 같습니다. 감사합니다!


List of Articles
종류 분류 제목 글쓴이 날짜 조회 수
공지 묻고 답하기 가이드 습작 2014.06.14 12391
RMXP 전직 npc를 만들고.. 1 z아베크롬비 2012.09.22 1309
RMXP 질문좀 하겠습니다 1 각시탈제작 2012.09.21 925
RMXP 도트 찍는 요령을 알려주세요. 1 각시탈제작 2012.09.19 1288
RMXP RPG XP에서 avi파일 재생할수 있는 방법좀여 ㅜ 2 ☆star 2012.09.17 2239
RMXP 배틀종류후 화면멈춤현상 2 캬아악 2012.09.14 1112
RMXP 조건분기: 액터가 (움직이는)특정이벤트를 향하고 있을 때에만? 5 하진 2012.09.14 823
RMXP 충돌크기가 1x1를 넘는 몬스터를 만들 수 있을까요. 1 모르모트 2012.09.12 987
RMXP 용병시스템 2 준프로겜 2012.09.11 1183
RMXP 이 병렬 이벤트에 문제가 있나요? 2 file 모르모트 2012.09.10 1084
RMXP XP 무기 숙련도를 만들고 싶은데.. 4 CJY 2012.09.10 1063
RMXP 하나만 더 물어볼게요... 파티원들이 졸졸 따라오는 스크립트 2 모르모트 2012.09.10 1137
RMXP 대쉬중에 그래픽 바뀌는 스크립트 있나요? 4 모르모트 2012.09.10 1094
RMXP rpg xp 대화창이랑 폰트 어떻게 바꾸나요? 1 매콤한빨간모자 2012.09.08 3998
RMXP 습작님 픽쳐회전 원상태 스크립트 질문 7 조석진 2012.09.08 900
RMXP 그림이 밑에서부터 올라오게하려면 어떻게하죠 ? ( 크레딧 ) 2 원준이슈퍼똥꼬97 2012.09.04 1065
RMXP 그림의 표시를 처음 해봤더니 도저히 모르겠네요 3 네네네duyd 2012.09.03 1112
RMXP 습작님의 Scene_Item_Select 관련질문 (픽쳐, 커스텀윈도우, 스위치, 정렬) 2 file 하진 2012.09.03 1103
RMXP 메세지 앞에 일러스트 표시하는 방법을 알려주세요! 5 제로스 2012.09.02 1152
RMXP rpg xp 오류가 났어요 2 file shutown1234 2012.09.01 1339
RMXP 아이템선택창에 지정한 아이템만 표시되도록 하기 7 하진 2012.08.31 956
Board Pagination Prev 1 ... 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 ... 90 Next
/ 90