查看: 3392|回复: 3

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

[复制链接]

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
回帖
2623
发表于 2012-5-6 14:15:48 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 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) 字幕滚动中,能侦测到讯号的传递,藉此触发可以处理一些事情与特效

地圖上的範例 :
001.png
配合移动远景脚本的范例 :
004.png
005.png
配合事件显示图片效果的范例 :
002.png
003.png

◎脚本
[pre lang="ruby" line="1"]#==============================================================================
# ■ 地图式 可传递触发事件 字幕滚动 V1.0版  (By TERENCE龙皇)
#------------------------------------------------------------------------------
# 使用效果:
# (1) 可以配合地图上的事件或某些特效处理
# (2) 字幕滚动的效果永远会显示在最前面
# (3) 字幕滚动中,能侦测到事件的传递,藉此触发可以处理一些事情与特效
#
# 如何使用:
# (1) 字幕使用 UTF-8 格式的 TXT 档传写,请放在 Credit 文件夹之下
# (2) TXT 档名,请使用英文,才不会导致不同语言作业系统上读取失败
# (3) 其他部分,详见发布帖子,或研究范例工程
#==============================================================================

CREDIT_DETECTE_Y = 240          # 触发侦测线
CREDIT_NONEVISIBLE_HEIGHT = 25  # 字幕上下两侧不可视区域

#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
#  处理系统附属资料的类别。(扩增字幕)
#  本类别的实例请参考 $game_system。
#==============================================================================
class Game_System
  #--------------------------------------------------------------------------
  # ● 定义实例变数
  #--------------------------------------------------------------------------
  attr_accessor :credit_obj               # 字幕物件暂存
  attr_accessor :credit_working           # 字幕执行中的标志
  attr_accessor :credit_filename          # 读取字幕的TXT档名
  #--------------------------------------------------------------------------
  # ● 初始化物件
  #--------------------------------------------------------------------------
  alias original_initialize initialize
  def initialize
    @credit_working = false
    @credit_filename = ""
    original_initialize
  end
  #--------------------------------------------------------------------------
  # ● 字幕启用
  #--------------------------------------------------------------------------
  def credit_start(filename)
    @credit_working = true
    @credit_filename = "Credit/#{filename}.txt"
  end
  #--------------------------------------------------------------------------
  # ● 字幕取消
  #--------------------------------------------------------------------------
  def credit_canceled
    if @credit_working
      @credit_obj.y = -(@credit_obj.bitmap_hieght)
    end
  end
  #--------------------------------------------------------------------------
  # ● 字幕讯息事件是否被传递
  #--------------------------------------------------------------------------
  def credit_mesgpost?
    # 若启动字幕滚动
    if @credit_working
      # 侦测字幕滚动是否有事件被触发
      if @credit_obj.message_flag
        @credit_obj.message_flag = false
        return true
      else; return false; end
    else; return false; end
  end
end

