Project1

标题: 【求助帖】分页显示物品异常,个人无法修正 [打印本页]

作者: px.凤翔九天    时间: 2010-12-30 23:09
标题: 【求助帖】分页显示物品异常,个人无法修正
本帖最后由 px.凤翔九天 于 2010-12-31 21:12 编辑

因为需要,就自制了分页窗口(思路在别人的指导下...)结果发现问题,分页完美解决,可以按物品数量分为多少页,并且左右键换页,但是在描绘时出现了问题。换页后虽然我使用了refresh,但是显示为空(描绘无效),底下的help窗口的解说表示依旧停在第一页。也就是分页后,换页无法改掉数据,重描绘莫名的无效...鉴于只发脚本可能会乱,就发上来工程了,涉及到的并且我修改的脚本后面加了“※”
望高手解答.....
附件: Project1.rar (187.06 KB, 下载次数: 48)
指导思路大致可以看这里:http://rpg.blue/thread-164062-1-1.html
附:我用的xp1.02
作者: enghao_lim    时间: 2010-12-31 02:47
本帖最后由 enghao_lim 于 2010-12-31 02:56 编辑

结果最后竟然又问回来……汗……沒下工程……不过这个是当初你提问时就写好的了……自己慢慢看,我还打算删了呢。
  1. #==============================================================================
  2. # ■ Window_Item
  3. #------------------------------------------------------------------------------
  4. #  物品画面、战斗画面、显示浏览物品的窗口。
  5. #==============================================================================

  6. class Window_Item < Window_Base
  7.   #--------------------------------------------------------------------------
  8.   # ● 定义实例变量
  9.   #--------------------------------------------------------------------------
  10.   attr_reader   :index                    # 光标位置
  11.   attr_reader   :help_window              # 帮助窗口
  12.   #--------------------------------------------------------------------------
  13.   # ● 初始化对像
  14.   #--------------------------------------------------------------------------
  15.   def initialize
  16.     super(0, 64, 320, 416)
  17.     @column_max = 1
  18.     refresh
  19.     self.index = 0
  20.     # 战斗中的情况下将窗口移至中央并将其半透明化
  21.     if $game_temp.in_battle
  22.       self.y = 64
  23.       self.height = 256
  24.       self.back_opacity = 160
  25.     end
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   # ● 获取物品
  29.   #--------------------------------------------------------------------------
  30.   def item
  31.     return @data[self.index]
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 刷新
  35.   #--------------------------------------------------------------------------
  36.   def refresh
  37.     if self.contents != nil
  38.       self.contents.dispose
  39.       self.contents = nil
  40.     end
  41.     @data = []
  42.     # 添加物品
  43.     for i in 1...$data_items.size
  44.       if $game_party.item_number(i) > 0
  45.         (0...$game_party.item_number(i)).each{|j|@data.push($data_items[i])}
  46.       end
  47.     end
  48.     # 在战斗中以外添加武器、防具
  49.     unless $game_temp.in_battle
  50.       for i in 1...$data_weapons.size
  51.         if $game_party.weapon_number(i) > 0
  52.           (0...$game_party.weapon_number(i)).each{|j|@data.push($data_weapons[i])}
  53.         end
  54.       end
  55.       for i in 1...$data_armors.size
  56.         if $game_party.armor_number(i) > 0
  57.           (0...$game_party.armor_number(i)).each{|j|@data.push($data_armors[i])}
  58.         end
  59.       end
  60.     end
  61.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  62.     @item_max = @data.size
  63.     if @item_max > 0
  64.       self.contents = Bitmap.new(width - 32, row_max * 32)
  65.       for i in 0...@item_max
  66.         draw_item(i)
  67.       end
  68.     end
  69.   end
  70.   #--------------------------------------------------------------------------
  71.   # ● 描绘项目
  72.   #     index : 项目编号
  73.   #--------------------------------------------------------------------------
  74.   def draw_item(index)
  75.     item = @data[index]
  76.     case item
  77.     when RPG::Item
  78.       number = $game_party.item_number(item.id)
  79.     when RPG::Weapon
  80.       number = $game_party.weapon_number(item.id)
  81.     when RPG::Armor
  82.       number = $game_party.armor_number(item.id)
  83.     end
  84.     if item.is_a?(RPG::Item) and
  85.        $game_party.item_can_use?(item.id)
  86.       self.contents.font.color = normal_color
  87.     else
  88.       self.contents.font.color = disabled_color
  89.     end
  90.     x = 4
  91.     y = index * 32
  92.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  93.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  94.     bitmap = RPG::Cache.icon(item.icon_name)
  95.     opacity = self.contents.font.color == normal_color ? 255 : 128
  96.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  97.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # ● 刷新帮助文本
  101.   #--------------------------------------------------------------------------
  102.   def update_help
  103.     now_page = self.index/self.page_row_max
  104.     word = self.item == nil ? "" : self.item.description
  105.     word += " Page: #{now_page+1}"
  106.     @help_window.set_text(word)
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 设置光标的位置
  110.   #     index : 新的光标位置
  111.   #--------------------------------------------------------------------------
  112.   def index=(index)
  113.     @index = index
  114.     # 刷新帮助文本 (update_help 定义了继承目标)
  115.     if self.active and @help_window != nil
  116.       update_help
  117.     end
  118.     # 刷新光标矩形
  119.     update_cursor_rect
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● 获取行数
  123.   #--------------------------------------------------------------------------
  124.   def row_max
  125.     # 由项目数和列数计算出行数
  126.     return (@item_max + @column_max - 1) / @column_max
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 获取开头行
  130.   #--------------------------------------------------------------------------
  131.   def top_row
  132.     # 将窗口内容的传送源 Y 坐标、1 行的高 32 等分
  133.     return self.oy / 32
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 设置开头行
  137.   #     row : 显示开头的行
  138.   #--------------------------------------------------------------------------
  139.   def top_row=(row)
  140.     # row 未满 0 的场合更正为 0
  141.     if row < 0
  142.       row = 0
  143.     end
  144.     # row 超过 row_max - 1 的情况下更正为 row_max - 1
  145.     if row > row_max - 1
  146.       row = row_max - 1
  147.     end
  148.     # row 1 行高的 32 倍、窗口内容的传送源 Y 坐标
  149.     self.oy = row * 32
  150.   end
  151.   #--------------------------------------------------------------------------
  152.   # ● 获取 1 页可以显示的行数
  153.   #--------------------------------------------------------------------------
  154.   def page_row_max
  155.     # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度 32
  156.     return (self.height - 32) / 32
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # ● 获取 1 页可以显示的项目数
  160.   #--------------------------------------------------------------------------
  161.   def page_item_max
  162.     # 将行数 page_row_max 乘上列数 @column_max
  163.     return page_row_max * @column_max
  164.   end
  165.   #--------------------------------------------------------------------------
  166.   # ● 帮助窗口的设置
  167.   #     help_window : 新的帮助窗口
  168.   #--------------------------------------------------------------------------
  169.   def help_window=(help_window)
  170.     @help_window = help_window
  171.     # 刷新帮助文本 (update_help 定义了继承目标)
  172.     if self.active and @help_window != nil
  173.       update_help
  174.     end
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 更新光标矩形
  178.   #--------------------------------------------------------------------------
  179.   def update_cursor_rect
  180.     # 光标位置不满 0 的情况下
  181.     if @index < 0
  182.       self.cursor_rect.empty
  183.       return
  184.     end
  185.     # 获取当前的行
  186.     row = @index / @column_max
  187.     # 当前行被显示开头行前面的情况下
  188.     if row < self.top_row
  189.       # 从当前行向开头行滚动
  190.       self.top_row = row
  191.     end
  192.     # 当前行被显示末尾行之后的情况下
  193.     if row > self.top_row + (self.page_row_max - 1)
  194.       # 从当前行向末尾滚动
  195.       self.top_row = row - (self.page_row_max - 1)
  196.     end
  197.     # 计算光标的宽度
  198.     cursor_width = self.width / @column_max - 32
  199.     # 计算光标坐标
  200.     x = @index % @column_max * (cursor_width + 32)
  201.     y = @index / @column_max * 32 - self.oy
  202.     # 更新光标矩形
  203.     self.cursor_rect.set(x, y, cursor_width, 32)
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● 刷新画面
  207.   #--------------------------------------------------------------------------
  208.   def update
  209.     super
  210.     # 可以移动光标的情况下
  211.     if self.active and @item_max > 0 and @index >= 0
  212.       # 方向键下被按下的情况下
  213.       if Input.repeat?(Input::DOWN)
  214.         $game_system.se_play($data_system.cursor_se)
  215.         now_page = self.index/self.page_row_max
  216.         max_page = @item_max/self.page_row_max
  217.         max_page -= 1 if @item_max % self.page_row_max == 0
  218.         if now_page == max_page
  219.           d = @item_max%self.page_row_max
  220.           d = self.page_row_max if d == 0
  221.         else
  222.           d = self.page_row_max
  223.         end
  224.         @index += 1
  225.         @index -= now_page * self.page_row_max
  226.         @index %= d
  227.         @index += now_page * self.page_row_max
  228.       end
  229.       # 方向键上被按下的情况下
  230.       if Input.repeat?(Input::UP)
  231.         $game_system.se_play($data_system.cursor_se)
  232.         now_page = self.index/self.page_row_max
  233.         max_page = @item_max/self.page_row_max
  234.         max_page -= 1 if @item_max % self.page_row_max == 0
  235.         d = nil
  236.         if now_page == max_page
  237.           d = @item_max%self.page_row_max
  238.           d = self.page_row_max if d == 0
  239.         else
  240.           d = self.page_row_max
  241.         end
  242.         @index -= 1
  243.         @index = d - 1 if @index < 0
  244.         @index -= now_page * self.page_row_max
  245.         @index %= d
  246.         @index += now_page * self.page_row_max
  247.       end
  248.       # 方向键右被按下的情况下
  249.       if Input.repeat?(Input::RIGHT) or Input.repeat?(Input::R)
  250.         $game_system.se_play($data_system.cursor_se)
  251.         now_page = self.index/self.page_row_max
  252.         max_page = @item_max/self.page_row_max
  253.         max_page -= 1 if @item_max % self.page_row_max == 0
  254.         now_page += 1
  255.         now_page = 0 if now_page > max_page
  256.         @index = 0
  257.         @index = now_page * self.page_row_max
  258.         self.top_row = @index
  259.       end
  260.       # 方向键左被按下的情况下
  261.       if Input.repeat?(Input::LEFT) or Input.repeat?(Input::L)
  262.         $game_system.se_play($data_system.cursor_se)
  263.         now_page = self.index/self.page_row_max
  264.         max_page = @item_max/self.page_row_max
  265.         max_page -= 1 if @item_max % self.page_row_max == 0
  266.         now_page -= 1
  267.         now_page = max_page if now_page == -1
  268.         @index = 0
  269.         @index = now_page * self.page_row_max
  270.         self.top_row = @index
  271.       end
  272.     end
  273.     # 刷新帮助文本 (update_help 定义了继承目标)
  274.     if self.active and @help_window != nil
  275.       update_help
  276.     end
  277.     # 刷新光标矩形
  278.     update_cursor_rect
  279.   end
  280. end
复制代码

作者: px.凤翔九天    时间: 2010-12-31 21:09
本帖最后由 px.凤翔九天 于 2010-12-31 21:11 编辑

回复 enghao_lim 的帖子

恩恩,经过我小小的渣修改可以用了。
原理简单分析了一下,貌似思路是一样的,只是您用了父类中的一系列的刷新方法...我自己重写的...结果就出问题了...
话说这个方法我记下来了,很实用啊...学到了。

小小的发一下效果图庆祝一下:






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