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

Project1

 找回密码
 注册会员
搜索
查看: 2135|回复: 7
打印 上一主题 下一主题

[已经解决] 请问这个脚本如何实现翻页换行?

[复制链接]

Lv2.观梦者

秀才

梦石
0
星屑
592
在线时间
156 小时
注册时间
2008-7-23
帖子
290

贵宾

跳转到指定楼层
1
发表于 2021-11-19 21:05:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
100星屑
RUBY 代码复制
  1. #-------------------------------------------------------------------------------
  2.     # ·(改)图书馆  By 退屈£无聊
  3.     #-------------------------------------------------------------------------------
  4.     # 呃。无聊写个东西玩先。 Update V1.02
  5.     # 介绍说明。音乐的设置格式 @music* = [名称,文件名, 简介],注意文字要加引号!
  6.     # 加了歌的话,在调用choose_music也要注意了。
  7.     # 相信也应该制作完成了吧。没有BUG了吧-0-。
  8.     $是否退出关闭音乐 = true
  9.     #-------------------------------------------------------------------------------
  10.     class Scene_Dictionary
  11.     #===================================================
  12.     # ·主过程
  13.     #===================================================
  14.       def main
  15.         @music1 = ["鸦片", " ", "又叫阿片,俗称大烟,源于罂粟植物蒴果,属毒品。17世纪末到18世纪中叶,由于英国在同中国的贸易中长期出于入超地位,因此英国学生会默许了不法商贩走私鸦片到中国的行为。鸦片不但造成了中国大量的白银外流,而且摧残了中国人民的身体和意志。"]
  16.         @music2 = ["虎门销烟", " ", "1839年6月,中国清朝学生会委任钦差大臣林则徐在广东虎门集中销毁鸦片的历史事件。此事后来成为第一次鸦片战争的导火线。1839年6月3日(清宣宗道光十九年岁次己亥四月廿二),林则徐下令在虎门海滩当众销毁鸦片,至6月25日结束,共历时23天,销毁鸦片19187箱和2119袋,总重量2376254斤。虎门销烟成为打击毒品的历史事件,维护了中华民族的尊严和利益。"]
  17.         @music3 = ["测试", "", ""]
  18.         @music4 = ["测试", "", ""]
  19.         @music5 = ["测试", "", ""]
  20.         @music6 = ["测试", "", ""]
  21.         @music7 = ["测试", "", ""]
  22.         @music8 = ["测试", "", ""]
  23.         @music9 = ["测试", "", ""]
  24.         @music10 = ["测试", "", ""]
  25.         @music11 = ["测试", "", ""]
  26.         @music12 = ["测试", "", ""]
  27.         @music13 = ["测试", "", ""]
  28.         @music14 = ["测试", "", ""]
  29.         @music15 = ["测试", "", ""]
  30.         @music16 = ["测试", "", ""]
  31.         @music_command = Window_Command.new(200, [@music1[0], @music2[0], @music3[0], @music4[0], @music5[0], @music6[0], @music7[0], @music8[0], @music9[0], @music10[0], @music11[0], @music12[0], @music13[0], @music14[0], @music15[0], @music16[0]])
  32.         @music_command.x = 0
  33.         @music_command.y = 0
  34.         @music_command.opacity = 150
  35.         @music_command.z = 9999
  36.         @help_window = Window_DictionaryHelp.new
  37.         @help_window.x = 200
  38.         @help_window.y = 0
  39.         @help_window.width = 440
  40.         @help_window.height = 480
  41.         @help_window.opacity = 150
  42.         @help_window.z = 9999
  43.         # 执行过渡
  44.         Graphics.transition
  45.         # 主循环
  46.         loop do
  47.           # 刷新游戏画面
  48.           Graphics.update
  49.           # 刷新输入信息
  50.           Input.update
  51.           # 刷新画面
  52.           choose_music([@music1,@music2,@music3,@music4,@music5,@music6,@music7,@music8, @music9,@music10,@music11,@music12,@music13,@music14,@music15,@music16]) # 音乐如果有填加,不要忘了在这里填加!
  53.           # 如果画面被切换的话就中断循环
  54.           if $scene != self
  55.             break
  56.           end
  57.         end
  58.         # 准备过渡
  59.         Graphics.freeze
  60.         # 释放窗口
  61.         @music_command.dispose
  62.         @help_window.dispose
  63.       end
  64.     #==========================================================================
  65.     # ·选歌过程
  66.     #==========================================================================
  67.     def choose_music(music)
  68.       @music_command.update
  69.       @help_window.update
  70.       @musicfile = music
  71.       if Input.trigger?(Input::B)
  72.         $scene = Scene_Map.new
  73.         if $是否退出关闭音乐
  74.         $game_map.autoplay
  75.         end
  76.       end
  77.       @help_window.draw_music("#{@musicfile[@music_command.index][2]}")
  78.     end
  79.     #===========================透明部分==================================
  80.     module XRXS_MP7_Module
  81.       def create_spriteset
  82.         @spriteset = Spriteset_Map.new
  83.       end
  84.       def dispose_spriteset
  85.         @spriteset.dispose
  86.       end
  87.     end
  88.     include XRXS_MP7_Module
  89.       alias xrxs_mp7_main main
  90.       def main
  91.         create_spriteset
  92.         xrxs_mp7_main
  93.         dispose_spriteset
  94.       end
  95.     #=========不需要的删到这里为止======================
  96.   end
  97.     #==============================================================================
  98.     # ■ Window_Music
  99.     #------------------------------------------------------------------------------
  100.     #  音乐简介显示窗口。
  101.     #==============================================================================
  102.  
  103.     class Window_DictionaryHelp < Window_Base
  104.       #--------------------------------------------------------------------------
  105.       # ● 初始化对像
  106.       #--------------------------------------------------------------------------
  107.       def initialize
  108.         super(240, 0, 400, 480)
  109.         self.contents = Bitmap.new(self.width - 32, self.height - 32)
  110.       end
  111.       #--------------------------------------------------------------------------
  112.       # ● 描绘音乐
  113.       #--------------------------------------------------------------------------
  114.       def draw_music(music)
  115.         self.contents.clear
  116.         # 记录文字x坐标
  117.         x = 0
  118.         # 记录文字y坐标
  119.         y = 0
  120.         # 记录换行时y坐标最小加值
  121.         min_y = 0
  122.         self.contents.font.color = normal_color
  123.         # 描绘音乐简介
  124.         text = music
  125.         # 限制文字处理
  126.         begin
  127.           last_text = text.clone
  128.           text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  129.         end until text == last_text
  130.         text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  131.           $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  132.         end
  133.         # c 获取 1 个字 (如果不能取得文字就循环)
  134.         while ((c = text.slice!(/./m)) != nil)
  135.           # 另起一行文字的情况下
  136.           if c == "\n"
  137.             y += [32, min_y].max
  138.             min_y = 0
  139.             x = 0
  140.             # 下面的文字
  141.             next
  142.           end
  143.           # 自动换行处理
  144.           if x + self.contents.text_size(c).width > self.contents.width
  145.             y += [32, min_y].max
  146.             min_y = 0
  147.             x = 0
  148.           end
  149.           # 描绘文字
  150.           self.contents.draw_text(4 + x, y, 40, 32, c)
  151.           # x 为要描绘文字的加法运算
  152.           x += self.contents.text_size(c).width
  153.         end
  154.       end
  155.     end


