查看: 2395|回复: 5

[已经解决] 菜单窗口显示的问题

[复制链接]
梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
发表于 2015-12-8 14:19:44 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 cmmd1 于 2015-12-8 16:34 编辑

QQ图片20151208141551.png
例如这个声望,善恶。能不能移动到状态窗口?不用在生成窗口了。就添加到状态窗口。
金钱显示,移动到物品栏窗口。也不用显示金钱的窗口了。就显示在物品栏。因为我用图片生成的物品栏。弄个图片框放这个金钱的显示。
希望帮忙一下,谢谢!

得失提示.rar (266.03 KB, 下载次数: 73)
QQ图片20151208163347.png
QQ图片20151208163318.jpg

点评

状态窗口是指哪个?菜单右侧的队伍状态,还是选择【状态】指令之后进入的个人状态?顺便就是。。。这个必须提供工程吧……  发表于 2015-12-8 15:54

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
 楼主| 发表于 2015-12-8 16:11:52 | 显示全部楼层
本帖最后由 cmmd1 于 2015-12-8 16:13 编辑

@cinderelmini 你没回复,我都点评不了啊。这里说明吧!
那个状态窗口就是显示角色状态啊,比如能力,HP,SP那个全屏窗口。
不是队伍这些东西,是下面的善恶值这个窗口的内容,转移到以上描述的状态窗口。
金钱窗口里面的内容,转移到物品栏窗口。
额,这个没有工程的,就是以上所述,没明白指出,还可以详细点描述。

点评

如果设置成队伍里面都有的话,这事件不知道怎么做。还是设置成只有主角有声望和善恶吧,其他人的状态里没有  发表于 2015-12-8 16:47
那个声望什么的,可以弄成队伍里的人分别都有?  发表于 2015-12-8 16:44
话说,这个物品栏都是你教我做出来的。效果是很不错,不过有个要命的问题,等下再说  发表于 2015-12-8 16:43
嗯,只要不是放在矩阵里面就方便多了。  发表于 2015-12-8 16:43
我只是那样表示,放在那里先,我会在下面画个小框装这些文字。先放进去,坐标写上,到时候我好调位置  发表于 2015-12-8 16:41
回复

使用道具 举报

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2015-12-8 16:57:46 | 显示全部楼层
本帖最后由 cinderelmini 于 2015-12-8 17:00 编辑

附件替换工程(上传的这个工程而不是你自己的游戏工程)Data文件夹里的同名文件(可以先备份原来那个),
改过的脚本【Scene_Menu】【Scene_Item】【Scene_Status】,
里面已经用一串#标出改的地方了,坐标什么的就在对应的地方改。

加了只有主角显示善恶。

Scripts.rxdata

122.44 KB, 下载次数: 54

点评

谢谢,这么详细的解释,真是太好啦。很少有人这么耐心详细的教啊。认可答案  发表于 2015-12-8 17:21

评分

参与人数 1梦石 +1 收起 理由
RyanBern + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
 楼主| 发表于 2015-12-8 17:49:57 | 显示全部楼层
本帖最后由 cmmd1 于 2015-12-8 18:26 编辑
cinderelmini 发表于 2015-12-8 16:57
附件替换工程(上传的这个工程而不是你自己的游戏工程)Data文件夹里的同名文件(可以先备份原来那个),
...


这个按到尾行的时候,光标还是往下,没有滚动。还有感觉这个光标被固定了高度吗?
QQ图片20151208161441.jpg
这是按下的时候出现的,再按下,就看不到光标了,画面没有滚动。
QQ图片20151208161517.png
■ Window_Item#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
#  物品画面、战斗画面、显示浏览物品的窗口。
#==============================================================================

