查看: 2932|回复: 1

[原创发布] 【教程】手把手教你制作个能按左右键翻页的简易书本脚本

[复制链接]
梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
发表于 2022-6-17 23:44:42 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 alexncf125 于 2025-8-3 10:33 编辑

首先,每一本书,最最最基本,有 一个书名 和 每一页的內容。为方便调用, 每一页会有个页数。

第一步,写个module, 其中1234和2468是每本书有显示內容的页数
[pre lang="ruby"]module Book_System
  
  Books_Library = []
  
  Books_Library[1] = {:book_title => "天下第一书", :page_content => []}
  Books_Library[1][:page_content][1] = "test1\r\ntest1\r\ntest1"
  Books_Library[1][:page_content][2] = "test2\r\ntest2\r\ntest2"
  Books_Library[1][:page_content][3] = "test3\r\ntest3\r\ntest3"
  Books_Library[1][:page_content][4] = "test4\r\ntest4\r\ntest4"
   
  Books_Library[2] = {:book_title => "天下第2书", :page_content => []}
  Books_Library[2][:page_content][2] = "test5\r\ntest5\r\ntest5"
  Books_Library[2][:page_content][4] = "test6\r\ntest6\r\ntest6"
  Books_Library[2][:page_content][6] = "test7\r\ntest7\r\ntest7"
  Books_Library[2][:page_content][8] = "test8\r\ntest8\r\ntest8"
  
end[/pre]


第二步, 复制一个Window_Help, 首先改一下窗口的类名字, 接着改默认行数成1, 最后改一下set_item的称呼 和 定义改成
book输入Books_Library[1]时
会返回Books_Library[1][:book_tltie]
即"天下第一书"
[pre lang="ruby"]class Window_Book_Title < Window_Base
  
  def initialize(line_number = 1)
    super(0, 0, Graphics.width, fitting_height(line_number))
  end
  
  def set_text(text)
    if text != @text
      @text = text
      refresh
    end
  end
  
  def clear
    set_text("")
  end
  
  def set_title(book)
    set_text(book ? book[:book_title] : "")
  end
  
  def refresh
    contents.clear
    draw_text_ex(4, 0, @text)
  end
end
[/pre]


第三步, 再复制一个Window_Help, 同样改一下窗口的类名字, 改默认行数成12, 窗口width除2, 改set_item的称呼 和 定义改成
book输入Books_Library[1]及
index输入3时
会返回Books_Library[1][:page_content][3]
即"test3\r\ntest3\r\ntest3"
[pre lang="ruby"]class Window_Book_Left < Window_Base
  
  def initialize(line_number = 12)
    super(0, 0, Graphics.width / 2, fitting_height(line_number))
  end
  
  def set_text(text)
    if text != @text
      @text = text
      refresh
    end
  end
  
  def clear
    set_text("")
  end
  
  def set_content(book, index)
    set_text(book ? book[:page_content][index] : "")
  end
  
  def refresh
    contents.clear
    draw_text_ex(4, 0, @text)
  end
end[/pre]



第四步, 复制一个第三步建的窗口, 改一下窗口的类名字
[pre lang="ruby"]class Window_Book_Right < Window_Base
  
  def initialize(line_number = 12)
    super(0, 0, Graphics.width / 2, fitting_height(line_number))
  end
  
  def set_text(text)
    if text != @text
      @text = text
      refresh
    end
  end
  
  def clear
    set_text("")
  end
  
  def set_content(book, index)
    set_text(book ? book[:page_content][index] : "")
  end
  
  def refresh
    contents.clear
    draw_text_ex(4, 0, @text)
  end
end[/pre]



第五步
复制一个Window_Status
也是先改一下窗口的类名字
再把Graphics.height学第一步的窗口改成fitting_height(line_number)
之后先复制一下第124行的draw_text_ex(x, y, @actor.description)
接着删掉第31-37行及第39-125行用不到的內容,
删好后, 在第30行contents.clear下方贴上两次刚复制的第124行, 再改一下两页页数的显示位置和描绘內容(数字),
将actor全改成pages, 最后去Window_Selectable抄一下第296-302行, 加上按下左右键时的调用
[pre lang="ruby"]class Window_Book_Page < Window_Selectable
  
  def initialize(pages, line_number = 1)
    super(0, 0, Graphics.width, fitting_height(line_number))
    @pages = pages
    refresh
    activate
  end
  
  def pages=(pages)
    return if @pages == pages
    @pages = pages
    refresh
  end
  
  def refresh
    contents.clear
    draw_text_ex(0, 0, @pages[0].to_s)
    draw_text_ex(500, 0, @pages[1].to_s)
  end
  
  def process_handling
    return unless open? && active
    return process_ok       if ok_enabled?        && Input.trigger?(:C)
    return process_cancel   if cancel_enabled?    && Input.trigger?(:B)
    return process_pagedown if handle?(:pagedown) && Input.trigger?(:R)
    return process_pageup   if handle?(:pageup)   && Input.trigger?(:L)
    return process_pagedown if handle?(:pagedown) && Input.trigger?(:RIGHT)
    return process_pageup   if handle?(:pageup)   && Input.trigger?(:LEFT)
  end
  
