查看: 3025|回复: 6

[已经解决] 商店处理中,关于物品类型的判定

[复制链接]
梦石
0
星屑
1293
在线时间
118 小时
注册时间
2017-7-14
回帖
112
发表于 2019-5-8 13:10:27 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
在商店中以属性定义的方式将物品分为了金币和银币通货...然而在打开商店时...因为防具的属性描述与武器和物品的属性描述名字不一样...所以必须要分开写(不然直接报错..)...这样就必须判断当前取得的物品的类型...然而我试了很久都不知道应该处理...所以想来请教一下QWQ脚本附下:
(因为关于判定属性的脚本我改了三个..所以就全发上来了.)
[pre lang="ruby"]#==============================================================================
# ■ Window_ShopBuy
#------------------------------------------------------------------------------
#  商店画面、浏览显示可以购买的商品的窗口。
#==============================================================================
#添加了币种图片的描述
class Window_ShopBuy < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     shop_goods : 商品
  #--------------------------------------------------------------------------
  def initialize(shop_goods)
    super(0, 128, 368, 352)
    @shop_goods = shop_goods
    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 goods_item in @shop_goods
      case goods_item[0]
      when 0
        item = $data_items[goods_item[1]]
      when 1
        item = $data_weapons[goods_item[1]]
      when 2
        item = $data_armors[goods_item[1]]
      end
      if item != nil
        @data.push(item)
      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
    # 价格在所持金以下、并且所持数不是 99 的情况下为普通文字颜色
    # 除此之外的情况设置为无效文字色
    p item.kind
    if item.kind==nil
      p 'zx'
      if item.element_set.include?(999)==false
        if (item.price <= $game_party.gold ||$game_switches[4]==true) and number < item.max_num
          self.contents.font.color = normal_color
        else
          self.contents.font.color = disabled_color
        end
      else
        if (item.price <= $game_party.silver ||$game_switches[4]==true) and number < item.max_num
          self.contents.font.color = normal_color
        else
          self.contents.font.color = disabled_color
        end
      end
    end
    x = 4
    y = index * 32
    rect = Rect.new(x, y, self.width - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    if item.element_set.include?(999)==false
      p_money=Bitmap.new("Graphics/Money/" +"银币.png")
    else
      p_money=Bitmap.new("Graphics/Money/" +"金币.png")
    end
    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)
    if $game_switches[4]==true
      self.contents.draw_text(x + 216, y, 88, 32, "0", 2)
    else
      self.contents.draw_text(x + 216, y, 88, 32, item.price.to_s, 2)
    end
    self.contents.blt(x+312, y+8, p_money,Rect.new(0,0,16,16),255)
  end
  #--------------------------------------------------------------------------
  # ● 刷新帮助文本
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end
[/pre]
[pre lang="ruby"]#==============================================================================
# ■ Window_ShopNumber
#------------------------------------------------------------------------------
#  商店画面、输入买卖数量的窗口。
#==============================================================================
#添加了币种图片的描述
class Window_ShopNumber < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 128, 368, 352)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item = nil
    @max = 1
    @price = 0
    @number = 1
  end
  #--------------------------------------------------------------------------
  # ● 设置物品、最大个数、价格
  #--------------------------------------------------------------------------
  def set(item, max, price)
    @item = item
    @max = max
    @price = price
    @number = 1
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 被输入的件数设置
  #--------------------------------------------------------------------------
  def number
    return @number
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_item_name(@item, 4, 96)
    if @item.element_set.include?(999)==false
      bitmap = Bitmap.new("Graphics/Money/" +"银币.png")
    else
      bitmap = Bitmap.new("Graphics/Money/" +"金币.png")
    end
    self.contents.font.color = normal_color
    self.contents.draw_text(272, 96, 32, 32, "×")
    self.contents.draw_text(308, 96, 24, 32, @number.to_s, 2)
    self.cursor_rect.set(304, 96, 32, 32)
    # 描绘合计价格和货币单位
    domination = $data_system.words.gold
    cx = contents.text_size(domination).width
    total_price = @price * @number
    #(x, y, bitmap, Rect.new(x, y, 宽, 高),透明度)
    self.contents.font.color = normal_color
    if $game_switches[4]==false
      self.contents.draw_text(4, 160, 328-cx-2, 32, total_price.to_s, 2)
    else
      self.contents.draw_text(4, 160, 328-cx-2, 32, "0", 2)
    end
    self.contents.font.color = system_color
    self.contents.blt(332-cx, 168, bitmap,Rect.new(0,0,16,16),255)
    #self.contents.draw_text(332-cx, 160, cx, 32, domination, 2)
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    if self.active
      # 光标右 (+1)
      if Input.repeat?(Input::RIGHT) and @number < @max
        $game_system.se_play($data_system.cursor_se)
        @number += 1
        refresh
      end
      # 光标左 (-1)
      if Input.repeat?(Input::LEFT) and @number > 1
        $game_system.se_play($data_system.cursor_se)
        @number -= 1
        refresh
      end
      # 光标上 (+10)
      if Input.repeat?(Input::UP) and @number < @max
        $game_system.se_play($data_system.cursor_se)
        @number = [@number + 10, @max].min
        refresh
      end
      # 光标下 (-10)
      if Input.repeat?(Input::DOWN) and @number > 1
        $game_system.se_play($data_system.cursor_se)
        @number = [@number - 10, 1].max
        refresh
      end
    end
  end