class Window_Item < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(240, 64, 540, 414)
    @column_max = 8
    refresh
    self.index = 0
    # 战斗中的情况下将窗口移至中央并将其半透明化
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  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)
      end
    end
    # 在战斗中以外添加武器、防具
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons)
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors)
        end
      end
    end
    # 如果项目数不是 0 就生成位图、重新描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * (32 * 2)) # 列数要乘以两行
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 项目间距
  #--------------------------------------------------------------------------
  def space
    return 1#16
  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
    if item.is_a?(RPG::Item) and
       $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 16 + index % @column_max * (62 + space) # x宽度加上间距
    y = index / @column_max * (32 * 2) # y高度要乘以两行
    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 : 150
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
#    self.contents.draw_text(x + 28, y, 32, 32, item.name, 0)
#    self.contents.draw_text(x + 28, y, 16, 32, ":", 1)
    self.contents.draw_text(x - 8, y + 28, 36, 20, "x" + number.to_s, 2)
  end
  
  #--------------------------------------------------------------------------
  # ● 更新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    # 光标位置不满 0 的情况下
    if @index < 0
      self.cursor_rect.empty
      return
    end
    # 获取当前的行
    row = @index / @column_max
    # 当前行被显示开头行前面的情况下
    if row < self.top_row
      # 从当前行向开头行滚动
      self.top_row = row
    end
    # 当前行被显示末尾行之后的情况下
    if row > self.top_row + (self.page_row_max - 1)
      # 从当前行向末尾滚动
      self.top_row = row - (self.page_row_max - 1)
    end
    # 计算光标的宽度
    cursor_width = self.width / @column_max - 5#32
    # 计算光标坐标
    x = @index % @column_max * (cursor_width + space) # x宽度加上间距
    y = @index / @column_max * 63 - self.oy # y高度要乘以两行(31 * 2)
    # 更新光标矩形
    self.cursor_rect.set(x, y, cursor_width, 60)
  end
  
  #--------------------------------------------------------------------------
  # ● 刷新帮助文本
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end


■ Scene_Item#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
#  处理物品画面的类。
#==============================================================================

