设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: zxc3824
打印 上一主题 下一主题

[已经解决] 关于制作下拉按钮的问题

 关闭 [复制链接]

Lv4.逐梦者

梦石
0
星屑
6860
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

11
发表于 2011-8-31 17:54:13 | 只看该作者
做了个按钮式的.范例只有核心部分和物品菜单的.
装备、技能、商店的没做
窗口增加翻页按钮.rar (261.1 KB, 下载次数: 33)
核心部分是拿 Window_Selectable 改的

  1. #==============================================================================
  2. # ■ 此脚本来自 www.66rpg.com 使用和转载时请保留此信息
  3. =begin
  4.       功能:给窗口增加翻页按钮
  5.       作者:后知后觉 2011-8-31
  6.       说明:请自备 鼠标脚本(whbm)
  7.             把此核心部分放在 Window_Base 的下面 最好和他挨着
  8.             把需要有这样效果的窗口将其父类设置为 Window_MouseSelectable
  9.             然后在相关 Scene 增加对 窗口实例的 hzhj_state 属性判断
  10.             如果为 1 则是向上翻页 对窗口实例掉用 up_page 即可
  11.             如果为 2 则是向下翻页 对窗口实例调用 down_page 即可
  12.             还可以在窗口初始化后调用 make_rect(x1, y1, x2, y2)
  13.             参数可以省略 省略则为默认值 这是在设置翻页图标的位置
  14.             是相对于本窗口的坐标位置
  15.             如果你的窗口在运行中进行了移动(x y变化了)
  16.             或者是窗口大小被改变了(width、height)
  17.             都最好再调用一次 make_rect 来更新数据
  18. =end
  19. #==============================================================================
  20. #==============================================================================
  21. # ■ Window_MouseSelectable
  22. #==============================================================================

  23. class Window_MouseSelectable < Window_Base
  24.   UpBitmap = "Graphics/Icons/wdup.png"
  25.   DnBitmap = "Graphics/Icons/wddn.png"
  26.   #--------------------------------------------------------------------------
  27.   # ● 定义实例变量
  28.   #--------------------------------------------------------------------------
  29.   attr_reader   :index                    # 光标位置
  30.   attr_reader   :help_window              # 帮助窗口
  31.   attr_reader :hzhj_state
  32.   #--------------------------------------------------------------------------
  33.   # ● 初始画对像
  34.   #--------------------------------------------------------------------------
  35.   def initialize(x, y, width, height)
  36.     super(x, y, width, height)
  37.     @item_max = 1
  38.     @column_max = 1
  39.     @index = -1
  40.     @up_sprite = Sprite.new
  41.     @dn_sprite = Sprite.new
  42.     @up_sprite.bitmap = Bitmap.new(UpBitmap)
  43.     @dn_sprite.bitmap = Bitmap.new(DnBitmap)
  44.     @up_sprite.z = self.z + 2
  45.     @dn_sprite.z = self.z + 2
  46.     make_rect(*@hzhj_xy)
  47.     @hzhj_state = 0
  48.     @up_sprite.visible = self.visible
  49.     @dn_sprite.visible = self.visible
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ● 设置光标的位置
  53.   #     index : 新的光标位置
  54.   #--------------------------------------------------------------------------
  55.   def index=(index)
  56.     @index = index
  57.     # 刷新帮助文本 (update_help 定义了继承目标)
  58.     if self.active and @help_window != nil
  59.       update_help
  60.     end
  61.     # 刷新光标矩形
  62.     update_cursor_rect
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 获取行数
  66.   #--------------------------------------------------------------------------
  67.   def row_max
  68.     # 由项目数和列数计算出行数
  69.     return (@item_max + @column_max - 1) / @column_max
  70.   end
  71.   #--------------------------------------------------------------------------
  72.   # ● 获取开头行
  73.   #--------------------------------------------------------------------------
  74.   def top_row
  75.     # 将窗口内容的传送源 Y 坐标、1 行的高 32 等分
  76.     return self.oy / 32
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 设置开头行
  80.   #     row : 显示开头的行
  81.   #--------------------------------------------------------------------------
  82.   def top_row=(row)
  83.     # row 未满 0 的场合更正为 0
  84.     if row < 0
  85.       row = 0
  86.     end
  87.     # row 超过 row_max - 1 的情况下更正为 row_max - 1
  88.     if row > row_max - 1
  89.       row = row_max - 1
  90.     end
  91.     # row 1 行高的 32 倍、窗口内容的传送源 Y 坐标
  92.     self.oy = row * 32
  93.   end
  94.   #--------------------------------------------------------------------------
  95.   # ● 获取 1 页可以显示的行数
  96.   #--------------------------------------------------------------------------
  97.   def page_row_max
  98.     # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度 32
  99.     return (self.height - 32) / 32
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # ● 获取 1 页可以显示的项目数
  103.   #--------------------------------------------------------------------------
  104.   def page_item_max
  105.     # 将行数 page_row_max 乘上列数 @column_max
  106.     return page_row_max * @column_max
  107.   end
  108.   #--------------------------------------------------------------------------
  109.   # ● 帮助窗口的设置
  110.   #     help_window : 新的帮助窗口
  111.   #--------------------------------------------------------------------------
  112.   def help_window=(help_window)
  113.     @help_window = help_window
  114.     # 刷新帮助文本 (update_help 定义了继承目标)
  115.     if self.active and @help_window != nil
  116.       update_help
  117.     end
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 更新光标举行
  121.   #--------------------------------------------------------------------------
  122.   def update_cursor_rect
  123.     if @index < 0
  124.       self.cursor_rect.empty
  125.       return
  126.     end
  127.     row = @index / @column_max
  128.     if row < self.top_row
  129.       self.top_row = row
  130.     end
  131.     if row > self.top_row + (self.page_row_max - 1)
  132.       self.top_row = row - (self.page_row_max - 1)
  133.     end
  134.     cursor_width = self.width / @column_max - 32
  135.     x = @index % @column_max * (cursor_width + 32)
  136.     y = @index / @column_max * 32 - self.oy
  137.     self.cursor_rect.set(x, y, cursor_width, 32)
  138.   end
  139.   def make_rect(hux = nil, huy = nil, hdx = nil, hdy = nil)
  140.     if hux.nil?
  141.       upx = self.x + self.width / 4
  142.     else
  143.       upx = self.x + hux
  144.     end
  145.     if huy.nil?
  146.       upy = self.y + self.height - @up_sprite.bitmap.height
  147.     else
  148.       upy = self.y + huy
  149.     end
  150.     upw = [upx + @up_sprite.bitmap.width, self.x + self.width].min
  151.     uph = [upy + @up_sprite.bitmap.height, self.y + self.height].min
  152.     upxr = [upx, self.x].max
  153.     upyr = [upy, self.y].max
  154.     @up_rect = Rect.new(upxr, upyr, upw, uph)
  155.    
  156.     if hdx.nil?
  157.       dnx = self.x + self.width - self.width / 4
  158.     else
  159.       dnx = self.x + hdx
  160.     end
  161.     if hdy.nil?
  162.       dny = self.y + self.height - @dn_sprite.bitmap.height
  163.     else
  164.       dny = self.y + hdy
  165.     end
  166.     dnw = [dnx + @dn_sprite.bitmap.width, self.x + self.width].min
  167.     dnh = [dny + @dn_sprite.bitmap.height, self.y + self.height].min
  168.     dnxr = [dnx, self.x].max
  169.     dnyr = [dny, self.y].max
  170.     @dn_rect = Rect.new(dnxr, dnyr, dnw, dnh)
  171.    
  172.     @up_sprite.x = upx
  173.     @up_sprite.y = upy
  174.     @dn_sprite.x = dnx
  175.     @dn_sprite.y = dny
  176.   end
  177.   def update
  178.     super
  179.     @up_sprite.update
  180.     @dn_sprite.update
  181.     if self.active and @item_max > 0 and @index >= 0
  182.       mx,my = Mouse.get_mouse_pos
  183.       if mx.between?(@up_rect.x, @up_rect.width) and my.between?(@up_rect.y, @up_rect.height)
  184.         if @hzhj_state != 1
  185.           @hzhj_state = 1
  186.           @up_sprite.tone.set(64, 64, 64)
  187.           @dn_sprite.tone.set(0, 0, 0)
  188.         end
  189.         return
  190.       elsif mx.between?(@dn_rect.x, @dn_rect.width) and my.between?(@dn_rect.y, @dn_rect.height)
  191.         if @hzhj_state != 2
  192.           @hzhj_state = 2
  193.           @up_sprite.tone.set(0, 0, 0)
  194.           @dn_sprite.tone.set(64, 64, 64)
  195.         end
  196.         return
  197.       else
  198.         if @hzhj_state != 0
  199.           @hzhj_state = 0
  200.           @up_sprite.tone.set(0, 0, 0)
  201.           @dn_sprite.tone.set(0, 0, 0)
  202.         end
  203.       end
  204.       now_index = @index
  205.       start_index = top_row * @column_max
  206.       end_index = (top_row + page_row_max) * @column_max
  207.       for i in start_index..end_index
  208.         if i >= @item_max or i == end_index
  209.           self.index = now_index
  210.           break
  211.         end
  212.         @index = i
  213.         update_cursor_rect
  214.         sx = self.x + 16 + self.cursor_rect.x
  215.         sy = self.y + 16 + self.cursor_rect.y
  216.         ex = sx + self.cursor_rect.width
  217.         ey = sy + self.cursor_rect.height
  218.         if mx.between?(sx, ex) and my.between?(sy, ey)
  219.           if @index != now_index
  220.             $game_system.se_play($data_system.cursor_se)
  221.           end
  222.           break
  223.         end
  224.       end
  225.       if Input.repeat?(Input::DOWN)
  226.         if (@column_max == 1 and Input.trigger?(Input::DOWN)) or
  227.            @index < @item_max - @column_max
  228.           $game_system.se_play($data_system.cursor_se)
  229.           @index = (@index + @column_max) % @item_max
  230.         end
  231.       end
  232.       if Input.repeat?(Input::UP)
  233.         if (@column_max == 1 and Input.trigger?(Input::UP)) or
  234.            @index >= @column_max
  235.           $game_system.se_play($data_system.cursor_se)
  236.           @index = (@index - @column_max + @item_max) % @item_max
  237.         end
  238.       end
  239.       if Input.repeat?(Input::RIGHT)
  240.         if @column_max >= 2 and @index < @item_max - 1
  241.           $game_system.se_play($data_system.cursor_se)
  242.           @index += 1
  243.         end
  244.       end
  245.       if Input.repeat?(Input::LEFT)
  246.         if @column_max >= 2 and @index > 0
  247.           $game_system.se_play($data_system.cursor_se)
  248.           @index -= 1
  249.         end
  250.       end
  251.       if Input.repeat?(Input::R)
  252.         if self.top_row + (self.page_row_max - 1) < (self.row_max - 1)
  253.           $game_system.se_play($data_system.cursor_se)
  254.           @index = [@index + self.page_item_max, @item_max - 1].min
  255.           self.top_row += self.page_row_max
  256.         end
  257.       end
  258.       if Input.repeat?(Input::L)
  259.         if self.top_row > 0
  260.           $game_system.se_play($data_system.cursor_se)
  261.           @index = [@index - self.page_item_max, 0].max
  262.           self.top_row -= self.page_row_max
  263.         end
  264.       end
  265.     end
  266.     if self.active and @help_window != nil
  267.       update_help
  268.     end
  269.     update_cursor_rect
  270.   end
  271.   def dispose
  272.     @up_sprite.bitmap.dispose
  273.     @up_sprite.dispose
  274.     @dn_sprite.bitmap.dispose
  275.     @dn_sprite.dispose
  276.     super
  277.   end
  278.   def up_page
  279.     if self.top_row > 0
  280.       $game_system.se_play($data_system.cursor_se)
  281.       @index = [@index - self.page_item_max, 0].max
  282.       self.top_row -= self.page_row_max
  283.     end
  284.   end
  285.   def down_page
  286.     if self.top_row + (self.page_row_max - 1) < (self.row_max - 1)
  287.       $game_system.se_play($data_system.cursor_se)
  288.       @index = [@index + self.page_item_max, @item_max - 1].min
  289.       self.top_row += self.page_row_max
  290.     end
  291.   end
  292.   def visible=(visible)
  293.     super(visible)
  294.     @up_sprite.visible = visible
  295.     @dn_sprite.visible = visible
  296.   end
  297. end

复制代码











你知道得太多了

回复

使用道具 举报

Lv2.观梦者

梦石
0
星屑
558
在线时间
256 小时
注册时间
2010-8-25
帖子
371
12
 楼主| 发表于 2011-9-4 16:49:12 | 只看该作者
后知后觉 发表于 2011-8-31 17:54
做了个按钮式的.范例只有核心部分和物品菜单的.
装备、技能、商店的没做




一插入工程就这样
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6860
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

13
发表于 2011-9-5 00:16:46 | 只看该作者
你的工程不只一个地方定义过 Window_Item
因为是改了这个窗口类的父类 所以要把每个定义的地方都改过来
具体搜索
  1. class Window_Item
复制代码











你知道得太多了

回复

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-26 13:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表