查看: 2830|回复: 7

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

[复制链接]

秀才

梦石
0
星屑
587
在线时间
156 小时
注册时间
2008-7-23
回帖
233

贵宾

发表于 2021-11-19 21:05:45 | 显示全部楼层 |阅读模式
悬赏100星屑已解决
[pre lang="ruby"]#-------------------------------------------------------------------------------
    # ·(改)图书馆  By 退屈£无聊
    #-------------------------------------------------------------------------------
    # 呃。无聊写个东西玩先。 Update V1.02
    # 介绍说明。音乐的设置格式 @music* = [名称,文件名, 简介],注意文字要加引号!
    # 加了歌的话,在调用choose_music也要注意了。
    # 相信也应该制作完成了吧。没有BUG了吧-0-。
    $是否退出关闭音乐 = true
    #-------------------------------------------------------------------------------
    class Scene_Dictionary
    #===================================================
    # ·主过程
    #===================================================
      def main
        @music1 = ["鸦片", " ", "又叫阿片,俗称大烟,源于罂粟植物蒴果,属毒品。17世纪末到18世纪中叶,由于英国在同中国的贸易中长期出于入超地位,因此英国学生会默许了不法商贩走私鸦片到中国的行为。鸦片不但造成了中国大量的白银外流,而且摧残了中国人民的身体和意志。"]
        @music2 = ["虎门销烟", " ", "1839年6月,中国清朝学生会委任钦差大臣林则徐在广东虎门集中销毁鸦片的历史事件。此事后来成为第一次鸦片战争的导火线。1839年6月3日(清宣宗道光十九年岁次己亥四月廿二),林则徐下令在虎门海滩当众销毁鸦片,至6月25日结束,共历时23天,销毁鸦片19187箱和2119袋,总重量2376254斤。虎门销烟成为打击毒品的历史事件,维护了中华民族的尊严和利益。"]
        @music3 = ["测试", "", ""]
        @music4 = ["测试", "", ""]
        @music5 = ["测试", "", ""]
        @music6 = ["测试", "", ""]
        @music7 = ["测试", "", ""]
        @music8 = ["测试", "", ""]
        @music9 = ["测试", "", ""]
        @music10 = ["测试", "", ""]
        @music11 = ["测试", "", ""]
        @music12 = ["测试", "", ""]
        @music13 = ["测试", "", ""]
        @music14 = ["测试", "", ""]
        @music15 = ["测试", "", ""]
        @music16 = ["测试", "", ""]
        @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]])
        @music_command.x = 0
        @music_command.y = 0
        @music_command.opacity = 150
        @music_command.z = 9999
        @help_window = Window_DictionaryHelp.new
        @help_window.x = 200
        @help_window.y = 0
        @help_window.width = 440
        @help_window.height = 480
        @help_window.opacity = 150
        @help_window.z = 9999
        # 执行过渡
        Graphics.transition
        # 主循环
        loop do
          # 刷新游戏画面
          Graphics.update
          # 刷新输入信息
          Input.update
          # 刷新画面
          choose_music([@music1,@music2,@music3,@music4,@music5,@music6,@music7,@music8, @music9,@music10,@music11,@music12,@music13,@music14,@music15,@music16]) # 音乐如果有填加,不要忘了在这里填加!
          # 如果画面被切换的话就中断循环
          if $scene != self
            break
          end
        end
        # 准备过渡
        Graphics.freeze
        # 释放窗口
        @music_command.dispose
        @help_window.dispose
      end
    #==========================================================================
    # ·选歌过程
    #==========================================================================
    def choose_music(music)
      @music_command.update
      @help_window.update
      @musicfile = music
      if Input.trigger?(Input::B)
        $scene = Scene_Map.new
        if $是否退出关闭音乐
        $game_map.autoplay
        end
      end
      @help_window.draw_music("#{@musicfile[@music_command.index][2]}")
    end
    #===========================透明部分==================================
    module XRXS_MP7_Module
      def create_spriteset
        @spriteset = Spriteset_Map.new
      end
      def dispose_spriteset
        @spriteset.dispose
      end
    end
    include XRXS_MP7_Module
      alias xrxs_mp7_main main
      def main
        create_spriteset
        xrxs_mp7_main
        dispose_spriteset
      end
    #=========不需要的删到这里为止======================
  end
    #==============================================================================
    # ■ Window_Music
    #------------------------------------------------------------------------------
    #  音乐简介显示窗口。
    #==============================================================================

    class Window_DictionaryHelp < Window_Base
      #--------------------------------------------------------------------------
      # ● 初始化对像
      #--------------------------------------------------------------------------
      def initialize
        super(240, 0, 400, 480)
        self.contents = Bitmap.new(self.width - 32, self.height - 32)
      end
      #--------------------------------------------------------------------------
      # ● 描绘音乐
      #--------------------------------------------------------------------------
      def draw_music(music)
        self.contents.clear
        # 记录文字x坐标
        x = 0
        # 记录文字y坐标
        y = 0
        # 记录换行时y坐标最小加值
        min_y = 0
        self.contents.font.color = normal_color
        # 描绘音乐简介
        text = music
        # 限制文字处理
        begin
          last_text = text.clone
          text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
        end until text == last_text
        text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
          $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
        end
        # c 获取 1 个字 (如果不能取得文字就循环)
        while ((c = text.slice!(/./m)) != nil)
          # 另起一行文字的情况下
          if c == "\n"
            y += [32, min_y].max
            min_y = 0
            x = 0
            # 下面的文字
            next
          end
          # 自动换行处理
          if x + self.contents.text_size(c).width > self.contents.width
            y += [32, min_y].max
            min_y = 0
            x = 0
          end
          # 描绘文字
          self.contents.draw_text(4 + x, y, 40, 32, c)
          # x 为要描绘文字的加法运算
          x += self.contents.text_size(c).width
        end
      end
    end[/pre]

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