class Scene_Item
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    @map_back = Spriteset_Map.new  ############建立地图背景
    # 生成帮助窗口、物品窗口
    @help_window = Window_Help.new
    @help_window.x = 320         #说明窗口坐标
    @help_window.y = 460
    @help_window.opacity = 0    #说明窗口透明度
    @item_window = Window_Item.new
    # 关联帮助窗口
    @item_window.help_window = @help_window
    # 生成目标窗口 (设置为不可见・不活动)
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_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
    @target_window.dispose
    @map_back.dispose  ############释放地图背景
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @help_window.update
    @item_window.update
    @target_window.update
    # 物品窗口被激活的情况下: 调用 update_item
    if @item_window.active
      update_item
      return
    end
    # 目标窗口被激活的情况下: 调用 update_target
    if @target_window.active
      update_target
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (物品窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_item
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换到菜单画面
      $scene = $scene = Scene_Map.new#Scene_Menu.new(0)
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取物品窗口当前选中的物品数据
      @item = @item_window.item
      # 不使用物品的情况下
      unless @item.is_a?(RPG::Item)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 不能使用的情况下
      unless $game_party.item_can_use?(@item.id)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 效果范围是我方的情况下
      if @item.scope >= 3
        # 激活目标窗口
        @item_window.active = false
        @target_window.x = (@item_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        # 设置效果范围 (单体/全体) 的对应光标位置
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        else
          @target_window.index = 0
        end
      # 效果在我方以外的情况下
      else
        # 公共事件 ID 有效的情况下
        if @item.common_event_id > 0
          # 预约调用公共事件
          $game_temp.common_event_id = @item.common_event_id
          # 演奏物品使用时的 SE
          $game_system.se_play(@item.menu_se)
          # 消耗品的情况下
          if @item.consumable
            # 使用的物品数减 1
            $game_party.lose_item(@item.id, 1)
            # 再描绘物品窗口的项目
            @item_window.draw_item(@item_window.index)
          end
          # 切换到地图画面
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (目标窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_target
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 由于物品用完而不能使用的场合
      unless $game_party.item_can_use?(@item.id)
        # 再次生成物品窗口的内容
        @item_window.refresh
      end
      # 删除目标窗口
      @item_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 如果物品用完的情况下
      if $game_party.item_number(@item.id) == 0
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 目标是全体的情况下
      if @target_window.index == -1
        # 对同伴全体应用物品使用效果
        used = false
        for i in $game_party.actors
          used |= i.item_effect(@item)
        end
      end
      # 目标是单体的情况下
      if @target_window.index >= 0
        # 对目标角色应用物品的使用效果
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      end
      # 使用物品的情况下
      if used
        # 演奏物品使用时的 SE
        $game_system.se_play(@item.menu_se)
        # 消耗品的情况下
        if @item.consumable
          # 使用的物品数减 1
          $game_party.lose_item(@item.id, 1)
          # 再描绘物品窗口的项目
          @item_window.draw_item(@item_window.index)
        end
        # 再生成目标窗口的内容
        @target_window.refresh
        # 全灭的情况下
        if $game_party.all_dead?
          # 切换到游戏结束画面
          $scene = Scene_Gameover.new
          return
        end
        # 公共事件 ID 有效的情况下
        if @item.common_event_id > 0
          # 预约调用公共事件
          $game_temp.common_event_id = @item.common_event_id
          # 切换到地图画面
          $scene = Scene_Map.new
          return
        end
      end
      # 无法使用物品的情况下
      unless used
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end

============================
点击展开/收起#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
#  物品画面、战斗画面、显示浏览物品的窗口。
#==============================================================================

class Window_Item < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(240, 64, 540, 288)
    @column_max = 8
    refresh
    self.index = 0
    # 战斗中的情况下将窗口移至中央并将其半透明化
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  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)
      end
    end
    # 在战斗中以外添加武器、防具
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons)
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors)
        end
      end
    end
    # 如果项目数不是 0 就生成位图、重新描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * (32 * 2)) # 列数要乘以两行
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 项目间距
  #--------------------------------------------------------------------------
  def space
    return 1#16
  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
    if item.is_a?(RPG::Item) and
       $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 16 + index % @column_max * (62 + space) # x宽度加上间距
    y = index / @column_max * (32 * 2) # y高度要乘以两行
    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 : 150
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
#    self.contents.draw_text(x + 28, y, 32, 32, item.name, 0)
#    self.contents.draw_text(x + 28, y, 16, 32, ":", 1)
    self.contents.draw_text(x - 8, y + 28, 36, 20, "x" + number.to_s, 2)
  end
  
  #--------------------------------------------------------------------------
  # ● 更新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    # 光标位置不满 0 的情况下
    if @index < 0
      self.cursor_rect.empty
      return
    end
    # 获取当前的行
    row = @index / @column_max
    # 当前行被显示开头行前面的情况下
    if row < self.top_row
      # 从当前行向开头行滚动
      self.top_row = row
    end
    # 当前行被显示末尾行之后的情况下
    if row > self.top_row + (self.page_row_max - 1)
      # 从当前行向末尾滚动
      self.top_row = row - (self.page_row_max - 1)
    end
    # 计算光标的宽度
    cursor_width = self.width / @column_max - 5#32
    # 计算光标坐标
    x = @index % @column_max * (cursor_width + space) # x宽度加上间距
    y = @index / @column_max * 64 - self.oy # y高度要乘以两行(31 * 2)
    # 更新光标矩形
    self.cursor_rect.set(x, y, cursor_width, 60)
  end
  
  #--------------------------------------------------------------------------
  # ● 刷新帮助文本
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

  #--------------------------------------------------------------------------
  # ● 获取开头行
  #--------------------------------------------------------------------------
  def top_row
    # 将窗口内容的传送源 Y 坐标、1 行的高 32 等分
    return self.oy / (32 * 2)
  end
  #--------------------------------------------------------------------------
  # ● 设置开头行
  #     row : 显示开头的行
  #--------------------------------------------------------------------------
  def top_row=(row)
    # row 未满 0 的场合更正为 0
    if row < 0
      row = 0
    end
    # row 超过 row_max - 1 的情况下更正为 row_max - 1
    if row > row_max - 1
      row = row_max - 1
    end
    # row 1 行高的 32 倍、窗口内容的传送源 Y 坐标
    self.oy = row * (32 * 2)
  end
  #--------------------------------------------------------------------------
  # ● 获取 1 页可以显示的行数
  #--------------------------------------------------------------------------
  def page_row_max
    # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度 32
    return (self.height - 32) / (32 * 2)
  end
回复

使用道具 举报

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2015-12-8 18:03:30 | 显示全部楼层
本帖最后由 cinderelmini 于 2015-12-8 18:58 编辑

