Project1

标题: [VA] 书籍阅读系统 Ver.1.0 [打印本页]

作者: 柍若    时间: 2014-2-10 05:43
标题: [VA] 书籍阅读系统 Ver.1.0
本帖最后由 柍若 于 2014-2-10 05:57 编辑

呃……写完才发现好像原来就有一个了_(:з」∠)_
不过那个看起来设置很麻烦的样子,这款应该能简单一点
脚本自由性还算比较高吧XD


灵感来自剑网三 【注意不是复刻基三的阅读系统!只是个简易版。
以下书籍文字抄自基三





  1. #==============================================================================
  2. # ■ 书籍阅读系统 Ver.1.0  - By 柍若
  3. #------------------------------------------------------------------------------
  4. #
  5. # [使用方法]
  6. # 使用add_book("书名")的指令来获得书籍。
  7. #
  8. # 书名必须与下列设置相应的书名保持一致。
  9. # ★请注意,如果书名要用控制符,则add_book("")内的书名也要有控制符。
  10. #
  11. #------------------------------------------------------------------------------
  12. # 当阅读一本书名在下列没有设置相应内容的书籍时,不会显示阅读窗口。
  13. #------------------------------------------------------------------------------
  14. #
  15. # [界面调出方法]
  16. # SceneManager.call(Scene_Book)
  17. #==============================================================================

  18. module Read
  19.   Variable = 2        # 表示已获得书目的游戏变量,这是为了使已获得的书目与存档同步。
  20.                       # 请填入一个游戏中无用的、且不会随意改变的变量。
  21.   
  22.   Cancel = true       # 是否有“返回”的选项(还可以直接通过B键退出阅读)
  23.   CancelName = "取消" # 还可以是放弃、返回之类的
  24.   
  25.   Width = 304         # 书目窗口的宽度
  26.   Height = 8          # 最高显示的行数(书目窗口高度)
  27.   
  28.   
  29.   SE = "Book2"        # 阅读窗口翻页播放的SE
  30.   TextWidth = 544     # 阅读窗口的宽度
  31.   Line_MAX = 12       # 阅读窗口显示多少行文本
  32.   
  33.   NoBook = "暂无书目"  # 没书的时候显示的文本
  34.   
  35. #------------------------------------------------------------------------------
  36.   # 在这里设置书籍。
  37. #==============================================================================

  38.   # 书名 => 书的内容  ,可用控制符,(控制符打两个\,如\\c[2]),
  39.   #                                 内容文本暂不支持自动换行。
  40.   #       尝试过一些前辈的自动换行算法,发现不兼容这个阅读系统。
  41.   # 开学之后有空自己会写一个来更新脚本。最近玩RM花了太多时间了= =b
  42.          
  43.   #                                     多本书之间用逗号隔开。
  44.          
  45.   Book = {
  46.   
  47. "《\\c[1]\\i[392]剑部第一\\c[0]》" =>
  48. "    剑篇

  49. \\c[2]【龙剑】\\c[0]晋库走龙剑,吴室荡燕雏。翠帷双卷出
  50.     顷城,龙剑破匣双月明。
  51. \\c[2]【照胆】\\c[0]武丁在位五十九年,以元年岁次午铸一
  52.     剑,长三尺,铭曰「照胆」,古文篆书。
  53. \\c[2]【金剑】\\c[0]章帝建初八年,铸金剑令投于伊水中,
  54.     以压人膝之怪。
  55. \\c[2]【王氏剑】\\c[0]王氏剑,天下利器也。
  56. \\c[2]【大剑】\\c[0]周太祖出镇魏州,弘肇议带枢密以行,
  57.     苏逢吉场邻以为不可,弘肇恨之,明日
  58.     会饮窦贞固第,弘肇曰:『安朝庭定祸
  59.     乱,直须长剑大剑,若毛锥子安足用哉
  60.     。』
  61. \\c[2]【隋刃】\\c[0]亦名浪剑。剑身用毒药炼铸,伤人即死
  62.     。隋刃,铸时以毒药并冶,取迎曜如星
  63.     者,凡十年用成,淬以马血,以金犀饰
  64.     镡首,伤人即死。浪人所铸故亦名浪剑。
  65. \\c[2]【浪人剑】\\c[0]为浪人所铸。贞观元十年九月辛卯,
  66.      南诏献锋槊、浪人剑。亦名『浪剑』。
  67. \\c[2]【疥痨宾】\\c[0]古代剑名。
  68. \\c[2]【青霜】\\c[0]古代名剑。此剑之剑光青凛若霜雪,故
  69.     名。
  70. \\c[2]【鸦九剑】\\c[0]剑师张鸦九所造之剑。欧治子死千年
  71.      后,精灵暗授张鸦九,鸦九铸剑吴山
  72.      中,天与日时神借功。
  73. \\c[2]【灵宝剑】\\c[0]钱塘闻人绍,一剑削十大钉皆截,剑
  74.      无纤迹;用力屈之如钩,纵之铿锵有
  75.      声,复直如弦。古之所谓灵宝剑也。
  76. \\c[2]【裴旻剑】\\c[0]利剑。
  77. \\c[2]【破山剑】\\c[0]古名剑。有农夫耕地得剑,磨洗适市
  78.      ,值贾胡售以百千,未可,至百万,
  79.      约来日取之。夜归语妻子,此何异而
  80.      价至。是庭中有石,偶以剑指之,立
  81.      碎。诘旦,胡人载镪呈,则叹叱曰:
  82.      剑光已尽,不复买。农夫苦问之。曰
  83.      :是破山剑,唯一可用,吾欲持之破
  84.      宝山耳。
  85. \\c[2]【青蛇】\\c[0]古剑名。",


  86. "《\\c[2]太公家教\\c[0]第一章》" =>
  87. "  愤能积恶,必须忍之;心能造恶,必须净之
  88. ;口能招祸,必须慎之。见人善事,必须赞之;
  89. 见人恶事,必须掩之。邻有灾难,必须救之;见
  90. 人打门,即须谏之;意欲去处,即须番之;见人
  91. 不是,即须教之;非是时流,即须避之。罗网之
  92. 鸟,悔不高飞;吞钩之鱼,恨不忍饥;人生误计
  93. ,恨不三思;祸将及已,恨不忍之。
  94.     其父出行,子须从后;路逢尊者,齐脚敛手
  95. ;尊人之前,不得唾地;尊人赐酒,必须拜寿;
  96. 尊人赐肉,骨不与狗;尊者赐果,怀核在手,苦
  97. 也弃之,为礼大丑。对客之前,不得垂涕,亦不
  98. 漱口。记而莫忘,终身无咎。立身之本,义让为
  99. 先。贱莫与交,贵莫与亲。他奴莫与语,他婢莫
  100. 与言。衰败之家,慎莫为婚;市道接利,莫与为
  101. 邻。敬上爱下,泛爱尊贤,孤儿寡妇,特可矜怜。",


  102. "《万花茶典·上篇》" =>
  103. "    \\c[6]茶之造\\c[0]

  104.     采茶最佳时节在二月、三月、四月之间。然
  105. 不同茶品却又有差别,茶笋始抽为最佳。
  106.     初发嫩芽,凌露采之。丛薄之上,有三枝、
  107. 四枝者,择枝颖拔者采。知行大师有曰:
  108.     日有雨不采,晴有云不采;然,天有风云。

  109.     料不及,严守此法之人不多也!
  110.     所采茶叶须迅即蒸之,捣之,拍之,焙之,
  111. 穿之,封之,茶干而成饼,不可耽搁一刻。

  112.     造茶器具多有如下。

  113.     \\c[2]甑子\\c[0]:或木或瓦,周框封以泥,内中放竹篮
  114. 为甑箪,以竹篾系牢。始蒸茶叶,
  115.     将其放入内篮,既熟,取箪,待甑中无水,
  116. 再倒入茶叶,以木枝三叉者拌之。散所蒸茶叶,
  117. 畏流其膏。
  118.     \\c[2]杵臼\\c[0]:捣茶所用,又名碓,恒用者佳。
  119.     \\c[2]贯\\c[0]:削竹为之,穿茶以焙之。

  120.     炙烤茶饼勿于风烬间,风吹焰火飘忽不定,
  121. 使茶炎凉不均。是以逼火而烤,
  122.     翻动不止,待出虾蟆背状,去火五寸续烤之
  123. 。若叶卷而舒,复烤之,其法如前所述。

  124.     造茶之初,若茶也至嫩者,蒸熟即热捣,叶
  125. 烂而笋存。即便为力大者持千钧杵捣之亦不能烂。",


  126. "测试之书" =>
  127. "控制符测试:\\c[2]红色文字\\c[0]
  128. 显示1号变量:\\v[1]
  129. 显示1号主角的名字:\\n[1]
  130. 描绘一个图标:1000\\i[361]",


  131. "书名" =>
  132. "内容",


  133. }
  134. #==============================================================================
  135. end

  136. class Scene_Book < Scene_MenuBase
  137.   def start
  138.     super
  139.     create_command_window
  140.   end
  141.   def update
  142.     update_basic
  143.     if @booktext_window.visible
  144.       if Input.trigger?(:B) or Input.trigger?(:C)
  145.         @booktext_window.terminate_text
  146.         @command_window.active = true
  147.       elsif Input.trigger?(:R)
  148.         @booktext_window.pagedown
  149.       elsif Input.trigger?(:L)
  150.         @booktext_window.pageup
  151.       end
  152.     end
  153.   end
  154.   def pre_terminate
  155.     super
  156.     returnn
  157.   end
  158.   def create_background
  159.     super
  160.     @background_sprite.tone.set(0, 0, 0, 128)
  161.   end
  162.   def create_command_window
  163.     @command_window = Window_Book.new
  164.     @command_window.set_handler(:book, method(:read))
  165.     @command_window.set_handler(:cancel, method(:return_scene))
  166.     @booktext_window = Window_BookRead.new
  167.   end
  168.   def read
  169.     text = Read::Book[@command_window.current_ext]
  170.     @booktext_window.addmasage = text if text
  171.     @command_window.active = true unless text
  172.   end
  173.   def returnn
  174.     @command_window.close
  175.     @booktext_window.close
  176.     update until @command_window.close?
  177.   end
  178. end
  179. class Window_Book < Window_Command
  180.   def initialize
  181.     super(0, 0)
  182.     update_placement
  183.     self.openness = 0
  184.     open
  185.   end
  186.   def window_width
  187.     return Read::Width
  188.   end
  189.   def update_placement
  190.     self.x = (Graphics.width - width) / 2
  191.     self.y = (Graphics.height - height) / 2
  192.   end
  193.   def draw_item(index)
  194.     change_color(normal_color, command_enabled?(index))
  195.     rect = item_rect_for_text(index)
  196.     text = convert_escape_characters(command_name(index))
  197.     pos = {:x => rect.x, :y => rect.y, :new_x => rect.x, :height => calc_line_height(text)}
  198.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  199.   end
  200.   def make_command_list
  201.     if $game_variables[Read::Variable] == 0
  202.       add_command(Read::NoBook, :no_book, false)
  203.     else
  204.       for i in 0..$game_variables[Read::Variable].size-1
  205.         bookname = $game_variables[Read::Variable][i]
  206.         add_command(bookname, :book, true, bookname)
  207.       end
  208.     end
  209.     add_command(Read::CancelName, :cancel) if Read::Cancel
  210.   end
  211.   def window_height
  212.     if item_max <= Read::Height
  213.       fitting_height(visible_line_number)
  214.     else
  215.       fitting_height(Read::Height)
  216.     end
  217.   end
  218. end
  219. def add_book(name)
  220.   $game_variables[Read::Variable] = [] if $game_variables[Read::Variable] == 0
  221.   $game_variables[Read::Variable][$game_variables[Read::Variable].size] = name
  222. end
  223. class Window_BookRead < Window_Base
  224.   def initialize
  225.     super(0, 0, Read::TextWidth, Read::Line_MAX*line_height)
  226.     update_placement
  227.     self.arrows_visible = false
  228.     hide
  229.   end
  230.   def update_placement
  231.     self.x = (Graphics.width - width) / 2
  232.     self.y = (Graphics.height - height) / 2
  233.   end
  234.   def pagedown
  235.     oy = self.oy
  236.     if self.oy + (Read::Line_MAX-1)*line_height < contents.height
  237.       self.oy += (Read::Line_MAX-1)*line_height
  238.       Audio.se_play('Audio/SE/'+Read::SE,80,100) unless self.oy == oy
  239.     end
  240.   end
  241.   def pageup
  242.     oy = self.oy
  243.     if self.oy != 0
  244.       self.oy -= (Read::Line_MAX-1)*line_height
  245.       Audio.se_play('Audio/SE/'+Read::SE,80,100) unless self.oy == oy
  246.     end
  247.   end
  248.   def start_message
  249.     refresh
  250.     show
  251.   end
  252.   def addmasage=(text)
  253.     @text = text
  254.     start_message
  255.   end
  256.   def refresh
  257.     self.oy = 0
  258.     reset_font_settings
  259.     update_all_text_height
  260.     create_contents
  261.     draw_text_ex(4, 0, @text)
  262.   end
  263.   def update_all_text_height
  264.     @all_text_height = 0
  265.     convert_escape_characters(@text).each_line do |line|
  266.       @all_text_height += calc_line_height(line, false)
  267.     end
  268.     reset_font_settings
  269.   end
  270.   def contents_height
  271.     @all_text_height ? @all_text_height : super
  272.   end
  273.   def terminate_text
  274.     @text = nil
  275.     hide
  276.   end
  277. end