end[/pre]



最后一步, 也是本教程最复杂的一步, 就是写个Scene把上面4个窗口塞进去显示出来, 和加两段左右翻页的処理。
1. 不用多说, 先来个class Scene_Book < Scene_MenuBase end
2. 让第一步写的module能被调用, 加行include Book_System
3. 抄一下Scene_Shop的def prepare和def start和def create_xxxxx_window
4.在def create_page_window末加上那堆set_handler
5.最后加上两段左右翻页的処理
6.写段refresh在翻页后刷新一下各窗口的內容
[pre lang="ruby"]class Scene_Book < Scene_MenuBase
  
  include Book_System
  
  def prepare(book_id)
    @book_id = book_id
    @book = Book_System::Books_Library[book_id]
    @pages = [1, 2]
  end
  
  def start
    super
    create_title_window
    create_left_window
    create_right_window
    create_page_window
  end
  
  def create_title_window
    @title_window = Window_Book_Title.new
    @title_window.viewport = @viewport
    @title_window.x = 0
    @title_window.y = 0
    @title_window.set_title(@book)
  end
  
  def create_left_window
    @left_window = Window_Book_Left.new
    @left_window.viewport = @viewport
    @left_window.x = 0
    @left_window.y = @title_window.height
    @left_window.set_content(@book, @pages[0])
  end
  
  def create_right_window
    @right_window = Window_Book_Right.new
    @right_window.viewport = @viewport
    @right_window.x = @left_window.width
    @right_window.y = @title_window.height
    @right_window.set_content(@book, @pages[1])
  end
  
  def create_page_window
    @page_window = Window_Book_Page.new(@pages)
    @page_window.viewport = @viewport
    @page_window.x = 0
    @page_window.y = Graphics.height - @page_window.height
    @page_window.pages = @pages
    @page_window.set_handler(:pageup,    method(:prev_page))
    @page_window.set_handler(:pagedown,   method(:next_page))
    @page_window.set_handler(:cancel, method(:return_scene))
  end
  
  def prev_page
    return @page_window.activate if @pages == [1, 2]
    new_pages = []
    @pages.each {|index| new_pages.push(index - 2)}
    @pages = new_pages
    refresh
  end
  
  def next_page
    if @book.nil? || #<=修正打开了不存在的书本时, 出现按翻页键会报错的情況(范例没更新)
    @pages[1] == @book[:page_content].size || #<=修正书本为单数页数时, 出现不停按右键会无限翻页的情況(范例没更新)
    @pages == [@book[:page_content].size - 2, @book[:page_content].size - 1]
      return @page_window.activate
    end
    new_pages = []
    @pages.each {|index| new_pages.push(index + 2)}
    @pages = new_pages
    refresh
  end

  def refresh
    @left_window.set_content(@book, @pages[0])
    @right_window.set_content(@book, @pages[1])
    @page_window.pages = @pages
    @page_window.activate
  end
  
end[/pre]



大功告成~~~ 简易书本脚本.rar (1.41 MB, 下载次数: 62)

调出书本界面~抄Game_Interpreter第1143-1144行
SceneManager.call(Scene_Book)
SceneManager.scene.prepare(书本id)
书本id就是第一步module的1或2

20250803更新上传翻书页动画帧
BOOK_ANI.part1.rar (1 MB, 下载次数: 3)
BOOK_ANI.part2.rar (1 MB, 下载次数: 1)
BOOK_ANI.part3.rar (1 MB, 下载次数: 1)
BOOK_ANI.part4.rar (1 MB, 下载次数: 2)
BOOK_ANI.part5.rar (88.16 KB, 下载次数: 2)

评分

参与人数 5星屑 +250 赞 +4 收起 理由
YUKA_LE + 1 塞糖
KB.Driver + 1 精品文章
VIPArcher + 250 原创发布
哇哇哇啊叭叭 + 1 塞糖
百里_飞柳 + 1 精品文章

查看全部评分

梦石
0
星屑
12824
在线时间
1010 小时
注册时间
2019-11-5
回帖
2329

极短27参与极短25参与极短24参与

发表于 2022-6-19 07:54:27 | 显示全部楼层
火钳刘明。嗯...突然发现已经很久没见过这句话了
风继续吹,不忍远离。年少轻狂,眼神明亮,最好的年纪,最好的时光。希望岁月是一场春梦
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部