最佳答案

查看完整内容

见下方脚本。 原先是根据 Window_Command 生成列表的,这个类是用于生成命令窗口,不适合做成带翻页的列表窗口。 要实现翻页功能必须自己写一个类似 Window_Item 的窗口。 顺便修了一下右侧说明窗口反复刷新导致 FPS 骤降的问题。 用法有变化,根据已经有的代码进行仿写即可。 [pre lang="ruby"]#------------------------------------------------------------------------------- # ·(改)图书馆 By 退屈£无聊 #-------- ...
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2021-11-19 21:05:46 | 显示全部楼层
见下方脚本。

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

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

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

[pre lang="ruby"]#-------------------------------------------------------------------------------
# ·(改)图书馆  By 退屈£无聊
#-------------------------------------------------------------------------------
# 呃。无聊写个东西玩先。 Update V1.02
# 介绍说明。音乐的设置格式 @music* = [名称,文件名, 简介],注意文字要加引号!
# 加了歌的话,在调用choose_music也要注意了。
# 相信也应该制作完成了吧。没有BUG了吧-0-。
$是否退出关闭音乐 = true
#------------------------------------------------------------------------------
module RPG
  class Dict
    attr_accessor :name
    attr_accessor :descr
    def initialize(n, d)
      @name = n
      @descr = d
    end
  end
  def self.init_dicts
    data = []
    # 设置数据
    # 要增加一项就仿照下面的写法编写即可
    data << Dict.new("鸦片", "又叫阿片,俗称大烟,源于罂粟植物蒴果,属毒品。17世纪末到18世纪中叶,由于英国在同中国的贸易中长期出于入超地位,因此英国学生会默许了不法商贩走私鸦片到中国的行为。鸦片不但造成了中国大量的白银外流,而且摧残了中国人民的身体和意志。")
    data << Dict.new("虎门销烟", "1839年6月,中国清朝学生会委任钦差大臣林则徐在广东虎门集中销毁鸦片的历史事件。此事后来成为第一次鸦片战争的导火线。1839年6月3日(清宣宗道光十九年岁次己亥四月廿二),林则徐下令在虎门海滩当众销毁鸦片,至6月25日结束,共历时23天,销毁鸦片19187箱和2119袋,总重量2376254斤。虎门销烟成为打击毒品的历史事件,维护了中华民族的尊严和利益。")
    data << Dict.new("测试", "1")
    data << Dict.new("测试", "2")
    data << Dict.new("测试", "3")
    data << Dict.new("测试", "4")
    data << Dict.new("测试", "5")
    data << Dict.new("测试", "6")
    data << Dict.new("测试", "7")
    data << Dict.new("测试", "8")
    data << Dict.new("测试", "9")
    data << Dict.new("测试", "a")
    data << Dict.new("测试", "b")
    data << Dict.new("测试", "c")
    data << Dict.new("测试", "d")
    data << Dict.new("测试", "e")
    #----------------- 所有增加的数据在此行之上
    data
  end
end