这本来是个音乐播放脚本,被改成了类似百科查阅一类的脚本,但是当词条数量太多(超过16个)以后,屏幕上便会溢出而不能正常显示,请问如何给它添加一个向下自动翻页的功能?

最佳答案

查看完整内容

见下方脚本。 原先是根据 Window_Command 生成列表的,这个类是用于生成命令窗口,不适合做成带翻页的列表窗口。 要实现翻页功能必须自己写一个类似 Window_Item 的窗口。 顺便修了一下右侧说明窗口反复刷新导致 FPS 骤降的问题。 用法有变化,根据已经有的代码进行仿写即可。 #------------------------------------------------------------------------------- # ·(改)图书馆 By 退屈£无聊 #------------------------- ...

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

2
发表于 2021-11-19 21:05:46 | 只看该作者
见下方脚本。

原先是根据 Window_Command 生成列表的,这个类是用于生成命令窗口,不适合做成带翻页的列表窗口。
要实现翻页功能必须自己写一个类似 Window_Item 的窗口。

顺便修了一下右侧说明窗口反复刷新导致 FPS 骤降的问题。

用法有变化,根据已经有的代码进行仿写即可。

RUBY 代码复制
  1. #-------------------------------------------------------------------------------
  2. # ·(改)图书馆  By 退屈£无聊
  3. #-------------------------------------------------------------------------------
  4. # 呃。无聊写个东西玩先。 Update V1.02
  5. # 介绍说明。音乐的设置格式 @music* = [名称,文件名, 简介],注意文字要加引号!
  6. # 加了歌的话,在调用choose_music也要注意了。
  7. # 相信也应该制作完成了吧。没有BUG了吧-0-。
  8. $是否退出关闭音乐 = true
  9. #------------------------------------------------------------------------------
  10. module RPG
  11.   class Dict
  12.     attr_accessor :name
  13.     attr_accessor :descr
  14.     def initialize(n, d)
  15.       @name = n
  16.       @descr = d
  17.     end
  18.   end
  19.   def self.init_dicts
  20.     data = []
  21.     # 设置数据
  22.     # 要增加一项就仿照下面的写法编写即可
  23.     data << Dict.new("鸦片", "又叫阿片,俗称大烟,源于罂粟植物蒴果,属毒品。17世纪末到18世纪中叶,由于英国在同中国的贸易中长期出于入超地位,因此英国学生会默许了不法商贩走私鸦片到中国的行为。鸦片不但造成了中国大量的白银外流,而且摧残了中国人民的身体和意志。")
  24.     data << Dict.new("虎门销烟", "1839年6月,中国清朝学生会委任钦差大臣林则徐在广东虎门集中销毁鸦片的历史事件。此事后来成为第一次鸦片战争的导火线。1839年6月3日(清宣宗道光十九年岁次己亥四月廿二),林则徐下令在虎门海滩当众销毁鸦片,至6月25日结束,共历时23天,销毁鸦片19187箱和2119袋,总重量2376254斤。虎门销烟成为打击毒品的历史事件,维护了中华民族的尊严和利益。")
  25.     data << Dict.new("测试", "1")
  26.     data << Dict.new("测试", "2")
  27.     data << Dict.new("测试", "3")
  28.     data << Dict.new("测试", "4")
  29.     data << Dict.new("测试", "5")
  30.     data << Dict.new("测试", "6")
  31.     data << Dict.new("测试", "7")
  32.     data << Dict.new("测试", "8")
  33.     data << Dict.new("测试", "9")
  34.     data << Dict.new("测试", "a")
  35.     data << Dict.new("测试", "b")
  36.     data << Dict.new("测试", "c")
  37.     data << Dict.new("测试", "d")
  38.     data << Dict.new("测试", "e")
  39.     #----------------- 所有增加的数据在此行之上
  40.     data
  41.   end
  42. end
  43.  
  44. class Scene_Dictionary
  45. #===================================================
  46. # ·主过程
  47. #===================================================
  48.   def main
  49.     if $data_dicts.nil?
  50.       $data_dicts = RPG.init_dicts
  51.     end
  52.     @list_window = Window_DictionaryList.new
  53.     @help_window = Window_DictionaryHelp.new
  54.     # 执行过渡
  55.     Graphics.transition
  56.     # 主循环
  57.     loop do
  58.       # 刷新游戏画面
  59.       Graphics.update
  60.       # 刷新输入信息
  61.       Input.update
  62.       # 刷新画面
  63.       update
  64.       # 如果画面被切换的话就中断循环
  65.       if $scene != self
  66.         break
  67.       end
  68.     end
  69.     # 准备过渡
  70.     Graphics.freeze
  71.     # 释放窗口
  72.     @list_window.dispose
  73.     @help_window.dispose
  74.   end
  75. #==========================================================================
  76. # ·选歌过程
  77. #==========================================================================
  78. def update
  79.   @list_window.update
  80.   @help_window.update
  81.   @help_window.set(@list_window.item)
  82.   if Input.trigger?(Input::B)
  83.     $scene = Scene_Map.new
  84.     if $是否退出关闭音乐
  85.       $game_map.autoplay
  86.     end
  87.   end
  88. end
  89. #===========================透明部分==================================
  90. module XRXS_MP7_Module
  91.   def create_spriteset
  92.     @spriteset = Spriteset_Map.new
  93.   end
  94.   def dispose_spriteset
  95.     @spriteset.dispose
  96.   end
  97. end
  98. include XRXS_MP7_Module
  99.   alias xrxs_mp7_main main
  100.   def main
  101.     create_spriteset
  102.     xrxs_mp7_main
  103.     dispose_spriteset
  104.   end
  105. #=========不需要的删到这里为止======================
  106. end
  107. class Window_DictionaryList < Window_Selectable
  108.   def initialize
  109.     super(0, 0, 200, 480)
  110.     self.opacity = 150
  111.     self.z = 9999
  112.     self.index = 0
  113.     @column_max = 1
  114.     refresh
  115.   end
  116.   def refresh
  117.     if self.contents != nil
  118.       self.contents.dispose
  119.       self.contents = nil
  120.     end
  121.     @item_max = $data_dicts.size
  122.     if @item_max > 0
  123.       self.contents = Bitmap.new(width - 32, @item_max * 32)
  124.       $data_dicts.each_with_index do |item, i|
  125.         x = 4
  126.         y = 32 * i
  127.         self.contents.draw_text(x, y, width - 32, 32, item.name)
  128.       end
  129.     end
  130.   end
  131.   def item
  132.     return $data_dicts[self.index]
  133.   end
  134. end
  135.  
  136. #==============================================================================
  137. # ■ Window_Music
  138. #------------------------------------------------------------------------------
  139. #  音乐简介显示窗口。
  140. #==============================================================================
  141.  
  142. class Window_DictionaryHelp < Window_Base
  143.   #--------------------------------------------------------------------------
  144.   # ● 初始化对像
  145.   #--------------------------------------------------------------------------
  146.   def initialize
  147.     super(200, 0, 440, 480)
  148.     self.contents = Bitmap.new(self.width - 32, self.height - 32)
  149.     self.z = 9999
  150.     self.opacity = 150
  151.     @item = nil
  152.   end
  153.   def set(item)
  154.     if @item != item
  155.       @item = item
  156.       refresh
  157.     end
  158.   end
  159.  
  160.   #--------------------------------------------------------------------------
  161.   # ● 描绘音乐
  162.   #--------------------------------------------------------------------------
  163.   def refresh
  164.     self.contents.clear
  165.     # 如果列表为空就不描绘
  166.     if @item.nil?
  167.       return
  168.     end
  169.     # 记录文字x坐标
  170.     x = 0
  171.     # 记录文字y坐标
  172.     y = 0
  173.     # 记录换行时y坐标最小加值
  174.     min_y = 0
  175.     self.contents.font.color = normal_color
  176.     # 描绘音乐简介
  177.     text = @item.descr.clone
  178.     # 限制文字处理
  179.     begin
  180.       last_text = text.clone
  181.       text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  182.     end until text == last_text
  183.     text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  184.       $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  185.     end
  186.     # c 获取 1 个字 (如果不能取得文字就循环)
  187.     while ((c = text.slice!(/./m)) != nil)
  188.       # 另起一行文字的情况下
  189.       if c == "\n"
  190.         y += [32, min_y].max
  191.         min_y = 0
  192.         x = 0
  193.         # 下面的文字
  194.         next
  195.       end
  196.       # 自动换行处理
  197.       if x + self.contents.text_size(c).width > self.contents.width
  198.         y += [32, min_y].max
  199.         min_y = 0
  200.         x = 0
  201.       end
  202.       # 描绘文字
  203.       self.contents.draw_text(4 + x, y, 40, 32, c)
  204.       # x 为要描绘文字的加法运算
  205.       x += self.contents.text_size(c).width
  206.     end
  207.   end
  208. end