end
[/pre]
[pre lang="ruby"]#==============================================================================
# ■ Scene_Shop
#------------------------------------------------------------------------------
#  处理商店画面的类。
#==============================================================================
#添加了金币的使用
class Scene_Shop
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成帮助窗口
    @help_window = Window_Help.new
    # 生成指令窗口
    @command_window = Window_ShopCommand.new
    # 生成金钱窗口
    @gold_window = Window_Gold.new
    @gold_window.x = 480
    @gold_window.y = 64
    # 生成时间窗口
    @dummy_window = Window_Base.new(0, 128, 640, 352)
    # 生成购买窗口
    @buy_window = Window_ShopBuy.new($game_temp.shop_goods)
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
    # 生成卖出窗口
    @sell_window = Window_ShopSell.new
    @sell_window.active = false
    @sell_window.visible = false
    @sell_window.help_window = @help_window
    # 生成数量输入窗口
    @number_window = Window_ShopNumber.new
    @number_window.active = false
    @number_window.visible = false
    # 生成状态窗口
    @status_window = Window_ShopStatus.new
    @status_window.visible = false
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @help_window.dispose
    @command_window.dispose
    @gold_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @sell_window.dispose
    @number_window.dispose
    @status_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @help_window.update
    @command_window.update
    @gold_window.update
    @dummy_window.update
    @buy_window.update
    @sell_window.update
    @number_window.update
    @status_window.update
    # 指令窗口激活的情况下: 调用 update_command
    if @command_window.active
      update_command
      return
    end
    # 购买窗口激活的情况下: 调用 update_buy
    if @buy_window.active
      update_buy
      return
    end
    # 卖出窗口激活的情况下: 调用 update_sell
    if @sell_window.active
      update_sell
      return
    end
    # 个数输入窗口激活的情况下: 调用 update_number
    if @number_window.active
      update_number
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (指令窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_command
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 命令窗口光标位置分支
      case @command_window.index
      when 0  # 购买
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 窗口状态转向购买模式
        @command_window.active = false
        @dummy_window.visible = false
        @buy_window.active = true
        @buy_window.visible = true
        @buy_window.refresh
        @status_window.visible = true
      when 1  # 卖出
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 窗口状态转向卖出模式
        @command_window.active = false
        @dummy_window.visible = false
        @sell_window.active = true
        @sell_window.visible = true
        @sell_window.refresh
      when 2  # 取消
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到地图画面
        $scene = Scene_Map.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (购买窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_buy
    # 设置状态窗口的物品
    @status_window.item = @buy_window.item
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 窗口状态转向初期模式
      @command_window.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      # 删除帮助文本
      @help_window.set_text("")
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取物品
      @item = @buy_window.item
      # 物品无效的情况下、或者价格在所持金以上的情况下
      if @item.element_set.include?(999)==false
        if (@item == nil or @item.price > $game_party.gold) && $game_switches[4]==false
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      else
        if @item == nil or @item.price > $game_party.silver &&$game_switches[4]==false
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      end
      # 获取物品所持数
      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
      # 如果已经拥有了 99 个情况下
      if number == @item.max_num
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 计算可以最多购买的数量
      if @item.element_set.include?(999)==false
        max = @item.price == 0 ? 99 : $game_party.gold / @item.price
         if $game_switches[4]==false
           max = [max,@item.max_num - number].min
         else
           max = @item.max_num - number
         end
      else
        max = @item.price == 0 ? 99 : $game_party.silver / @item.price
        if $game_switches[4]==false
           max = [max, @item.max_num - number].min
         else
           max = @item.max_num - number
         end      
      end
      # 窗口状态转向数值输入模式
      @buy_window.active = false
      @buy_window.visible = false
      @number_window.set(@item, max, @item.price)
      @number_window.active = true
      @number_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 画面更新 (卖出窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_sell
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 窗口状态转向初期模式
      @command_window.active = true
      @dummy_window.visible = true
      @sell_window.active = false
      @sell_window.visible = false
      @status_window.item = nil
      # 删除帮助文本
      @help_window.set_text("")
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取物品
      @item = @sell_window.item
      # 设置状态窗口的物品
      @status_window.item = @item
      # 物品无效的情况下、或者价格为 0 (不能卖出) 的情况下
      if @item == nil or @item.price == 0
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 获取物品的所持数
      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
      # 最大卖出个数 = 物品的所持数
      max = number
      # 窗口状态转向个数输入模式
      @sell_window.active = false
      @sell_window.visible = false
      @number_window.set(@item, max, @item.price / 2)
      @number_window.active = true
      @number_window.visible = true
      @status_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (个数输入窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_number
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 设置个数输入窗口为不活动·非可视状态
      @number_window.active = false
      @number_window.visible = false
      # 命令窗口光标位置分支
      case @command_window.index
      when 0  # 购买
        # 窗口状态转向购买模式
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # 卖出
        # 窗口状态转向卖出模式
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 演奏商店 SE
      $game_system.se_play($data_system.shop_se)
      # 设置个数输入窗口为不活动·非可视状态
      @number_window.active = false
      @number_window.visible = false
      # 命令窗口光标位置分支
      case @command_window.index
      when 0  # 购买
        # 购买处理
        case @item
        when RPG::Item
          $game_party.gain_item(@item.id, @number_window.number)
        when RPG::Weapon
          $game_party.gain_weapon(@item.id, @number_window.number)
        when RPG::Armor
          $game_party.gain_armor(@item.id, @number_window.number)
        end
        if @item.element_set.include?(999)==false
          if $game_switches[4]==false
            $game_party.lose_gold(@number_window.number * @item.price)
          end
        else
          if $game_switches[4]==false
            $game_party.lose_silver(@number_window.number * @item.price)
          end
        end
        # 刷新各窗口
        @gold_window.refresh
        @buy_window.refresh
        @status_window.refresh
        # 窗口状态转向购买模式
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # 卖出
        # 卖出处理
        if @item.element_set.include?(999)==false
          if $game_switches[4]==false
            $game_party.gain_gold(@number_window.number * (@item.price / 2))
          end
        else
          if $game_switches[4]==false   
          $game_party.gain_silver(@number_window.number * (@item.price / 2))
          end
        end
        case @item
        when RPG::Item
          $game_party.lose_item(@item.id, @number_window.number)
        when RPG::Weapon
          $game_party.lose_weapon(@item.id, @number_window.number)
        when RPG::Armor
          $game_party.lose_armor(@item.id, @number_window.number)
        end
        # 刷新各窗口
        @gold_window.refresh
        @sell_window.refresh
        @status_window.refresh
        # 窗口状态转向卖出模式
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
  end
end
[/pre]
梦石
0
星屑
1293
在线时间
118 小时
注册时间
2017-7-14
回帖
112
 楼主| 发表于 2019-5-8 13:11:50 | 显示全部楼层
第一个的从72行那里是自己试着做的判定...当然错的一塌糊涂...
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2019-5-8 14:23:44 | 显示全部楼层
直接给它们三个定义相同的函数就好了

栗子:
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.金货  来统一判断了

点评

感谢QWQ问题解决了  发表于 2019-5-10 13:11
新建个脚本插入就行, 设置方法和你原来一样, 用是否拥有指定属性来判断, 你可以p 一下 $data_items[1].金货, $data_armors[1].金货 试试  发表于 2019-5-9 14:23
还有就是...如果定义了...又该用什么样的方法去判断呢...是用when么?(我对ruby并不是很熟...只是因为有c++的底子所以只能看懂==但是不太知道语法...)  发表于 2019-5-9 12:59
嗯...意思就是在三种物品的结构体里再加入一个函数以判断是否为金币变量吧....那请问...这个定义应该放在哪里呢..  发表于 2019-5-9 12:58

评分

参与人数 1星屑 +50 收起 理由
RyanBern + 50 认可答案

查看全部评分

回复 1 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部