class Scene_Dictionary
#===================================================
# ·主过程
#===================================================
  def main
    if $data_dicts.nil?
      $data_dicts = RPG.init_dicts
    end
    @list_window = Window_DictionaryList.new
    @help_window = Window_DictionaryHelp.new
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面被切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @list_window.dispose
    @help_window.dispose
  end
#==========================================================================
# ·选歌过程
#==========================================================================
def update
  @list_window.update
  @help_window.update
  @help_window.set(@list_window.item)
  if Input.trigger?(Input::B)
    $scene = Scene_Map.new
    if $是否退出关闭音乐
      $game_map.autoplay
    end
  end
end
#===========================透明部分==================================
module XRXS_MP7_Module
  def create_spriteset
    @spriteset = Spriteset_Map.new
  end
  def dispose_spriteset
    @spriteset.dispose
  end
end
include XRXS_MP7_Module
  alias xrxs_mp7_main main
  def main
    create_spriteset
    xrxs_mp7_main
    dispose_spriteset
  end
#=========不需要的删到这里为止======================
end
class Window_DictionaryList < Window_Selectable
  def initialize
    super(0, 0, 200, 480)
    self.opacity = 150
    self.z = 9999
    self.index = 0
    @column_max = 1
    refresh
  end
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @item_max = $data_dicts.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, @item_max * 32)
      $data_dicts.each_with_index do |item, i|
        x = 4
        y = 32 * i
        self.contents.draw_text(x, y, width - 32, 32, item.name)
      end
    end
  end
  def item
    return $data_dicts[self.index]
  end
end
  
#==============================================================================
# ■ Window_Music
#------------------------------------------------------------------------------
#  音乐简介显示窗口。
#==============================================================================

class Window_DictionaryHelp < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(200, 0, 440, 480)
    self.contents = Bitmap.new(self.width - 32, self.height - 32)
    self.z = 9999
    self.opacity = 150
    @item = nil
  end
  def set(item)
    if @item != item
      @item = item
      refresh
    end
  end
   
  #--------------------------------------------------------------------------
  # ● 描绘音乐
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    # 如果列表为空就不描绘
    if @item.nil?
      return
    end
    # 记录文字x坐标
    x = 0
    # 记录文字y坐标
    y = 0
    # 记录换行时y坐标最小加值
    min_y = 0
    self.contents.font.color = normal_color
    # 描绘音乐简介
    text = @item.descr.clone
    # 限制文字处理
    begin
      last_text = text.clone
      text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
    end until text == last_text
    text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
      $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
    end
    # c 获取 1 个字 (如果不能取得文字就循环)
    while ((c = text.slice!(/./m)) != nil)
      # 另起一行文字的情况下
      if c == "\n"
        y += [32, min_y].max
        min_y = 0
        x = 0
        # 下面的文字
        next
      end
      # 自动换行处理
      if x + self.contents.text_size(c).width > self.contents.width
        y += [32, min_y].max
        min_y = 0
        x = 0
      end
      # 描绘文字
      self.contents.draw_text(4 + x, y, 40, 32, c)
      # x 为要描绘文字的加法运算
      x += self.contents.text_size(c).width
    end
  end
end[/pre]

点评

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

评分

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

查看全部评分

回复

使用道具 举报

秀才

梦石
0
星屑
587
在线时间
156 小时
注册时间
2008-7-23
回帖
233

贵宾

 楼主| 发表于 2021-11-19 21:11:35 | 显示全部楼层
词条太多后就会出现这种溢出的情况。
QQ截图20211119210749.png
回复

使用道具 举报

梦石
0
星屑
8026
在线时间
1051 小时
注册时间
2012-4-3
回帖
1270

开拓者

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

评分

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

查看全部评分

回复

使用道具 举报

秀才

梦石
0
星屑
587
在线时间
156 小时
注册时间
2008-7-23
回帖
233

贵宾

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

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

使用道具 举报

梦石
0
星屑
8026
在线时间
1051 小时
注册时间
2012-4-3
回帖
1270

开拓者

发表于 2021-11-19 23:52:25 | 显示全部楼层
z121310 发表于 2021-11-19 21:58
请问您能否提供一个范例,感激不尽!

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

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

使用道具 举报

秀才

梦石
0
星屑
587
在线时间
156 小时
注册时间
2008-7-23
回帖
233

贵宾

 楼主| 发表于 2021-11-20 23:15:19 | 显示全部楼层
RyanBern 发表于 2021-11-20 15:07
见下方脚本。

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

谢谢大佬 !
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部