点评

另外有个排行榜系统的问题想请教您,不知道您有没有空?  发表于 2021-11-21 00:03

评分

参与人数 1星屑 +150 收起 理由
guoxiaomi + 150 RB醋瞎

查看全部评分

回复

使用道具 举报

Lv2.观梦者

秀才

梦石
0
星屑
592
在线时间
156 小时
注册时间
2008-7-23
帖子
290

贵宾

3
 楼主| 发表于 2021-11-19 21:11:35 | 只看该作者
词条太多后就会出现这种溢出的情况。

QQ截图20211119210749.png (50.67 KB, 下载次数: 35)

QQ截图20211119210749.png
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7921
在线时间
1049 小时
注册时间
2012-4-3
帖子
1271

开拓者

4
发表于 2021-11-19 21:38:26 手机端发表。 | 只看该作者
这个脚本似乎没有考虑到翻页的情况,就是一个单面窗口承载可控数量的音乐。
有两个即兴的思路:
1.参考item界面,把音乐当作是item物件以默认提供的翻页方式进行;
2.整个窗口面整翻,每一面的音乐都是预设好的位置。可以手动加个快捷键或者提供一个按钮进行翻页触发。
更多的留给楼下补充吧~

评分

参与人数 1星屑 +30 收起 理由
guoxiaomi + 30 塞糖