#==============================================================================
# ■ Sprite_Credit
#------------------------------------------------------------------------------
#  显示字幕滚动用的活动区块。监视 $game_system 丶活动区块状态
#  自动变化。
#==============================================================================
class Sprite_Credit < Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变数
  #--------------------------------------------------------------------------
  attr_accessor :message_flag               # 讯息标志
  attr_accessor :bitmap_hieght              # 字幕高
  #--------------------------------------------------------------------------
  # ● 初始化物件
  #--------------------------------------------------------------------------
  def initialize(viewport)
    super(viewport)
    self.x = 0
    self.y = 430
    self.z = 0
    @new_bitmap_flag = false
    @line_counts = 0
    @bitmap_hieght = 0
    @message_line = []
    @message_flag = false
    update
  end
  #--------------------------------------------------------------------------
  # ● 字幕 Bitmap 初始建立
  #--------------------------------------------------------------------------
  def create(filename)
    unless FileTest.exist?(filename)
      $game_system.credit_working = false
      @new_bitmap_flag = false
      @line_counts = 0
      return
    end
    @bitmap_hieght = File.read(filename).count("\n")
    @bitmap_hieght = 32*(1+@bitmap_hieght)
    self.bitmap = Bitmap.new(640, @bitmap_hieght)
    File.open(filename) do |file|
      while line = file.gets
        dump_lines(line)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● TXT 文件 行处理
  #--------------------------------------------------------------------------
  def dump_lines(line)
    yy = 32*@line_counts
    if (line.gsub!(/\<PostMessage\>/){""})!=nil
      @message_line.push(yy+self.y)
    end
    if @line_counts == 0
      self.bitmap.draw_text(0, yy, 640, 32, line[3, line.size], 1)
    else
      self.bitmap.draw_text(0, yy, 640, 32, line, 1)
    end
    @line_counts += 1
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 设定计时器执行中为可见
    self.visible = $game_system.credit_working
    # 若启动字幕滚动
    if $game_system.credit_working
      unless @new_bitmap_flag
        @new_bitmap_flag = true
        create($game_system.credit_filename)
      end
      scroll_update
      message_detected
    end
  end
  #--------------------------------------------------------------------------
  # ● 字幕滚动
  #--------------------------------------------------------------------------
  def scroll_update
    if scroll_end?
      $game_system.credit_working = false
      @new_bitmap_flag = false
      @message_flag = false
      @message_line.clear
      @line_counts = 0
      self.y = 430
      if self.bitmap != nil
        self.bitmap.dispose
      end
    else
      self.y -= 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 字幕滚动结束 ?
  #--------------------------------------------------------------------------
  def scroll_end?
    if self.y <= -(@bitmap_hieght)
      return true
    else
      return false
    end
  end
  #--------------------------------------------------------------------------
  # ● 事件讯息祯测
  #--------------------------------------------------------------------------
  def message_detected
    for i in 0...(@message_line.size)
      if @message_line == nil; break; end
      @message_line -= 1
      if @message_line <= CREDIT_DETECTE_Y-32 # 触发侦测线
        @message_line.delete_at(i)
        @message_flag = true
      end
    end
  end
end

#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
#  处理地图画面活动区块和元件的类别。 (扩增字幕)
#  本类别在 Scene_Map 类别的内部使用。
#==============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● 初始化物件
  #--------------------------------------------------------------------------
  alias original_initialize initialize
  def initialize
    # 字幕尚未启动才 生成
    unless $game_system.credit_working
      hh = CREDIT_NONEVISIBLE_HEIGHT
      credit_viewport = Viewport.new(0,hh,640,480-hh*2)
      credit_viewport.z = 5000 + 200
      $game_system.credit_obj = Sprite_Credit.new(credit_viewport)
    end
    original_initialize
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  alias original_dispose dispose
  def dispose
    # 场景非地图 字幕滚动区块可视关闭
    unless $scene.is_a?(Scene_Map)
      $game_system.credit_obj.visible = false
    end
    # 字幕尚未启动才 释放字幕滚动区块
    unless $game_system.credit_working
      # 释放显示连接埠
      $game_system.credit_obj.viewport.dispose
      $game_system.credit_obj.dispose
    end
    original_dispose
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  alias original_update update
  def update
    # 更新字幕滚动区块
    $game_system.credit_obj.update
    # 更新显示连接埠
    $game_system.credit_obj.viewport.update
    original_update
  end
end[/pre]

◎范例工程
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专题空间--龙使传说
梦石
0
星屑
752
在线时间
800 小时
注册时间
2011-10-20
回帖
2257

开拓者

发表于 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]
回复

使用道具 举报

嗜谎者

梦石
4
星屑
19316
在线时间
4012 小时
注册时间
2010-9-12
回帖
9248

超评测评委极短28评委极短27评委MZ评测员极短26评委极短25评委极短24评委极短23评委极短22评委极短21评委开拓者

发表于 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
回复

使用道具 举报

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
回帖
2623
 楼主| 发表于 2012-5-7 13:51:08 | 显示全部楼层
真頭疼
現在才發現
Ruby 代碼 帖上去 竟然給我 在189行 自動加上 [email] 的 字樣 = ="


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

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

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

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部