Project1

标题: 商店处理中,关于物品类型的判定 [打印本页]

作者: wyw838    时间: 2019-5-8 13:10
标题: 商店处理中,关于物品类型的判定
在商店中以属性定义的方式将物品分为了金币和银币通货...然而在打开商店时...因为防具的属性描述与武器和物品的属性描述名字不一样...所以必须要分开写(不然直接报错..)...这样就必须判断当前取得的物品的类型...然而我试了很久都不知道应该处理...所以想来请教一下QWQ脚本附下:
(因为关于判定属性的脚本我改了三个..所以就全发上来了.)
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_ShopBuy
  3. #------------------------------------------------------------------------------
  4. #  商店画面、浏览显示可以购买的商品的窗口。
  5. #==============================================================================
  6. #添加了币种图片的描述
  7. class Window_ShopBuy < Window_Selectable
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #     shop_goods : 商品
  11.   #--------------------------------------------------------------------------
  12.   def initialize(shop_goods)
  13.     super(0, 128, 368, 352)
  14.     @shop_goods = shop_goods
  15.     refresh
  16.     self.index = 0
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 获取物品
  20.   #--------------------------------------------------------------------------
  21.   def item
  22.     return @data[self.index]
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 刷新
  26.   #--------------------------------------------------------------------------
  27.   def refresh
  28.     if self.contents != nil
  29.       self.contents.dispose
  30.       self.contents = nil
  31.     end
  32.     @data = []
  33.     for goods_item in @shop_goods
  34.       case goods_item[0]
  35.       when 0
  36.         item = $data_items[goods_item[1]]
  37.       when 1
  38.         item = $data_weapons[goods_item[1]]
  39.       when 2
  40.         item = $data_armors[goods_item[1]]
  41.       end
  42.       if item != nil
  43.         @data.push(item)
  44.       end
  45.     end
  46.     # 如果项目数不是 0 就生成位图、描绘全部项目
  47.     @item_max = @data.size
  48.     if @item_max > 0
  49.       self.contents = Bitmap.new(width - 32, row_max * 32)
  50.       for i in 0...@item_max
  51.         draw_item(i)
  52.       end
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 描绘项目
  57.   #     index : 项目编号
  58.   #--------------------------------------------------------------------------
  59.   def draw_item(index)
  60.     item = @data[index]
  61.     # 获取物品所持数
  62.     case item
  63.     when RPG::Item
  64.       number = $game_party.item_number(item.id)
  65.     when RPG::Weapon
  66.       number = $game_party.weapon_number(item.id)
  67.     when RPG::Armor
  68.       number = $game_party.armor_number(item.id)
  69.     end
  70.     # 价格在所持金以下、并且所持数不是 99 的情况下为普通文字颜色
  71.     # 除此之外的情况设置为无效文字色
  72.     p item.kind
  73.     if item.kind==nil
  74.       p 'zx'
  75.       if item.element_set.include?(999)==false
  76.         if (item.price <= $game_party.gold ||$game_switches[4]==true) and number < item.max_num
  77.           self.contents.font.color = normal_color
  78.         else
  79.           self.contents.font.color = disabled_color
  80.         end
  81.       else
  82.         if (item.price <= $game_party.silver ||$game_switches[4]==true) and number < item.max_num
  83.           self.contents.font.color = normal_color
  84.         else
  85.           self.contents.font.color = disabled_color
  86.         end
  87.       end
  88.     end
  89.     x = 4
  90.     y = index * 32
  91.     rect = Rect.new(x, y, self.width - 32, 32)
  92.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  93.     bitmap = RPG::Cache.icon(item.icon_name)
  94.     if item.element_set.include?(999)==false
  95.       p_money=Bitmap.new("Graphics/Money/" +"银币.png")
  96.     else
  97.       p_money=Bitmap.new("Graphics/Money/" +"金币.png")
  98.     end
  99.     opacity = self.contents.font.color == normal_color ? 255 : 128
  100.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  101.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  102.     if $game_switches[4]==true
  103.       self.contents.draw_text(x + 216, y, 88, 32, "0", 2)
  104.     else
  105.       self.contents.draw_text(x + 216, y, 88, 32, item.price.to_s, 2)
  106.     end
  107.     self.contents.blt(x+312, y+8, p_money,Rect.new(0,0,16,16),255)
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 刷新帮助文本
  111.   #--------------------------------------------------------------------------
  112.   def update_help
  113.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  114.   end
  115. end

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_ShopNumber
  3. #------------------------------------------------------------------------------
  4. #  商店画面、输入买卖数量的窗口。
  5. #==============================================================================
  6. #添加了币种图片的描述
  7. class Window_ShopNumber < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super(0, 128, 368, 352)
  13.     self.contents = Bitmap.new(width - 32, height - 32)
  14.     @item = nil
  15.     @max = 1
  16.     @price = 0
  17.     @number = 1
  18.   end
  19.   #--------------------------------------------------------------------------
  20.   # ● 设置物品、最大个数、价格
  21.   #--------------------------------------------------------------------------
  22.   def set(item, max, price)
  23.     @item = item
  24.     @max = max
  25.     @price = price
  26.     @number = 1
  27.     refresh
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 被输入的件数设置
  31.   #--------------------------------------------------------------------------
  32.   def number
  33.     return @number
  34.   end
  35.   #--------------------------------------------------------------------------
  36.   # ● 刷新
  37.   #--------------------------------------------------------------------------
  38.   def refresh
  39.     self.contents.clear
  40.     draw_item_name(@item, 4, 96)
  41.     if @item.element_set.include?(999)==false
  42.       bitmap = Bitmap.new("Graphics/Money/" +"银币.png")
  43.     else
  44.       bitmap = Bitmap.new("Graphics/Money/" +"金币.png")
  45.     end
  46.     self.contents.font.color = normal_color
  47.     self.contents.draw_text(272, 96, 32, 32, "×")
  48.     self.contents.draw_text(308, 96, 24, 32, @number.to_s, 2)
  49.     self.cursor_rect.set(304, 96, 32, 32)
  50.     # 描绘合计价格和货币单位
  51.     domination = $data_system.words.gold
  52.     cx = contents.text_size(domination).width
  53.     total_price = @price * @number
  54.     #(x, y, bitmap, Rect.new(x, y, 宽, 高),透明度)
  55.     self.contents.font.color = normal_color
  56.     if $game_switches[4]==false
  57.       self.contents.draw_text(4, 160, 328-cx-2, 32, total_price.to_s, 2)
  58.     else
  59.       self.contents.draw_text(4, 160, 328-cx-2, 32, "0", 2)
  60.     end
  61.     self.contents.font.color = system_color
  62.     self.contents.blt(332-cx, 168, bitmap,Rect.new(0,0,16,16),255)
  63.     #self.contents.draw_text(332-cx, 160, cx, 32, domination, 2)
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 刷新画面
  67.   #--------------------------------------------------------------------------
  68.   def update
  69.     super
  70.     if self.active
  71.       # 光标右 (+1)
  72.       if Input.repeat?(Input::RIGHT) and @number < @max
  73.         $game_system.se_play($data_system.cursor_se)
  74.         @number += 1
  75.         refresh
  76.       end
  77.       # 光标左 (-1)
  78.       if Input.repeat?(Input::LEFT) and @number > 1
  79.         $game_system.se_play($data_system.cursor_se)
  80.         @number -= 1
  81.         refresh
  82.       end
  83.       # 光标上 (+10)
  84.       if Input.repeat?(Input::UP) and @number < @max
  85.         $game_system.se_play($data_system.cursor_se)
  86.         @number = [@number + 10, @max].min
  87.         refresh
  88.       end
  89.       # 光标下 (-10)
  90.       if Input.repeat?(Input::DOWN) and @number > 1
  91.         $game_system.se_play($data_system.cursor_se)
  92.         @number = [@number - 10, 1].max
  93.         refresh
  94.       end
  95.     end
  96.   end
  97. end

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Scene_Shop
  3. #------------------------------------------------------------------------------
  4. #  处理商店画面的类。
  5. #==============================================================================
  6. #添加了金币的使用
  7. class Scene_Shop
  8.   #--------------------------------------------------------------------------
  9.   # ● 主处理
  10.   #--------------------------------------------------------------------------
  11.   def main
  12.     # 生成帮助窗口
  13.     @help_window = Window_Help.new
  14.     # 生成指令窗口
  15.     @command_window = Window_ShopCommand.new
  16.     # 生成金钱窗口
  17.     @gold_window = Window_Gold.new
  18.     @gold_window.x = 480
  19.     @gold_window.y = 64
  20.     # 生成时间窗口
  21.     @dummy_window = Window_Base.new(0, 128, 640, 352)
  22.     # 生成购买窗口
  23.     @buy_window = Window_ShopBuy.new($game_temp.shop_goods)
  24.     @buy_window.active = false
  25.     @buy_window.visible = false
  26.     @buy_window.help_window = @help_window
  27.     # 生成卖出窗口
  28.     @sell_window = Window_ShopSell.new
  29.     @sell_window.active = false
  30.     @sell_window.visible = false
  31.     @sell_window.help_window = @help_window
  32.     # 生成数量输入窗口
  33.     @number_window = Window_ShopNumber.new
  34.     @number_window.active = false
  35.     @number_window.visible = false
  36.     # 生成状态窗口
  37.     @status_window = Window_ShopStatus.new
  38.     @status_window.visible = false
  39.     # 执行过渡
  40.     Graphics.transition
  41.     # 主循环
  42.     loop do
  43.       # 刷新游戏画面
  44.       Graphics.update
  45.       # 刷新输入信息
  46.       Input.update
  47.       # 刷新画面
  48.       update
  49.       # 如果画面切换的话就中断循环
  50.       if $scene != self
  51.         break
  52.       end
  53.     end
  54.     # 准备过渡
  55.     Graphics.freeze
  56.     # 释放窗口
  57.     @help_window.dispose
  58.     @command_window.dispose
  59.     @gold_window.dispose
  60.     @dummy_window.dispose
  61.     @buy_window.dispose
  62.     @sell_window.dispose
  63.     @number_window.dispose
  64.     @status_window.dispose
  65.   end
  66.   #--------------------------------------------------------------------------
  67.   # ● 刷新画面
  68.   #--------------------------------------------------------------------------
  69.   def update
  70.     # 刷新窗口
  71.     @help_window.update
  72.     @command_window.update
  73.     @gold_window.update
  74.     @dummy_window.update
  75.     @buy_window.update
  76.     @sell_window.update
  77.     @number_window.update
  78.     @status_window.update
  79.     # 指令窗口激活的情况下: 调用 update_command
  80.     if @command_window.active
  81.       update_command
  82.       return
  83.     end
  84.     # 购买窗口激活的情况下: 调用 update_buy
  85.     if @buy_window.active
  86.       update_buy
  87.       return
  88.     end
  89.     # 卖出窗口激活的情况下: 调用 update_sell
  90.     if @sell_window.active
  91.       update_sell
  92.       return
  93.     end
  94.     # 个数输入窗口激活的情况下: 调用 update_number
  95.     if @number_window.active
  96.       update_number
  97.       return
  98.     end
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 刷新画面 (指令窗口激活的情况下)
  102.   #--------------------------------------------------------------------------
  103.   def update_command
  104.     # 按下 B 键的情况下
  105.     if Input.trigger?(Input::B)
  106.       # 演奏取消 SE
  107.       $game_system.se_play($data_system.cancel_se)
  108.       # 切换到地图画面
  109.       $scene = Scene_Map.new
  110.       return
  111.     end
  112.     # 按下 C 键的情况下
  113.     if Input.trigger?(Input::C)
  114.       # 命令窗口光标位置分支
  115.       case @command_window.index
  116.       when 0  # 购买
  117.         # 演奏确定 SE
  118.         $game_system.se_play($data_system.decision_se)
  119.         # 窗口状态转向购买模式
  120.         @command_window.active = false
  121.         @dummy_window.visible = false
  122.         @buy_window.active = true
  123.         @buy_window.visible = true
  124.         @buy_window.refresh
  125.         @status_window.visible = true
  126.       when 1  # 卖出
  127.         # 演奏确定 SE
  128.         $game_system.se_play($data_system.decision_se)
  129.         # 窗口状态转向卖出模式
  130.         @command_window.active = false
  131.         @dummy_window.visible = false
  132.         @sell_window.active = true
  133.         @sell_window.visible = true
  134.         @sell_window.refresh
  135.       when 2  # 取消
  136.         # 演奏确定 SE
  137.         $game_system.se_play($data_system.decision_se)
  138.         # 切换到地图画面
  139.         $scene = Scene_Map.new
  140.       end
  141.       return
  142.     end
  143.   end
  144.   #--------------------------------------------------------------------------
  145.   # ● 刷新画面 (购买窗口激活的情况下)
  146.   #--------------------------------------------------------------------------
  147.   def update_buy
  148.     # 设置状态窗口的物品
  149.     @status_window.item = @buy_window.item
  150.     # 按下 B 键的情况下
  151.     if Input.trigger?(Input::B)
  152.       # 演奏取消 SE
  153.       $game_system.se_play($data_system.cancel_se)
  154.       # 窗口状态转向初期模式
  155.       @command_window.active = true
  156.       @dummy_window.visible = true
  157.       @buy_window.active = false
  158.       @buy_window.visible = false
  159.       @status_window.visible = false
  160.       @status_window.item = nil
  161.       # 删除帮助文本
  162.       @help_window.set_text("")
  163.       return
  164.     end
  165.     # 按下 C 键的情况下
  166.     if Input.trigger?(Input::C)
  167.       # 获取物品
  168.       @item = @buy_window.item
  169.       # 物品无效的情况下、或者价格在所持金以上的情况下
  170.       if @item.element_set.include?(999)==false
  171.         if (@item == nil or @item.price > $game_party.gold) && $game_switches[4]==false
  172.           # 演奏冻结 SE
  173.           $game_system.se_play($data_system.buzzer_se)
  174.           return
  175.         end
  176.       else
  177.         if @item == nil or @item.price > $game_party.silver &&$game_switches[4]==false
  178.           # 演奏冻结 SE
  179.           $game_system.se_play($data_system.buzzer_se)
  180.           return
  181.         end
  182.       end
  183.       # 获取物品所持数
  184.       case @item
  185.       when RPG::Item
  186.         number = $game_party.item_number(@item.id)
  187.       when RPG::Weapon
  188.         number = $game_party.weapon_number(@item.id)
  189.       when RPG::Armor
  190.         number = $game_party.armor_number(@item.id)
  191.       end
  192.       # 如果已经拥有了 99 个情况下
  193.       if number == @item.max_num
  194.         # 演奏冻结 SE
  195.         $game_system.se_play($data_system.buzzer_se)
  196.         return
  197.       end
  198.       # 演奏确定 SE
  199.       $game_system.se_play($data_system.decision_se)
  200.       # 计算可以最多购买的数量
  201.       if @item.element_set.include?(999)==false
  202.         max = @item.price == 0 ? 99 : $game_party.gold / @item.price
  203.          if $game_switches[4]==false
  204.            max = [max,@item.max_num - number].min
  205.          else
  206.            max = @item.max_num - number
  207.          end
  208.       else
  209.         max = @item.price == 0 ? 99 : $game_party.silver / @item.price
  210.         if $game_switches[4]==false
  211.            max = [max, @item.max_num - number].min
  212.          else
  213.            max = @item.max_num - number
  214.          end      
  215.       end
  216.       # 窗口状态转向数值输入模式
  217.       @buy_window.active = false
  218.       @buy_window.visible = false
  219.       @number_window.set(@item, max, @item.price)
  220.       @number_window.active = true
  221.       @number_window.visible = true
  222.     end
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● 画面更新 (卖出窗口激活的情况下)
  226.   #--------------------------------------------------------------------------
  227.   def update_sell
  228.     # 按下 B 键的情况下
  229.     if Input.trigger?(Input::B)
  230.       # 演奏取消 SE
  231.       $game_system.se_play($data_system.cancel_se)
  232.       # 窗口状态转向初期模式
  233.       @command_window.active = true
  234.       @dummy_window.visible = true
  235.       @sell_window.active = false
  236.       @sell_window.visible = false
  237.       @status_window.item = nil
  238.       # 删除帮助文本
  239.       @help_window.set_text("")
  240.       return
  241.     end
  242.     # 按下 C 键的情况下
  243.     if Input.trigger?(Input::C)
  244.       # 获取物品
  245.       @item = @sell_window.item
  246.       # 设置状态窗口的物品
  247.       @status_window.item = @item
  248.       # 物品无效的情况下、或者价格为 0 (不能卖出) 的情况下
  249.       if @item == nil or @item.price == 0
  250.         # 演奏冻结 SE
  251.         $game_system.se_play($data_system.buzzer_se)
  252.         return
  253.       end
  254.       # 演奏确定 SE
  255.       $game_system.se_play($data_system.decision_se)
  256.       # 获取物品的所持数
  257.       case @item
  258.       when RPG::Item
  259.         number = $game_party.item_number(@item.id)
  260.       when RPG::Weapon
  261.         number = $game_party.weapon_number(@item.id)
  262.       when RPG::Armor
  263.         number = $game_party.armor_number(@item.id)
  264.       end
  265.       # 最大卖出个数 = 物品的所持数
  266.       max = number
  267.       # 窗口状态转向个数输入模式
  268.       @sell_window.active = false
  269.       @sell_window.visible = false
  270.       @number_window.set(@item, max, @item.price / 2)
  271.       @number_window.active = true
  272.       @number_window.visible = true
  273.       @status_window.visible = true
  274.     end
  275.   end
  276.   #--------------------------------------------------------------------------
  277.   # ● 刷新画面 (个数输入窗口激活的情况下)
  278.   #--------------------------------------------------------------------------
  279.   def update_number
  280.     # 按下 B 键的情况下
  281.     if Input.trigger?(Input::B)
  282.       # 演奏取消 SE
  283.       $game_system.se_play($data_system.cancel_se)
  284.       # 设置个数输入窗口为不活动·非可视状态
  285.       @number_window.active = false
  286.       @number_window.visible = false
  287.       # 命令窗口光标位置分支
  288.       case @command_window.index
  289.       when 0  # 购买
  290.         # 窗口状态转向购买模式
  291.         @buy_window.active = true
  292.         @buy_window.visible = true
  293.       when 1  # 卖出
  294.         # 窗口状态转向卖出模式
  295.         @sell_window.active = true
  296.         @sell_window.visible = true
  297.         @status_window.visible = false
  298.       end
  299.       return
  300.     end
  301.     # 按下 C 键的情况下
  302.     if Input.trigger?(Input::C)
  303.       # 演奏商店 SE
  304.       $game_system.se_play($data_system.shop_se)
  305.       # 设置个数输入窗口为不活动·非可视状态
  306.       @number_window.active = false
  307.       @number_window.visible = false
  308.       # 命令窗口光标位置分支
  309.       case @command_window.index
  310.       when 0  # 购买
  311.         # 购买处理
  312.         case @item
  313.         when RPG::Item
  314.           $game_party.gain_item(@item.id, @number_window.number)
  315.         when RPG::Weapon
  316.           $game_party.gain_weapon(@item.id, @number_window.number)
  317.         when RPG::Armor
  318.           $game_party.gain_armor(@item.id, @number_window.number)
  319.         end
  320.         if @item.element_set.include?(999)==false
  321.           if $game_switches[4]==false
  322.             $game_party.lose_gold(@number_window.number * @item.price)
  323.           end
  324.         else
  325.           if $game_switches[4]==false
  326.             $game_party.lose_silver(@number_window.number * @item.price)
  327.           end
  328.         end
  329.         # 刷新各窗口
  330.         @gold_window.refresh
  331.         @buy_window.refresh
  332.         @status_window.refresh
  333.         # 窗口状态转向购买模式
  334.         @buy_window.active = true
  335.         @buy_window.visible = true
  336.       when 1  # 卖出
  337.         # 卖出处理
  338.         if @item.element_set.include?(999)==false
  339.           if $game_switches[4]==false
  340.             $game_party.gain_gold(@number_window.number * (@item.price / 2))
  341.           end
  342.         else
  343.           if $game_switches[4]==false   
  344.           $game_party.gain_silver(@number_window.number * (@item.price / 2))
  345.           end
  346.         end
  347.         case @item
  348.         when RPG::Item
  349.           $game_party.lose_item(@item.id, @number_window.number)
  350.         when RPG::Weapon
  351.           $game_party.lose_weapon(@item.id, @number_window.number)
  352.         when RPG::Armor
  353.           $game_party.lose_armor(@item.id, @number_window.number)
  354.         end
  355.         # 刷新各窗口
  356.         @gold_window.refresh
  357.         @sell_window.refresh
  358.         @status_window.refresh
  359.         # 窗口状态转向卖出模式
  360.         @sell_window.active = true
  361.         @sell_window.visible = true
  362.         @status_window.visible = false
  363.       end
  364.       return
  365.     end
  366.   end
  367. end

作者: wyw838    时间: 2019-5-8 13:11
第一个的从72行那里是自己试着做的判定...当然错的一塌糊涂...
作者: 灯笼菜刀王    时间: 2019-5-8 14:23
直接给它们三个定义相同的函数就好了

栗子:
module RPG
  class Armor
    def 金货
      return @guard_element_set.include?(属性编号)
   end
end
class Item
    def 金货
      return @element_set.include?(属性编号)
    end
  end
class Weapon
   def 金货
     return @element_set.include?(属性编号)
   end
end
end

这样, 就可以用 item.金货  来统一判断了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1