查看: 1420|回复: 5

[已经过期] 用了地图式字幕脚本之后不能存档!

[复制链接]
梦石
0
星屑
2605
在线时间
896 小时
注册时间
2011-4-30
回帖
108

开拓者

发表于 2013-12-12 22:37:43 | 显示全部楼层 |阅读模式

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

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

×
[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 = 53  # 字幕上下两侧不可视区域

#==============================================================================
# ■ 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 = "Audio/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]
会提示no marshal_dump is defined for class Sprite_Credit

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
发表于 2013-12-12 23:54:35 | 显示全部楼层
本帖最后由 英顺的马甲 于 2013-12-12 23:56 编辑
  1. class Game_System
  2.   def _dump(*args)
  3.     self.credit_obj = nil
  4.     return Marshal.dump(self)
  5.   end
  6.   def self._load(str)
  7.     s = Marshal.load(self)
  8.     self.credit_obj = Sprite_Credit.new
  9.     return s
  10.   end
  11. end
复制代码
此脚本未经测试,是否有效有待验证==
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到engshun@1ppl.me咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复

使用道具 举报

梦石
0
星屑
2605
在线时间
896 小时
注册时间
2011-4-30
回帖
108

开拓者

 楼主| 发表于 2013-12-13 12:16:35 | 显示全部楼层
英顺的马甲 发表于 2013-12-12 23:54
此脚本未经测试,是否有效有待验证==

return Marshal.dump(self)显示stack level too deep

点评

我这里每次都这样!  发表于 2013-12-14 10:09
咋可能啊,我毫无压力地存档了=w=  发表于 2013-12-14 00:23
回复

使用道具 举报

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
发表于 2013-12-13 13:19:20 | 显示全部楼层
本帖最后由 英顺的马甲 于 2013-12-13 13:22 编辑
mariofans 发表于 2013-12-13 12:16
return Marshal.dump(self)显示stack level too deep


那就换一个好了==
  1. class Sprite_Credit
  2.   def _dump(*args)
  3.     return Marshal.dump([@message_flag,@bitmap_hieght ])
  4.   end
  5.   def self._load(str)
  6.     sc = self.new
  7.     sc.message_flag,sc.bitmap_hieght = *Marshal.load(str)
  8.     return sc
  9.   end
  10. end
复制代码

点评

no marshal_dump is defined for class Viewport……  发表于 2013-12-13 13:46
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到engshun@1ppl.me咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复

使用道具 举报

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
发表于 2013-12-13 16:56:06 | 显示全部楼层
mariofans 发表于 2013-12-13 12:16
return Marshal.dump(self)显示stack level too deep
  1. class Scene_Save
  2.   alias orig_wsd write_save_data unless defined?(orig_wsd)
  3.   def write_save_data(file)
  4.     $game_system.credit_obj = nil
  5.     orig_wsd(file)
  6.   end
  7. end
  8. class Scene_Load
  9.   alias orig_rsd read_save_data unless defined?(orig_rsd)
  10.   def read_save_data(file)
  11.     orig_rsd(file)
  12.     $game_system.credit_obj = Sprite_Credit.new
  13.   end
  14. end
复制代码

点评

no marshal_dump is defined for class Sprite_Credit………………你还是直接改脚本吧……  发表于 2013-12-13 18:22
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到engshun@1ppl.me咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复

使用道具 举报

○赛

梦石
0
星屑
1254
在线时间
1276 小时
注册时间
2013-1-22
回帖
2078

贵宾

发表于 2013-12-15 19:23:01 | 显示全部楼层
你用了其他脚本么?
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部