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

Project1

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

[已发主站] 【XP】地图式 可传递触发事件 字幕滚动 V1.0版

[复制链接]

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
跳转到指定楼层
1
发表于 2012-5-6 14:15:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 Sion 于 2013-12-17 16:05 编辑

◎前言
某诈尸龙继续来发布 RMXP 新的脚本作品,
发现有时还是得写写,实用性且看得到效果的脚本作品,
会比较有人捧场 XD

前先天,看到这帖子中
http://rpg.blue/thread-162889-1-1.html
某版主大大,提出当前地图下字幕的滚动,
所以大概花了两天去实现效果,
顺便测试俺这几年在实验室长期写C++面对像概念的实力,XD
现在发现对RMXP整体架构,似乎有跟以前完全不一样的感觉了,所有变数都当C中指标去看待了 XD
以前俺写的脚本其实都不是完全明白 =w=
以上

◎效果
# (1) 可以配合地图上的事件或某些特效处理
# (2) 字幕滚动的效果永远会显示在最前面
# (3) 字幕滚动中,能侦测到讯号的传递,藉此触发可以处理一些事情与特效

地圖上的範例 :

配合移动远景脚本的范例 :


配合事件显示图片效果的范例 :



◎脚本
RUBY 代码复制
  1. #==============================================================================
  2. # ■ 地图式 可传递触发事件 字幕滚动 V1.0版  (By TERENCE龙皇)
  3. #------------------------------------------------------------------------------
  4. # 使用效果:
  5. # (1) 可以配合地图上的事件或某些特效处理
  6. # (2) 字幕滚动的效果永远会显示在最前面
  7. # (3) 字幕滚动中,能侦测到事件的传递,藉此触发可以处理一些事情与特效
  8. #
  9. # 如何使用:
  10. # (1) 字幕使用 UTF-8 格式的 TXT 档传写,请放在 Credit 文件夹之下
  11. # (2) TXT 档名,请使用英文,才不会导致不同语言作业系统上读取失败
  12. # (3) 其他部分,详见发布帖子,或研究范例工程
  13. #==============================================================================
  14.  
  15. CREDIT_DETECTE_Y = 240          # 触发侦测线
  16. CREDIT_NONEVISIBLE_HEIGHT = 25  # 字幕上下两侧不可视区域
  17.  
  18. #==============================================================================
  19. # ■ Game_System
  20. #------------------------------------------------------------------------------
  21. #  处理系统附属资料的类别。(扩增字幕)
  22. #  本类别的实例请参考 $game_system。
  23. #==============================================================================
  24. class Game_System
  25.   #--------------------------------------------------------------------------
  26.   # ● 定义实例变数
  27.   #--------------------------------------------------------------------------
  28.   attr_accessor :credit_obj               # 字幕物件暂存
  29.   attr_accessor :credit_working           # 字幕执行中的标志
  30.   attr_accessor :credit_filename          # 读取字幕的TXT档名
  31.   #--------------------------------------------------------------------------
  32.   # ● 初始化物件
  33.   #--------------------------------------------------------------------------
  34.   alias original_initialize initialize
  35.   def initialize
  36.     @credit_working = false
  37.     @credit_filename = ""
  38.     original_initialize
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # ● 字幕启用
  42.   #--------------------------------------------------------------------------
  43.   def credit_start(filename)
  44.     @credit_working = true
  45.     @credit_filename = "Credit/#{filename}.txt"
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 字幕取消
  49.   #--------------------------------------------------------------------------
  50.   def credit_canceled
  51.     if @credit_working
  52.       @credit_obj.y = -(@credit_obj.bitmap_hieght)
  53.     end
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 字幕讯息事件是否被传递
  57.   #--------------------------------------------------------------------------
  58.   def credit_mesgpost?
  59.     # 若启动字幕滚动
  60.     if @credit_working
  61.       # 侦测字幕滚动是否有事件被触发
  62.       if @credit_obj.message_flag
  63.         @credit_obj.message_flag = false
  64.         return true
  65.       else; return false; end
  66.     else; return false; end
  67.   end
  68. end
  69.  
  70. #==============================================================================
  71. # ■ Sprite_Credit
  72. #------------------------------------------------------------------------------
  73. #  显示字幕滚动用的活动区块。监视 $game_system 丶活动区块状态
  74. #  自动变化。
  75. #==============================================================================
  76. class Sprite_Credit < Sprite
  77.   #--------------------------------------------------------------------------
  78.   # ● 定义实例变数
  79.   #--------------------------------------------------------------------------
  80.   attr_accessor :message_flag               # 讯息标志
  81.   attr_accessor :bitmap_hieght              # 字幕高
  82.   #--------------------------------------------------------------------------
  83.   # ● 初始化物件
  84.   #--------------------------------------------------------------------------
  85.   def initialize(viewport)
  86.     super(viewport)
  87.     self.x = 0
  88.     self.y = 430
  89.     self.z = 0
  90.     @new_bitmap_flag = false
  91.     @line_counts = 0
  92.     @bitmap_hieght = 0
  93.     @message_line = []
  94.     @message_flag = false
  95.     update
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 字幕 Bitmap 初始建立
  99.   #--------------------------------------------------------------------------
  100.   def create(filename)
  101.     unless FileTest.exist?(filename)
  102.       $game_system.credit_working = false
  103.       @new_bitmap_flag = false
  104.       @line_counts = 0
  105.       return
  106.     end
  107.     @bitmap_hieght = File.read(filename).count("\n")
  108.     @bitmap_hieght = 32*(1+@bitmap_hieght)
  109.     self.bitmap = Bitmap.new(640, @bitmap_hieght)
  110.     File.open(filename) do |file|
  111.       while line = file.gets
  112.         dump_lines(line)
  113.       end
  114.     end
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   # ● TXT 文件 行处理
  118.   #--------------------------------------------------------------------------
  119.   def dump_lines(line)
  120.     yy = 32*@line_counts
  121.     if (line.gsub!(/\<PostMessage\>/){""})!=nil
  122.       @message_line.push(yy+self.y)
  123.     end
  124.     if @line_counts == 0
  125.       self.bitmap.draw_text(0, yy, 640, 32, line[3, line.size], 1)
  126.     else
  127.       self.bitmap.draw_text(0, yy, 640, 32, line, 1)
  128.     end
  129.     @line_counts += 1
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● 释放
  133.   #--------------------------------------------------------------------------
  134.   def dispose
  135.     if self.bitmap != nil
  136.       self.bitmap.dispose
  137.     end
  138.     super
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● 更新画面
  142.   #--------------------------------------------------------------------------
  143.   def update
  144.     super
  145.     # 设定计时器执行中为可见
  146.     self.visible = $game_system.credit_working
  147.     # 若启动字幕滚动
  148.     if $game_system.credit_working
  149.       unless @new_bitmap_flag
  150.         @new_bitmap_flag = true
  151.         create($game_system.credit_filename)
  152.       end
  153.       scroll_update
  154.       message_detected
  155.     end
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # ● 字幕滚动
  159.   #--------------------------------------------------------------------------
  160.   def scroll_update
  161.     if scroll_end?
  162.       $game_system.credit_working = false
  163.       @new_bitmap_flag = false
  164.       @message_flag = false
  165.       @message_line.clear
  166.       @line_counts = 0
  167.       self.y = 430
  168.       if self.bitmap != nil
  169.         self.bitmap.dispose
  170.       end
  171.     else
  172.       self.y -= 1
  173.     end
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # ● 字幕滚动结束 ?
  177.   #--------------------------------------------------------------------------
  178.   def scroll_end?
  179.     if self.y <= -(@bitmap_hieght)
  180.       return true
  181.     else
  182.       return false
  183.     end
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ● 事件讯息祯测
  187.   #--------------------------------------------------------------------------
  188.   def message_detected
  189.     for i in 0...(@message_line.size)
  190.       if @message_line[i] == nil; break; end
  191.       @message_line[i] -= 1
  192.       if @message_line[i] <= CREDIT_DETECTE_Y-32 # 触发侦测线
  193.         @message_line.delete_at(i)
  194.         @message_flag = true
  195.       end
  196.     end
  197.   end
  198. end
  199.  
  200. #==============================================================================
  201. # ■ Spriteset_Map
  202. #------------------------------------------------------------------------------
  203. #  处理地图画面活动区块和元件的类别。 (扩增字幕)
  204. #  本类别在 Scene_Map 类别的内部使用。
  205. #==============================================================================
  206. class Spriteset_Map
  207.   #--------------------------------------------------------------------------
  208.   # ● 初始化物件
  209.   #--------------------------------------------------------------------------
  210.   alias original_initialize initialize
  211.   def initialize
  212.     # 字幕尚未启动才 生成
  213.     unless $game_system.credit_working
  214.       hh = CREDIT_NONEVISIBLE_HEIGHT
  215.       credit_viewport = Viewport.new(0,hh,640,480-hh*2)
  216.       credit_viewport.z = 5000 + 200
  217.       $game_system.credit_obj = Sprite_Credit.new(credit_viewport)
  218.     end
  219.     original_initialize
  220.   end
  221.   #--------------------------------------------------------------------------
  222.   # ● 释放
  223.   #--------------------------------------------------------------------------
  224.   alias original_dispose dispose
  225.   def dispose
  226.     # 场景非地图 字幕滚动区块可视关闭
  227.     unless $scene.is_a?(Scene_Map)
  228.       $game_system.credit_obj.visible = false
  229.     end
  230.     # 字幕尚未启动才 释放字幕滚动区块
  231.     unless $game_system.credit_working
  232.       # 释放显示连接埠
  233.       $game_system.credit_obj.viewport.dispose
  234.       $game_system.credit_obj.dispose
  235.     end
  236.     original_dispose
  237.   end
  238.   #--------------------------------------------------------------------------
  239.   # ● 更新画面
  240.   #--------------------------------------------------------------------------
  241.   alias original_update update
  242.   def update
  243.     # 更新字幕滚动区块
  244.     $game_system.credit_obj.update
  245.     # 更新显示连接埠
  246.     $game_system.credit_obj.viewport.update
  247.     original_update
  248.   end
  249. end


