질문과 답변

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 12449
RMXP 전투시 스프라이트가 겹치는 것 암페 2016.10.03 88
RMMV 아이템 선택 처리를 활용, 이벤트를 진행시키고 싶습니다. 3 겐마 2016.10.04 182
RMVX 이벤트를 8방향 이동시켜주려면 어떻게 해야 하나요 1 존스노우 2016.10.04 112
RMMV 대화할때 이미지 검게하는법 4 file 잠행인 2016.10.04 223
RMVXA 맵 배포하는 사이트같은거 아시는분 계신가요? 1 VXA러너 2016.10.04 130
RMVX VX에서 대열보행 하는방법 6 너굴통통 2016.10.05 242
RMMV Graphics.boxWidth의 절반값이 뭔가요? 2 잠행인 2016.10.05 84
RMMV 말풍선을 적용해 봤는데 캐릭터와 겹칩니다. 4 file rokich 2016.10.06 359
RMMV 항상 가장 위에 오는 그림 잠행인 2016.10.07 158
RMMV 알만툴 시스템 png 질문이요 4 file 잠행인 2016.10.07 233
기타 게임 실행과 관련해서 질문합니다. 5 file 유리프 2016.10.07 1565
RMMV 이 플러그인 써보신분? 1 잠행인 2016.10.08 117
RMMV 갤러리 플러그인 (Q-S.T)에서 갤러리 추가방법... 4 그림쟁이거북이 2016.10.08 219
RMVX RPG VX 전투 회피 아이템은 어떻게 만드나요? Trsiword 2016.10.08 151
RMMV 이번엔 Terrax Lighting system에 대해서 질문입니다 3 file rokich 2016.10.09 261
RMMV 혹시 fly 플러그인 아는분 계세요? 잠행인 2016.10.11 89
툴선택 게임을 이번에 처음 만들어 봅니다. 무슨 툴을 사용하는게 좋을까요? 2 밀모리 2016.10.11 309
RMMV 버프 또는 디버프의 스킬의 지속 시간을 출력해주고 싶습니다. 1 겐마 2016.10.13 208
RMMV MV 언어 한글로 바꾸는법.. 1 빨간포도 2016.10.14 2087
RMVXA 캐릭터나 이벤트가 자꾸 가만히 있어도 걷습니다.. 3 123qweefadf 2016.10.16 115
Board Pagination Prev 1 ... 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 ... 516 Next
/ 516