不用看了这些放到【Window_item】里面最后一个end之前。

  1.   #--------------------------------------------------------------------------
  2.   # ● 获取开头行
  3.   #--------------------------------------------------------------------------
  4.   def top_row
  5.     # 将窗口内容的传送源 Y 坐标、1 行的高 32 等分
  6.     return self.oy / (32 * 2)
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   # ● 设置开头行
  10.   #     row : 显示开头的行
  11.   #--------------------------------------------------------------------------
  12.   def top_row=(row)
  13.     # row 未满 0 的场合更正为 0
  14.     if row < 0
  15.       row = 0
  16.     end
  17.     # row 超过 row_max - 1 的情况下更正为 row_max - 1
  18.     if row > row_max - 1
  19.       row = row_max - 1
  20.     end
  21.     # row 1 行高的 32 倍、窗口内容的传送源 Y 坐标
  22.     self.oy = row * (32 * 2)
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 获取 1 页可以显示的行数
  26.   #--------------------------------------------------------------------------
  27.   def page_row_max
  28.     # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度 32
  29.     return (self.height - 32) / (32 * 2)
  30.   end
复制代码


更新:
做了统一处理,加了几个方法
【window_lines】:窗口的行数,改显示行数的话可以直接在这个方法里面改返回的值。
【window_height】:不用改这个方法的内容,计算出窗口的高度用的。
【line_height】:一行的高度,要63还是64直接改这个方法返回的数字。
这几个都用一串#标出来了。
顺便就是获取物品的这段:
  1. # 添加物品
  2.     for i in 1...$data_items.size
  3.       if $game_party.item_number(i) > 0
  4.         @data.push($data_items[i])
  5.       end
  6.     end
  7.     # 在战斗中以外添加武器、防具
  8.     unless $game_temp.in_battle
  9.       for i in 1...$data_weapons.size
  10.         if $game_party.weapon_number(i) > 0
  11.           @data.push($data_weapons[i])
  12.         end
  13.       end
  14.       for i in 1...$data_armors.size
  15.         if $game_party.armor_number(i) > 0
  16.           @data.push($data_armors[i])
  17.         end
  18.       end
  19.     end
复制代码
  1. @data.push($data_items[i])
  2. @data.push($data_weapons[i])
  3. @data.push($data_armors[i])
复制代码
这几个后面的
  1. [i]
