Project1
标题:
收~~~滚动字幕的脚本,在下不会写,求一个~~~
[打印本页]
作者:
hubaobao
时间:
2010-8-10 11:03
提示:
作者被禁止或删除 内容自动屏蔽
作者:
仲秋启明
时间:
2010-8-10 11:05
#==============================================================================
# ★ 加强型字幕脚本(VX)
#------------------------------------------------------------------------------
# by 八云 紫
#==============================================================================
=begin
写在前面:
脚本有点点复杂, 使用时请仔细看看本说明.
使用说明:
1. 请将脚本放到 Main 之前,设定后即可使用
2. 设定部分的说明请看 Credit_Config 模块的说明
3. 有什么 BUG , 请联系咱, 6R ID 是 八云紫
4. 有什么建议也请联系咱
=end
=begin
字幕快捷命令说明:
1. <C,r,g,b>文字</C> 或者 <c,r,g,b>文字</c>
文字变色, 其中 C/c 属于关键字, 必须有. r,g,b 是三原色的值, 十六进制
比如 <c,FF,AB,3D>文字</C>
2. <g,x,y>文字</g> 或者 <G,x,y>文字</G>
文字阴影, G/g 属于关键字, 必须有. x, y 为阴影文字对于主文字的偏移坐标
比如 <G,3,3>文字</g>
3. <p,name> 或者 <P,name>
显示图片, P/p 属于关键字, 必须有. name 是图片的文件名, 不包含 "" 部分.
图片放在 Graphics/Pictures/
比如 <p,Cave>
4. <D,dbase,id,att> 或者 <d,dbase,id,att>
显示数据库信息, D/d 属于关键字, 必须有.
1) dbase
数据库名,包含以下几个
actor 基础角色
classe 职业
skill 技能
item 物品
weapon 武器
armor 装备
enemie 敌人
troop 敌人队伍
state 状态
map 地图信息(不包含事件)
animation 动画
common_event 公共事件
system 系统
area 区域
# 使用一下指令,请先确定字幕脚本是在游戏进行中运行
switche 开关
variable 变量
self_switche 独立开关
actors 游戏中的角色信息
party 队伍
player 主角
2) id
以上指令的 ID
3) att
属性名, 这里请参照 F1 里以上各类的属性说明.
5. 脚本调用说明
$scene = Scene_Credit.new(creditIndex = 0, endType = 0, endTime = 0)
其中:
creditIndex : 字幕方案序号
endType : 字幕结束类型
endTime : 字幕结束时间
6. 对 [x移动像素,帧数] 的说明
为了使字幕移动更趋于缓慢, 对速度做如下定义.
[x移动像素,帧数]
比如: [5,4] ,意思是, 每 4 帧移动
这里需要注意的是, [4,2] 和 [2,1] 这样类似定义的区别
后者 [2,1] 使的字幕移动更平滑.
7. 剩下的, 请参照 Credit_Config 配置模块
=end
#==============================================================================
# ■ Credit_Config (Module)
#------------------------------------------------------------------------------
# Scene_Credit 配置模块
#==============================================================================
module Credit_Config
#--------------------前缀设定(勿动)-----------------------
CREDIT = []
SET_VIEWPORT = []
START_LOCATION = []
BACK_EXCHANGE_BITMAP = []
CREDIT_SPEED = []
BGM_ECHANG = []
BACK_SCENE_CLASS_NAME = []
#------------------第一次字幕活动设定---------------------
@@index = 0
# 字幕内容.
CREDIT[@@index] =
' 加强型字幕脚本(<c,25,EE,FF>VX</c>)
by <c,25,43,FF>八云 紫</c>
写在前面:
脚本有点点复杂, 使用时请仔细看看本说明.
使用说明:
1. 请将脚本放到 <g,2,2>主处理</g> 之前,设定后即可使用
2. 设定部分的说明请看 Credit_Config 模块的说明
3. 需要调用的地方$scene = Scene_Credit.new
序号, 结束类型, 结束时间)
4. 有什么 BUG或建议 , 请联系咱, 6R ID 是 八云紫
5. 不要关闭程序,里面还有范例的哦
'
# 字幕显示位置设定
SET_VIEWPORT[@@index] = [
# x , y, width, height
24, 0, 544, 500
]
# 字幕开始方式设定, 相对于 SET_VIEWPORT(字幕显示位置设定)
# 正数向右调整(X坐标)
START_LOCATION[@@index] = [0, 416]
# 背景图片替换与移动设定
BACK_EXCHANGE_BITMAP[@@index] = {
# 帧数 => [图片名, [x移动像素,帧数], [y移动速度,帧数], x, y]
}
# 字幕移动速度设定
CREDIT_SPEED[@@index] = {
# 帧数 => [[x移动像素,帧数], [y移动速度,帧数], 显示坐标x, y]
0 => [[0, 2], [1, 2], 0, 0],
}
# BGM 切换设定
BGM_ECHANG[@@index] = {
# 帧数 => [文件名, 音量, 音调, 淡出时间]
0 => ["Airship", 500, 500, 0],
90 => ["Battle1", 500, 500, 60],
}
BACK_SCENE_CLASS_NAME[@@index] =
#[ 类名 ,[初始化参数]]
["Scene_Title",[]]
#------------------第二次字幕活动设定---------------------
@@index = 1
# 字幕内容.
CREDIT[@@index] =
' 这是一个没有人类记下历史的的封闭世界。
妖怪们无法准确记住过去,幻想乡里见不到真实。
因为这样,不了解妖怪的实态,人类只有害怕的
份儿。
若能更了解妖怪的能力和做出相应对策,回
避危险的地方,认识擅长退治妖怪的人类,那就
能不用战战兢兢地生活了吧。
我们稗田家,为了保障人类生活安全,从一
百二十至一百八十年,记下了惹人注目的妖怪,
这就是幻想乡缘起。从千年之前的阿一开始,传
到我已经是第九代了。
幻想乡缘起分为妖怪图鉴,英雄传,危险区
域向导,未解决资料和独白。记下了幻想乡的实
态。
妖怪图鉴记录了各种妖怪种族的倾向和对策,
以及分别记录现存确定的妖怪。这是一项提防幻
想乡必需的妖怪,和不要招惹强力妖怪的指针。
从妖精、幽灵等容易遇上的妖怪,到天狗、吸血
鬼等强力妖怪,这里都会从能力、危险度、遭遇
时间、地点和遭遇频度上给予概括和记录,全都
带图。对村庄的人来说,是十分有用的。
英雄传是介绍是没有住在人类村庄,而能进
行退治妖怪、解决异变等的人的。基本上是人类
的同伴,若有被妖怪危害,可以找这些人商量。
她们多数有好多谜团,谜团总会解开的。
危险区域向导是记述幻想乡的主要地方,有
哪些是危险的,怎样危险,要去那些地方需要准
备什么。要有所准备,就一定要先读此书。从村
庄出来的话,那就更要仔细阅读。
未解决资料包括了不完整的资料,和幻想乡
不相容的东西,新闻等。这些都是预定要写入书
中的。
独白是我--第九代的阿求。<p,back2>
关于此书的感想,和对于幻想乡的一些想法。
看不看都不要紧,当然有人看我会很高兴的。
幻想乡缘起到此本,已是第九册了。为了让
更多人就算不喜欢难读的古书字体和晦涩的文章,
也能读懂此书,比起过去的幻想乡缘起,此书采
用了新鲜的风格,流行的设计和简易的文字。'
# 字幕显示位置设定
SET_VIEWPORT[@@index] = [
# x , y, width, height
60, 0, 450, 500
]
# 字幕开始方式设定, 相对于 SET_VIEWPORT(字幕显示位置设定)
# 正数向右调整(X坐标)
START_LOCATION[@@index] = [0, 0]
# 背景图片替换与移动设定
BACK_EXCHANGE_BITMAP[@@index] = {
# 帧数 => [图片名, [x移动像素,帧数], [y移动速度,帧数], x, y]
0 => ["back", [-1, 10], [0, 0], 0, 0],
}
# 字幕移动速度设定
CREDIT_SPEED[@@index] = {
# 帧数 => [[x移动像素,帧数], [y移动速度,帧数], 显示坐标x, y]
0 => [[0, 1], [1, 1], 0, -416],
}
# BGM 切换设定
BGM_ECHANG[@@index] = {
# 帧数 => [文件名, 音量, 音调, 淡出时间]
0 => ["Airship", 500, 500, 0],
90 => ["Battle1", 500, 500, 60],
}
# 返回场景的脚本类名
# 类名就是脚本里的类名
# 参数列表这样填写,
# 数字类的, [1, 3, 43], 参数顺序参照之前类名的 initialize 方法
# 字符类的, ["\"121\"", "\"abc\""]
BACK_SCENE_CLASS_NAME[@@index] =
#[ 类名 ,[初始化参数]]
["Scene_Map",[]]
end
#==============================================================================
# ■ Credit_Config (Module)
#------------------------------------------------------------------------------
# Scene_Credit 配置模块
#==============================================================================
module Credit_Config
def self.getIndex()
return @@index
end
end
#==============================================================================
# ■ Rect
#------------------------------------------------------------------------------
# 矩形的类。
#==============================================================================
class Rect
#----------------------------------------------------------------------------
# ■ collision 碰撞检测
#----------------------------------------------------------------------------
def collision?(rect2)
minx = x > rect2.x ? x : rect2.x
miny = y > rect2.y ? y : rect2.y
maxx = x + width < rect2.x + rect2.width ? x + width : rect2.x + rect2.width
maxy = y + height < rect2.y + rect2.height ? y + height : rect2.y + rect2.height
if maxx > minx and maxy > miny
return true
end
return false
end
end
#==============================================================================
# ■ Scene_Credit (Class)
#------------------------------------------------------------------------------
# 字幕场景类
#==============================================================================
class Scene_Credit < Scene_Base
#--------------------------------------------------------------------------
# ● 初始化
# creditIndex : 字幕方案序号
# endType : 字幕结束类型
# endTime : 字幕结束时间
#--------------------------------------------------------------------------
def initialize(creditIndex = 0, endType = 0, endTime = 0)
#------------------------------------------------------------------------
# 背景图片精灵
if creditIndex > Credit_Config.getIndex()
p "序号太大, 最多只能到 #{Credit_Config.getIndex()}"
exit
end
@backSprite = Sprite.new
@backSprite.z = -500
@backSpriteMoveX = 0
@backSpriteMoveXS = 0
@backSpriteMoveY = 0
@backSpriteMoveYS = 0
#------------------------------------------------------------------------
# 显示窗口
@viewportMoveOx = 0
@viewportMoveOxS = 0
@viewportMoveOy = 0
@viewportMoveOyS = 0
@spriteArray = []
vx = Credit_Config::SET_VIEWPORT[creditIndex][0]
vy = Credit_Config::SET_VIEWPORT[creditIndex][1]
vw = Credit_Config::SET_VIEWPORT[creditIndex][2]
vh = Credit_Config::SET_VIEWPORT[creditIndex][3]
@viewport = Viewport.new(vx, vy, vw, vh)
#------------------------------------------------------------------------
# 其他
@rect_a = @viewport.rect.clone
@creditIndex = creditIndex
@endType = endType
@endTime = endTime
@spriteLocal = Sprite.new(@viewport)
@new_color = Color.new(255, 255, 255)
@credit = Credit_Config::CREDIT[creditIndex].clone
createReturnClass()
load_database()
end
#--------------------------------------------------------------------------
# ● 开始处理
#--------------------------------------------------------------------------
def start
super
createNewSprite()
x = 0
ghosting = [false, 0, 0]
@credit_line = @credit.split(/\n/)
for line in @credit_line
convert_special_characters(line)
setNewSpriteNilBitmap()
@spriteLocal.bitmap.font.color = @new_color
loop do
c = line.slice!(/./m)
case c
when nil
break
when "\x01" # \C[n](文字变色)
line.sub!(/\[([0-9a-fA-F]{1,2}),([0-9a-fA-F]{1,2}),([0-9a-fA-F]{1,2})\]/, "")
@new_color = Color.new($1.hex, $2.hex, $3.hex)
@spriteLocal.bitmap.font.color = @new_color
next
when "\x02" # \P[n](显示图片)
line.sub!(/\[(\w+)\]/, "")
endNewSprite()
createNewSprite()
@spriteLocal.bitmap = Bitmap.new("Graphics/Pictures/#{$1}")
endNewSprite()
createNewSprite()
setNewSpriteNilBitmap()
@spriteLocal.bitmap.font.color = @new_color
x = 0
next
when "\x03"
line.sub!(/\[([0-9]+),([0-9]+)\]/, "")
ghosting = [true, $1.to_i, $2.to_i]
when "\x04"
line.sub!("\x04", "")
ghosting = [false, 0, 0]
when "\x05"
line.sub!("\x05", "")
@new_color = Color.new(255, 255, 255)
@spriteLocal.bitmap.font.color = @new_color
else # 一般文字
if ghosting[0]
cl = @spriteLocal.bitmap.font.color.dup
@spriteLocal.bitmap.font.color = Color.new(0, 0, 0)
@spriteLocal.bitmap.draw_text(x + ghosting[1], 0 + ghosting[2], 40, 32, c)
@spriteLocal.bitmap.font.color = cl
end
@spriteLocal.bitmap.draw_text(x, 0, 40, 32, c)
c_width = @spriteLocal.bitmap.text_size(c).width
x += c_width
end
end
endNewSprite()
createNewSprite()
setNewSpriteNilBitmap()
x = 0
end
@frame_index = 0
updateViewport()
updateBackBitmap()
updateBgm()
end
#--------------------------------------------------------------------------
# ● 求余补充
#--------------------------------------------------------------------------
def remain(a, b)
if b == 0
return 1
else
return a % b
end
end
#--------------------------------------------------------------------------
# ● 加载数据库
#--------------------------------------------------------------------------
def load_database()
@data_actors = load_data("Data/Actors.rvdata")
@data_classes = load_data("Data/Classes.rvdata")
@data_skills = load_data("Data/Skills.rvdata")
@data_items = load_data("Data/Items.rvdata")
@data_weapons = load_data("Data/Weapons.rvdata")
@data_armors = load_data("Data/Armors.rvdata")
@data_enemies = load_data("Data/Enemies.rvdata")
@data_troops = load_data("Data/Troops.rvdata")
@data_states = load_data("Data/States.rvdata")
@data_maps = load_data("Data/MapInfos.rvdata")
@data_animations = load_data("Data/Animations.rvdata")
@data_common_events = load_data("Data/CommonEvents.rvdata")
@data_systems = load_data("Data/System.rvdata")
@data_areas = load_data("Data/Areas.rvdata")
@data_switches = $game_switches
@data_variables = $game_variables
@data_self_switches = $game_self_switches
@data_actorss = $game_actors
@data_partys = $game_party
@data_players = $game_player
end
#--------------------------------------------------------------------------
# ● 符号解析
#--------------------------------------------------------------------------
def convert_special_characters(credit)
return if credit == ""
credit.gsub!(/<C,([0-9a-fA-F]+),([0-9a-fA-F]+),([0-9a-fA-F]+)>/i){ "\x01[#{$1},#{$2},#{$3}]" }
credit.gsub!(/<G,([0-9]+),([0-9]+)>/i) { "\x03[#{$1},#{$2}]" }
credit.gsub!(/<P,(\w+)>/i) { "\x02[#{$1}]" }
credit.gsub!(/<\/G>/i) { "\x04" }
credit.gsub!(/<\/C>/i) { "\x05" }
if (credit.gsub(/<D,(\w+),([0-9]+),(\w+)>/i){}) != credit
getDatabaseMessage($1.to_s, $2.to_s, $3.to_s)
credit.gsub!(/<D,(\w+),([0-9]+),(\w+)>/i) { "#{@msg}" }
end
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def terminate
super
@backSprite.dispose
@spriteArray.each do |i|
i.bitmap.dispose
i.dispose
end
@viewport.dispose
@spriteLocal.bitmap.dispose
@spriteLocal.dispose
Audio.bgm_stop()
end
#--------------------------------------------------------------------------
# ● 矩形碰撞检测
#--------------------------------------------------------------------------
def lastRect?()
rect_b = Rect.new(@viewport.ox + Credit_Config::START_LOCATION[@creditIndex][0],
[email protected]
+ Credit_Config::START_LOCATION[@creditIndex][1],
@viewport.rect.width, getSpriteRectHeight())
return !(@rect_a.collision?(rect_b))
end
#--------------------------------------------------------------------------
# ● 时间超时检测
#--------------------------------------------------------------------------
def lastTime?()
return (@frame_index >= @endTime)
end
#--------------------------------------------------------------------------
# ● 结束检测
#--------------------------------------------------------------------------
def last?
case @endType
when 0
return lastRect?()
when 1
return lastTime?()
when 2
return (lastRect?() or lastTime?())
else
p "请将 endType 设定在 0~2 之间"
return true
end
end
#--------------------------------------------------------------------------
# ● 结束处理
#--------------------------------------------------------------------------
def last
$scene = @returnClass
end
#--------------------------------------------------------------------------
# ● 视口更新
#--------------------------------------------------------------------------
def updateViewport()
if remain(@frame_index, @viewportMoveOxS) == 0
@viewport.ox += @viewportMoveOx
end
if remain(@frame_index, @viewportMoveOyS) == 0
@viewport.oy += @viewportMoveOy
end
if Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index] != nil
@viewportMoveOx = Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][0][0]
@viewportMoveOxS = Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][0][1]
@viewportMoveOy = Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][1][0]
@viewportMoveOyS = Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][1][1]
@viewport.ox = Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][2] if Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][2] != nil
@viewport.oy = Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][3] if Credit_Config::CREDIT_SPEED[@creditIndex][@frame_index][3] != nil
end
end
#--------------------------------------------------------------------------
# ● 背景更新
#--------------------------------------------------------------------------
def updateBackBitmap()
if remain(@frame_index, @backSpriteMoveXS) == 0
@backSprite.x += @backSpriteMoveX
end
if remain(@frame_index, @backSpriteMoveYS) == 0
@backSprite.y += @backSpriteMoveY
end
if Credit_Config::BACK_EXCHANGE_BITMAP[@creditIndex][@frame_index] != nil
if Credit_Config::BACK_EXCHANGE_BITMAP[@creditIndex][@frame_index][0] != nil
@backSprite.bitmap.dispose if @backSprite.bitmap != nil
@backSprite.bitmap = Bitmap.new("Graphics/Pictures/#{Credit_Config::BACK_EXCHANGE_BITMAP[@creditIndex][@frame_index][0]}")
@backSprite.z = -500
end
@backSpriteMoveX = Credit_Config::BACK_EXCHANGE_BITMAP[@creditIndex][@frame_index][1][0]
@backSpriteMoveXS = Credit_Config::BACK_EXCHANGE_BITMAP[@creditIndex][@frame_index][1][1]
@backSpriteMoveY = Credit_Config::BACK_EXCHANGE_BITMAP[@creditIndex][@frame_index][2][0]
@backSpriteMoveYS = Credit_Config::BACK_EXCHANGE_BITMAP[@creditIndex][@frame_index][2][1]
end
end
#--------------------------------------------------------------------------
# ● BGM 更新
#--------------------------------------------------------------------------
def updateBgm()
if Credit_Config::BGM_ECHANG[@creditIndex][@frame_index] != nil
if Credit_Config::BGM_ECHANG[@creditIndex][@frame_index][3] != 0
Audio.bgm_fade(Credit_Config::BGM_ECHANG[@creditIndex][@frame_index][3])
end
Audio.bgm_stop()
Audio.bgm_play("Audio/BGM/#{Credit_Config::BGM_ECHANG[@creditIndex][@frame_index][0]}",
Credit_Config::BGM_ECHANG[@creditIndex][@frame_index][1],
Credit_Config::BGM_ECHANG[@creditIndex][@frame_index][2])
end
end
#--------------------------------------------------------------------------
# ● 场景更新
#--------------------------------------------------------------------------
def update
super
@frame_index += 1
updateViewport()
updateBackBitmap()
updateBgm()
return if cancel?
last if last?
end
#--------------------------------------------------------------------------
# ● 自动退出按键检测
#--------------------------------------------------------------------------
def cancel?
if Input.trigger?(Input::B)
$scene = @returnClass
return true
end
return false
end
#--------------------------------------------------------------------------
# ● 生成返回对象
#--------------------------------------------------------------------------
def createReturnClass()
begin
returnClassLocal = "@returnClass = #{Credit_Config::BACK_SCENE_CLASS_NAME[@creditIndex][0]}.new("
size = Credit_Config::BACK_SCENE_CLASS_NAME[@creditIndex][1].size() - 1
for i in 0..size - 1
returnClassLocal += "#{Credit_Config::BACK_SCENE_CLASS_NAME[@creditIndex][1][i]},"
end
returnClassLocal += "#{Credit_Config::BACK_SCENE_CLASS_NAME[@creditIndex][1][size]})"
eval(returnClassLocal)
rescue
@returnClass = Scene_Title.new
end
return @returnClass
end
#--------------------------------------------------------------------------
# ● 创建新缓冲精灵
#--------------------------------------------------------------------------
def createNewSprite()
@spriteLocal.z = 1
@spriteLocal.bitmap = nil
@spriteLocal.x = Credit_Config::START_LOCATION[@creditIndex][0]
@spriteLocal.y = getSpriteHeight()
end
#--------------------------------------------------------------------------
# ● 结束缓冲精灵编辑
#--------------------------------------------------------------------------
def endNewSprite()
spriteLocal = Sprite.new(@viewport)
spriteLocal.x = @spriteLocal.x
spriteLocal.bitmap = @spriteLocal.bitmap
spriteLocal.y = @spriteLocal.y
spriteLocal.z = @spriteLocal.z
@spriteArray.push(spriteLocal)
end
#--------------------------------------------------------------------------
# ● 设定缓冲精灵图片属性
#--------------------------------------------------------------------------
def setNewSpriteNilBitmap()
@spriteLocal.bitmap = Bitmap.new(Credit_Config::SET_VIEWPORT[@creditIndex][2], 32)
@spriteLocal.bitmap.font.color = @new_color.clone
end
#--------------------------------------------------------------------------
# ● 获取字幕高度
#--------------------------------------------------------------------------
def getSpriteHeight()
y = Credit_Config::START_LOCATION[@creditIndex][1]
y += getSpriteRectHeight()
return y
end
#--------------------------------------------------------------------------
# ● 获取最终文字高度
#--------------------------------------------------------------------------
def getSpriteRectHeight()
y = 0
for i in @spriteArray
y += i.height
end
return y
end
#--------------------------------------------------------------------------
# ● 获取数据库信息
#--------------------------------------------------------------------------
def getDatabaseMessage(database, index, attribute)
sci = "@msg = @data_#{database}s[#{index}].#{attribute}"
begin
eval(sci)
rescue
@msg = ""
end
end
end
复制代码
作者:
hubaobao
时间:
2010-8-10 11:28
提示:
作者被禁止或删除 内容自动屏蔽
作者:
木葬枫
时间:
2010-8-10 11:31
p“你要说的话”
OK了,这样你会用了吧?满意了吧?
作者:
八云紫
时间:
2010-8-10 11:39
都不记得有写过这个脚本了~~~
作者:
dbshy
时间:
2010-8-10 17:53
仲秋启明 发表于 2010-8-10 11:05
这个脚本怎么这么长 - -bb
XP版的MS只有100行左右
作者:
八云紫
时间:
2010-8-11 09:18
回复
dbshy
的帖子
单单说明就花了100多行。然后是自定义的标记比较多。
作者:
木葬枫
时间:
2010-8-11 12:48
DK酱~~以后直接贴脚本的50-100就好了
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1