◎范例工程
http://115.com/file/c2ahgfxj
本人使用繁体环境开发,若有乱码困扰,请使用APP开启工程

◎後记
本人是从 Spriteset_Map 类别里动土
追加 Sprite_Credit 字幕的精灵类

控制的话是使用
Game_System类别的实例 $game_system 上动手

整个设计的过程,大概最伤脑筋的事情,就是释放物件的问题了
在地图场景转换下不能 释放 Sprite_Credit 和 Viewport视口类
但必要时又得 释放这些 东西
如果有发现 没有释放的地方 或 BUG
回报一下

不过目前还没制作出像 多功能字幕滚动
那麽丰富的 字串和图片功能
有兴趣的人,整合去吧 XD

而且 场所以动後(切换地图),
有画面过度时,字幕滚动会停止一下再滚
不使用画面过度,没有问题,滚动比较自然
估计必须 实做 Graphics 类的内容

若有想使用画面过度换地图的朋友,以下提供思路
不使用画面过度,但能达到比较婉转方式,换地图的效果
##
要换场景前,又事件一张全黑的图片 淡入 先遮挡
到新地图时,然後再淡出 删除图片

评分

参与人数 2星屑 +1000 +6 收起 理由
Shy07 + 6 主站收录
Kimu + 1000 诈尸美