复制代码
不能删,
我还找了半天出错的原因………………………………
■ Window_Item
  1. #==============================================================================
  2. # ■ Window_Item
  3. #------------------------------------------------------------------------------
  4. #  物品画面、战斗画面、显示浏览物品的窗口。
  5. #==============================================================================

  6. class Window_Item < Window_Selectable
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对像
  9.   #--------------------------------------------------------------------------
  10.   def initialize
  11.     super(240, 64, 540, window_height)
  12.     @column_max = 8
  13.     refresh
  14.     self.index = 0
  15.     # 战斗中的情况下将窗口移至中央并将其半透明化
  16.     if $game_temp.in_battle
  17.       self.y = 64
  18.       self.height = 256
  19.       self.back_opacity = 160
  20.     end
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● 获取物品
  24.   #--------------------------------------------------------------------------
  25.   def item
  26.     return @data[self.index]
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   # ● 刷新
  30.   #--------------------------------------------------------------------------
  31.   def refresh
  32.     if self.contents != nil
  33.       self.contents.dispose
  34.       self.contents = nil
  35.     end
  36.     @data = []
  37.     # 添加物品
  38.     for i in 1...$data_items.size
  39.       if $game_party.item_number(i) > 0
  40.         @data.push($data_items[i])
  41.       end
  42.     end
  43.     # 在战斗中以外添加武器、防具
  44.     unless $game_temp.in_battle
  45.       for i in 1...$data_weapons.size
  46.         if $game_party.weapon_number(i) > 0
  47.           @data.push($data_weapons[i])
  48.         end
  49.       end
  50.       for i in 1...$data_armors.size
  51.         if $game_party.armor_number(i) > 0
  52.           @data.push($data_armors[i])
  53.         end
  54.       end
  55.     end
  56.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  57.     @item_max = @data.size
  58.     if @item_max > 0
  59.       self.contents = Bitmap.new(width - 32, row_max * (32 * 2)) # 列数要乘以两行
  60.       for i in 0...@item_max
  61.         draw_item(i)
  62.       end
  63.     end
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 窗口要显示的行数#######################
  67.   #--------------------------------------------------------------------------
  68.   def window_lines
  69.     return 5
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # ● 窗口高度###########################
  73.   #--------------------------------------------------------------------------
  74.   def window_height
  75.     return line_height * window_lines + 32 # 这个32不要动
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 行高#############################
  79.   #--------------------------------------------------------------------------
  80.   def line_height
  81.     return 63
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 项目间距
  85.   #--------------------------------------------------------------------------
  86.   def space
  87.     return 1#16
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 描绘项目
  91.   #     index : 项目编号
  92.   #--------------------------------------------------------------------------
  93.   def draw_item(index)
  94.     item = @data[index]
  95.     case item
  96.     when RPG::Item
  97.       number = $game_party.item_number(item.id)
  98.     when RPG::Weapon
  99.       number = $game_party.weapon_number(item.id)
  100.     when RPG::Armor
  101.       number = $game_party.armor_number(item.id)
  102.     end
  103.     if item.is_a?(RPG::Item) and
  104.        $game_party.item_can_use?(item.id)
  105.       self.contents.font.color = normal_color
  106.     else
  107.       self.contents.font.color = disabled_color
  108.     end
  109.     x = 16 + index % @column_max * (62 + space) # x宽度加上间距
  110.     y = index / @column_max * line_height
  111.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  112.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  113.    
  114.     bitmap = RPG::Cache.icon(item.icon_name)
  115.     opacity = self.contents.font.color == normal_color ? 255 : 150
  116.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  117. #    self.contents.draw_text(x + 28, y, 32, 32, item.name, 0)
  118. #    self.contents.draw_text(x + 28, y, 16, 32, ":", 1)
  119.     self.contents.draw_text(x - 8, y + 28, 36, 20, "x" + number.to_s, 2)
  120.   end
  121.   
  122.   #--------------------------------------------------------------------------
  123.   # ● 更新光标矩形
  124.   #--------------------------------------------------------------------------
  125.   def update_cursor_rect
  126.     # 光标位置不满 0 的情况下
  127.     if @index < 0
  128.       self.cursor_rect.empty
  129.       return
  130.     end
  131.     # 获取当前的行
  132.     row = @index / @column_max
  133.     # 当前行被显示开头行前面的情况下
  134.     if row < self.top_row
  135.       # 从当前行向开头行滚动
  136.       self.top_row = row
  137.     end
  138.     # 当前行被显示末尾行之后的情况下
  139.     if row > self.top_row + (self.page_row_max - 1)
  140.       # 从当前行向末尾滚动
  141.       self.top_row = row - (self.page_row_max - 1)
  142.     end
  143.     # 计算光标的宽度
  144.     cursor_width = self.width / @column_max - 5#32
  145.     # 计算光标坐标
  146.     x = @index % @column_max * (cursor_width + space) # x宽度加上间距
  147.     y = @index / @column_max * line_height - self.oy # y高度*行高
  148.     # 更新光标矩形
  149.     self.cursor_rect.set(x, y, cursor_width, 60)
  150.   end
  151.   
  152.   #--------------------------------------------------------------------------
  153.   # ● 获取开头行
  154.   #--------------------------------------------------------------------------
  155.   def top_row
  156.     # 将窗口内容的传送源 Y 坐标、1 行高等分
  157.     return self.oy / line_height
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ● 设置开头行
  161.   #     row : 显示开头的行
  162.   #--------------------------------------------------------------------------
  163.   def top_row=(row)
  164.     # row 未满 0 的场合更正为 0
  165.     if row < 0
  166.       row = 0
  167.     end
  168.     # row 超过 row_max - 1 的情况下更正为 row_max - 1
  169.     if row > row_max - 1
  170.       row = row_max - 1
  171.     end
  172.     # row 1 行的行高、窗口内容的传送源 Y 坐标
  173.     self.oy = row * line_height
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # ● 获取 1 页可以显示的行数
  177.   #--------------------------------------------------------------------------
  178.   def page_row_max
  179.     # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度
  180.     return (self.height - 32) / line_height
  181.   end
  182.   
  183.   #--------------------------------------------------------------------------
  184.   # ● 刷新帮助文本
  185.   #--------------------------------------------------------------------------
  186.   def update_help
  187.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  188.   end
  189. end
复制代码

点评

认可答案!  发表于 2015-12-8 19:09
恩,果然是大神啊,这里面好像很复杂啊。要是没有你帮我弄,我恐怕一辈子也弄不了。  发表于 2015-12-8 19:09
恩,我琢磨一下。  发表于 2015-12-8 19:00
窝也更新进了脚本。没变化  发表于 2015-12-8 18:52
算了……窝现在更新这楼的脚本做了统一处理……  发表于 2015-12-8 18:48
回复

使用道具 举报

