질문과 답변

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 13184
RMVXA ace 사이드뷰 스크립트 [일어] 에서 오류가납니다. file 보노노 2012.09.01 1421
RMXP rpg xp 오류가 났어요 2 file shutown1234 2012.09.01 1341
RMVXA side view 방식의 게임을 만드려고 합니다 .. 3 보노노 2012.08.31 992
RMXP 아이템선택창에 지정한 아이템만 표시되도록 하기 7 하진 2012.08.31 957
RMVXA 성장형 장비 만들 수 있습니까? 3 clown1 2012.08.31 1050
RMVXA 장비를 바꿔서 직업을 바꿀 수 있습니까? 4 clown1 2012.08.31 973
RMVXA 1회용 이벤트 만드는 방법좀 알려주세요 2 clown1 2012.08.31 1037
RMVX RPGVX 영상 ??적용질문 4 xzrjs 2012.08.30 1510
RMXP XAS 액터이름튕김 2 Yaguman 2012.08.30 1049
RMXP 습작님 이벤트접촉 이벤트발생 스크립트 질문 2 조석진 2012.08.29 975
RMXP 파티멤버가 자동으로 싸우게 하려면 어떻게 해야 할 까요? 5 아미상 2012.08.29 1588
RMXP xp 맵 타일이나 그래픽 종류 많게 하는 패치 없나요? 2 잉재 2012.08.29 1289
RMVXA 게임 진행중 이벤트로 케릭터 자체를 바꾸는 방법좀 알려주세요 2 clown1 2012.08.29 1096
RMVXA (초보자)NPC 배치하는 방법좀 알려주세요 2 clown1 2012.08.28 1559
RMVXA vx ace 스크립트좀 부탁합니다..... 1 tomraccon 2012.08.28 1322
기타 상자 이벤트에 대해 2 comset 2012.08.28 1048
RMXP 타이핑효과? 2 야구에달인 2012.08.27 1071
RMVXA 이번엔... 스킬 룬 시스템 질문입니다. 6 file 글쎄,왜 난 적용이 안될까? 2012.08.27 1306
RMXP 습작님 이벤트접촉 이벤트발생 스크립트 12 file 조석진 2012.08.27 1673
RMVXA 상점 숙련도 스크립트질문입니다. 11 글쎄,왜 난 적용이 안될까? 2012.08.27 1088
Board Pagination Prev 1 ... 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 ... 517 Next
/ 517