查看全部评分


                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说

Lv2.观梦者

梦石
0
星屑
681
在线时间
791 小时
注册时间
2011-10-20
帖子
2394

开拓者

2
发表于 2012-5-6 23:15:18 手机端发表。 | 只看该作者
娃哈哈,字母在非地图场景就会停止
我估计
你需要把sprite从map_spritest里放在graphics update里

点评

恩呵呵~ 没错呢,这本来就是给地图用的,字幕播放中,且非地图时,可视关闭 沒有释放,我故意不更新的 XXD  发表于 2012-5-7 01:06
欢迎点此进入我的egames.wink.ws,有RMQQ堂等

[url=http://rpg.blue/thread-317273-1-1.html]短篇八-赶选

http://yun.baidu.com/share/link?shareid=2158225779&uk=169642147&third=0


历险ARPG赢回你的疆域新的战斗模式?…………点击这里:[宋乱贼狂 for QQ堂]
http://rpg.blue/group-368-1.html
programing ....?
[url=http://rpg.blue/thrd-234658-1-1.html]
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (超级版主)

嗜谎者

梦石
2
星屑
16547
在线时间
3892 小时
注册时间
2010-9-12
帖子
9635

极短24评委极短23评委极短22评委极短21评委开拓者

3
发表于 2012-5-7 00:36:36 | 只看该作者
先支持个~等待BUG更正。。。(虽然几乎不用XP)

点评

注意,此帖略水  发表于 2012-5-8 11:32
那我就先用着啦~  发表于 2012-5-7 01:13
有BUG的话请说出是啥吧 ^^:::,俺目前說的只是场景过度会有停一下的缺陷,不太能算是BUG的一种 XD (不过大体应该已经够用才是  发表于 2012-5-7 01:13
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
4
 楼主| 发表于 2012-5-7 13:51:08 | 只看该作者
真頭疼
現在才發現
Ruby 代碼 帖上去 竟然給我 在189行 自動加上 [email] 的 字樣 = ="


現在已經更正成
for i in 0...(@message_line.size)

不加個 括弧 給我自動當成 E-mail 的地址了
真自動 = =

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-27 01:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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