查看全部评分

回复

使用道具 举报

Lv2.观梦者

秀才

梦石
0
星屑
592
在线时间
156 小时
注册时间
2008-7-23
帖子
290

贵宾

5
 楼主| 发表于 2021-11-19 21:58:06 | 只看该作者
Im剑侠客 发表于 2021-11-19 21:38
这个脚本似乎没有考虑到翻页的情况,就是一个单面窗口承载可控数量的音乐。
有两个即兴的思路:
1.参考item ...

请问您能否提供一个范例,感激不尽!
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7921
在线时间
1049 小时
注册时间
2012-4-3
帖子
1271

开拓者

6
发表于 2021-11-19 23:52:25 | 只看该作者
z121310 发表于 2021-11-19 21:58
请问您能否提供一个范例,感激不尽!

毕竟不是专业的脚本选手,不过既然你问到了范例,那么在专业选手入场之前。再给你提供两个“自己动手丰衣足食”的方法。
1.如果你需要的翻页效果是竖向1字型的话,可以适当参考一些现成的范例,比如:存档栏位破限99个,把本是存档编号名称替换成音乐的名字,以及按原来脚本需要改造成播放功能即可;

2.更简单的,保留当前的整页形态的编制,然后以新的场景(scene)作为新的一页,比如原脚本class Scene_Dictionary,可以加点后缀,成为第二个/第n个单独的音乐页,只是实际翻页会在入口处作功课,这个可以遵循原有的方式自行增加,或者手动以事件的方式进行选页,从而进入某一特定的音乐页。
好吧,我就说这么多了吧。
热爱生命,相信未来。
回复

使用道具 举报

Lv2.观梦者

秀才

梦石
0
星屑
592
在线时间
156 小时
注册时间
2008-7-23
帖子
290

贵宾

7
 楼主| 发表于 2021-11-20 23:15:19 | 只看该作者
RyanBern 发表于 2021-11-20 15:07
见下方脚本。

原先是根据 Window_Command 生成列表的,这个类是用于生成命令窗口,不适合做成带翻页的列表 ...

谢谢大佬 !
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 11:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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