梦石
0
星屑
50
在线时间
168 小时
注册时间
2007-7-26
回帖
427
 楼主| 发表于 2015-12-8 18:53:32 | 显示全部楼层
cinderelmini 发表于 2015-12-8 18:03
这些放到【Window_item】里面最后一个end之前。
点击展开/收起

全部都在这里。

[pre lang="ruby"]#==============================================================================
# ■ Window_Item
#------------------------------------------------------------------------------
#  物品画面、战斗画面、显示浏览物品的窗口。
#==============================================================================

class Window_Item < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(240, 64, 540, 288)
    @column_max = 8
    refresh
    self.index = 0
    # 战斗中的情况下将窗口移至中央并将其半透明化
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  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)
      end
    end
    # 在战斗中以外添加武器、防具
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons)
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors)
        end
      end
    end
    # 如果项目数不是 0 就生成位图、重新描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * (32 * 2)) # 列数要乘以两行
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 项目间距
  #--------------------------------------------------------------------------
  def space
    return 1#16
  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
    if item.is_a?(RPG::Item) and
       $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 16 + index % @column_max * (62 + space) # x宽度加上间距
    y = index / @column_max * (32 * 2) # y高度要乘以两行
    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 : 150
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
#    self.contents.draw_text(x + 28, y, 32, 32, item.name, 0)
#    self.contents.draw_text(x + 28, y, 16, 32, ":", 1)
    self.contents.draw_text(x - 8, y + 28, 36, 20, "x" + number.to_s, 2)
  end
  
  #--------------------------------------------------------------------------
  # ● 更新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    # 光标位置不满 0 的情况下
    if @index < 0
      self.cursor_rect.empty
      return
    end
    # 获取当前的行
    row = @index / @column_max
    # 当前行被显示开头行前面的情况下
    if row < self.top_row
      # 从当前行向开头行滚动
      self.top_row = row
    end
    # 当前行被显示末尾行之后的情况下
    if row > self.top_row + (self.page_row_max - 1)
      # 从当前行向末尾滚动
      self.top_row = row - (self.page_row_max - 1)
    end
    # 计算光标的宽度
    cursor_width = self.width / @column_max - 5#32
    # 计算光标坐标
    x = @index % @column_max * (cursor_width + space) # x宽度加上间距
    y = @index / @column_max * 64 - self.oy # y高度要乘以两行(31 * 2)
    # 更新光标矩形
    self.cursor_rect.set(x, y, cursor_width, 60)
  end
  
  #--------------------------------------------------------------------------
  # ● 刷新帮助文本
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end


  #--------------------------------------------------------------------------
  # ● 获取开头行
  #--------------------------------------------------------------------------
  def top_row
    # 将窗口内容的传送源 Y 坐标、1 行的高 32 等分
    return self.oy / (32 * 2)
  end
  #--------------------------------------------------------------------------
  # ● 设置开头行
  #     row : 显示开头的行
  #--------------------------------------------------------------------------
  def top_row=(row)
    # row 未满 0 的场合更正为 0
    if row < 0
      row = 0
    end
    # row 超过 row_max - 1 的情况下更正为 row_max - 1
    if row > row_max - 1
      row = row_max - 1
    end
    # row 1 行高的 32 倍、窗口内容的传送源 Y 坐标
    self.oy = row * (32 * 2)
  end
  #--------------------------------------------------------------------------
  # ● 获取 1 页可以显示的行数
  #--------------------------------------------------------------------------
  def page_row_max
    # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度 32
    return (self.height - 32) / (32 * 2)
  end
[/pre]

点评

这并不可笑嘛~~问题描述清晰然后正好这类问题窝比较擅长……所以挺喜欢回答的…………  发表于 2015-12-8 19:50
所以我问一些对别人来说很简单的问题,有人看到我的ID就笑话我。  发表于 2015-12-8 19:39
(๑íㅂì๑)……07年……………………(开会的时候………………  发表于 2015-12-8 19:33
恩,抱歉。别看我注册的早。也就这些天,才来学的。昨天弄了一整天。今天开会发言的时候。 我说了句“我们针对民用爆炸物品栏显示”差点搞笑了  发表于 2015-12-8 19:29
正常的格式就是一个【class】对应一个【end】,一个【def】对应一个【end】,然后所有的【def】都应该在【class】的【end】里面。  发表于 2015-12-8 19:00
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部