复制代码
得到书籍的运用:
比如说,阅读某个地方的碑文或者看到谁的日记啦,看完之后这本书就被收录到书籍系统里,下次进入可以看到所有看过的书。
或者得到什么帮助文件啦,国家历史啦之类的物品,使用之后执行公共事件来获得书本以便阅读。
古剑2的水月镜花也有点类似这种get→重复阅读的模式,不过人家的UI更漂亮啦←_←
用法脚本里应该写的够清楚了嗯……不多说了,大家自由发挥XD(好像没什么可发挥的空间啊_(:з」∠)_

⊙▽⊙范例送上,不过我有点穷,嗯。←_←
只要看得懂脚本的其实完全没必要下载范例啦。
书籍阅读系统.zip (1.44 MB, 下载次数: 161, 售价: 2 星屑)


——————题外话分割线
不要问俺为什么起这么早……(╯‵□′)╯︵┻━┻老子一晚上通宵撸作业就没睡A!!
T_T初三狗好苦逼啊好苦逼!!!
作者: 天使喝可乐    时间: 2014-2-10 09:02
推荐去掉透明度 影响阅读
另外在标头加上标题和页数显示
作者: 余烬之中    时间: 2014-2-10 09:50
本帖最后由 余烬之中 于 2014-2-10 12:23 编辑

书籍系统……我也写过一个
本来打算这个寒假进行大更新 简化输入 支持外部载入 加载外部图片  整合Fuky对话框什么的  后来各种闹心就耽搁了
等回糖了再塞糖
=================
这个寒假大概是不更新了
http://rpg.blue/thread-337128-1-1.html
@kuerlulu  
作者: 喵呜喵5    时间: 2014-2-10 13:28
回复楼上点评

换行可以通过比较draw_text_ex的pos[:x]和当前窗口的宽度来实现
作者: 余烬之中    时间: 2014-2-10 13:55
换行的话首先去掉源文本的换行符*

然后描绘文字的时候(WindowBase里面的方法draw_text_ex内部找得到)比较@pos[:x]和窗口宽度 超出就换行

需要手动换行的时候就要加上特定的转义字符*

* 如果这些操作不执行 那么每个段落都必须写在一行 否则会出现很难看的效果
作者: nemoma    时间: 2014-3-5 13:41
本帖最后由 nemoma 于 2014-3-5 14:08 编辑

与其在脚本里面定义书的内容,为什么不定义在作为物品的书的备注栏里面呢,这样和其他的物品相关增强脚本组合感觉会更好一点。

回点评1:大概还是能写下很多字的吧。
我这里用了一个图鉴系统,所以肯定要写一大堆字的。

当然我这个是Steam的正版,如果旧版的字数有限制当我没说,至少我现在几百字的中文都没碰上限制……

另外:好快!

更新,已经测试过了,输入了6600+字的文本,没有遇到任何问题。
作者: 柍若    时间: 2014-3-5 18:40
nemoma 发表于 2014-3-5 13:41
与其在脚本里面定义书的内容,为什么不定义在作为物品的书的备注栏里面呢,这样和其他的物品相关增强脚本组 ...

书不是以物品形式存在的呀……事件脚本指令直接取得,如果要物品得书也要执行公共事件,实在和数据库的物品没有直接联系,所以这些备注也不知道写在哪个物品里呢。
而且脚本编辑器与备注栏各有利弊,编辑器窗口更大,而备注栏每到一定字数就会显示成自动换行,很影响直观地手动对齐。
作者: 柍若    时间: 2015-8-19 23:25
  1. def delete_book(name)
  2.   a = 0
  3.   v = []
  4.   for i in 0..($game_variables[Read::Variable].size-1)
  5.     while $game_variables[Read::Variable][i+a] == name
  6.       a += 1
  7.     end
  8.     v[i] = $game_variables[Read::Variable][i+a] unless $game_variables[Read::Variable][i+a].nil?
  9.   end
  10.   $game_variables[Read::Variable] = v
  11. end
复制代码
更新一个删除得到的书的指令。
通过事件脚本调用。
delete_book(name)


直接插入即可,位置随意。




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