forum

【翻译】故事版脚本指南(Storyboarding by Scripting)

posted
Total Posts
39
Topic Starter
Breeze
原文Storyboarding by Scripting
英文不好,翻译可能有不准确的地方,各位有发现问题我会马上修改
在edit里怕SB设置无法做到精确?那么就该尝试一下脚本修改了~
脚本编辑的好处就是可以精确改动,另外,像单一变量(时间,大小等)的变动也是相当方便的
也有很多在常规edit中无法用到的功能,像颜色改变,动画间隔时间等

"【】"内为我的说明,与原文无关

故事版脚本

在osu.文件里,[Event]:之下
注意:下划线_可以用空格替代

静态画面和动画

静态画面
Sprite,"layer","origin","filepath",x,y
_event, easing, starttime, endtime, [params]
_event, [...]
_event, [...]

动画
Animation,"layer","origin","filepath",x,y,frameCount,frameDelay,looptype
_event,easing,starttime,endtime,[params]
_event, [...]
_event, [...]

对于动画,指定一个文件名,比如"sliderball.png",然后把他们按从"sliderball0.png"到"sliderball9.png"这样的方式依次命名,以做出一个10帧的动画【实际上并不是非要10帧,2帧,3帧或者以上都是可行的】

【以下将是对上面方框内代码的解释】

frameCount:动画中的帧数
frameDelay : 帧延迟,每帧之间的延迟(单位:毫秒)
looptype【动画循环模式】 : 默认LoopForever【一直循环】
LoopForever - 一直循环
LoopOnce - 动画播放一次并结束在最后一帧

层叠次序由文件在osu.中出现的位置决定,最前面的故事版事件会在其他任何事件的层之后.如果故事版事件"A"代码在"B"之前,那么"B"会在"A"前一层.

layers:【层】:
Background【背景】
Fail【失败,即休息时出现X】
Pass【通过,即休息时出现○】
Foreground【前景】
注意: Background和Foreground层总是可见的

origin: 【初始点】
TopLeft【左上】
TopCenter【上方正中】
TopRight【右上】
CentreLeft【中左】
Centre【中央】
CentreRight【中右】
BottomLeft【左下】
BottomCentre【下方正中】
BottomRight【右下】

所有旋转和大小改变(包括矢量缩放)都受初始点影响

filepath: 【文件路径】图片文件的相关路径(应和osu.在同一目录下)
注意: 如果文件名中有空格,文件路径必须用双引号引用

x, y: 图片的位置
注意: 玩的区域是(640,480)到(0,0)【(0,0)为左上角坐标,意思是不要让坐标超过这个区域,下同】

event type:【事件类型】
F - fade【隐藏(淡入淡出)】
M - move【移动】
S - scale【缩放】
V - vector scale (width and height separately)【矢量缩放(宽高分别变动)】
R - rotate【旋转】
C - colour【颜色】
L - loop【循环】
T - Event-triggered loop【事件触发循环】
P - Parameters【参数】

easing:【缓冲】
0 - none【没有缓冲】
1 - start fast and slow down【开始快结束慢】
2 - start slow and speed up【开始慢结束快】

starttime, endtime: 【开始,结束时间】

params:【参数】


_F,[...],startopacity,endopacity

startopacity: 动画的初始可见(透明)度
endopacity: 动画的结束可见(透明)度
0 - 不可见, 1 - 完全可见【这里这个数字参数0-1之间的小数是可以的,感谢abalee提醒】


_M,[...],startx,starty,endx,endy

startx, starty: 动画的初始位置
endx, endy: 动画的结束位置
注意: 玩的区域是(640,480)到(0,0)


_S,[...],startscale,endscale

startscale: 动画的初始比例
endscale: 动画的结束比例
1 = 100%, 2 = 200% 等等. 小数位也是可行的


_V,[...],startx,starty,endx,endy

startx, starty: 动画的初始位置比例
endx, endy: 动画的结束位置比例
1 = 100%, 2 = 200% 等等. 小数位也是可行的


_R,[...],startangle,endangle

startangle: 动画的初始需要转动到的角度的弧度
endangle: 动画的结束时需要转动到得角度的弧度
正角顺时针旋转


_C,[...],r1,g1,b1,r2,g2,b2

r1, g1, b1: 启动时动画元件的颜色
r2, g2, b2: 结束时动画元件的颜色

(255,255,255)的静态图片将会呈现他们原本的颜色,(0,0,0)上网图片将完全是黑色.这两者之间的任何数值都将形成减色(subtractive colour)【其实就是三原色的数值,(红色,绿色,蓝色),用过photoshop等图像处理软件的应该很熟悉这个,关于这个的使用可以参照我的AKB48 - Flying Get中灯光的使用】


_MX,[...],startx,endx


startx: 动画的初始x坐标
endx: 动画的结束x坐标


_MY,[...],starty,endy

starty: 动画的初始y坐标
endy: 动画的结束y坐标


_P,[...],p

p: 应用的影响参数:
H - 水平翻转
V - 垂直翻转
A - additive-blend colour (as opposed to alpha-blend)【请参阅以下资料来了解这个效果
http://shiba.hpe.sh.cn/jiaoyanzu/wuli/s...&classId=4
http://dev.gameres.com/Program/Visual/2D/alpha.htm
(感谢emergist提供的链接)】

用以下的简写参数也是可行的,应用的参数只在动画持续期间生效

shorthand:【简写】
这个符号可以用来快速的把同一时间间隔的大量事件改写为脚本code

_event,easing,starttime,endtime,val1,val2,val3,...,valN

将会创建事件:

_event,easing,starttime,endtime,val1,val2
_event,easing,starttime + duration,endtime + duration,val2,val3
_event,easing,starttime + 2duration,endtime + 2duration,val3,val4

等等

shorthand2:
这个符号可以在事件开始和结束时间相同时使用

_M,0,1000,1000,320,240,320,240

将译为

_M,0,1000,,320,240,320,240

请注意结束区域的空白区 - 这是必须的

shorthand3:
这个符号可以在事件初始值和结束指相同时使用

_M,0,1000,,320,240,320,240

将译为

_M,0,1000,,320,240


Looping 循环

Standard Loops标准循环:
循环会以设定好的数字图片清晰地不断重复


_L,time difference,loopcount
__event, [...]
__event, [...]


time difference: 循环开始的时间和此系列SB事件第一次生效的最初时间之间的时间差, 单位是毫秒
loopcount: 动画循环次数

例, 如果想要把
_C,0,73384,73727,$blue
_C,0,73727,74071,$yellow
_C,0,74071,74414,$red,$white
这段代码在01:28:040重复一次(即代码中的88040ms), 那么L代码的时间差数值应该是88040减去这段代码第一次生效时的最初时间73384所得的14656, 所以L代码如下:
_L,14656,1
__C,0,73384,73727,$blue
__C,0,73727,74071,$yellow
__C,0,74071,74414,$red,$white



Trigger Loops事件触发循环:

事件触发循环可以被游戏时间事件触发. 虽然叫做循环, 事件触发循环循环时只执行一次


_T,triggerName,start,end
__event, [...]
__event, [...]


start: 触发器可用的时候
end : 触发器结束可用状态的时候

现在支持的触发器有:
HitSoundClap
HitSoundFinish
HitSoundWhistle
Passing
Failing

触发器循环和普通循环一样是从零计数. 如果两个重叠, 第一个将会被停止且被一个从头开始的循环替代.
如果他们和任何存在的故事版事件重叠,他们将不会循环直到那些故事版事件不在生效
【我有在我的Yanzi Sun - Meng Bu Luo (Dream Never End)中用到这个,四边的SB就是用的clap和whistle触发SB,可以打开osb文件参考】


Sound effects SB 自定义音效【感谢之前yaya,gdeath和abalee给与我的指点】
2011/8/29 EDIT : 现在ranking guideline不建议使用SB音效, 能不用的时候尽量避免使用以免被喷

Sample,time,layer,"filepath",volume


time 时间: SB自定音效开始的时间(单位毫秒)【就是edit中左下的数字,注意如果是一分钟以上,如1:20:025,那么1分钟要换算成60秒即time设置应为80025而非120025】

layer 层:
Background = 0
Fail = 1
Pass = 2
Foreground = 3

filepath 文件路径: 声音文件【wav格式】相关路径(应和osu.文件在同一文件夹目录下)
注意: 文件路径必须双引号引用

volume音量: 声音文件音量 (1-100)
【我的Girls' Generation - It's Fantastic中有用到很多SB sound,这个每个难度不同,所以需要参考的话应该打开每个难度的osu文件,然后在Events之下的Storyborrd sound sample下】

Variables 自定义变量

现在自定义变量也可用,你可以在osb.文件里定义自己的自定义变量(暂时不支持osu.文件的SB)


[Variables]
$white=255,255,255


一旦你自定义了变量,你可以在故事版中的"任何地方"使用他们.
暂时请不要自定义太小的变量(比如, 不要赋值 $var=1)因为编辑器还没聪明到在它保存时知道把变量如何保存.【意思是变量太简单的话,因为保存时会把所有变量按自定义变量保存,所以太小的变量可能出现替换问题】所有事件变量会在保存时被自定义变量代替(所以如果你有一个地方用了 $white而另外一个地方用的 255,255,255 他们在编辑器中会都被保存为$white)【peppy的Baby Cruising Love中颜色的改变就用了自定义变量】

2013.7.22 EDIT:新版本支持宽屏的SB效果,但只有应用了旋转效果的部件会宽屏显示,如果想要全部图片都是宽屏效果的吧要在每个部件的代码中加上
_R,0,x,y,-1E-16,0
其中x,y是你宽屏持续的时间


【至此,翻译完毕,如有疑问请提出,我会尽我所能解答】
steinsgate
=.= 就是製作SB方法指南咩 話說沒插樓吧
Furawa
辛苦了,好東西,謝謝LZ
haruhiteamsos
辛苦了~推文
yaya
*_*
gdeath
没想到微风吧这都翻了,辛苦了。 :oops:
abalee
_F,[...],startopacity,endopacity


startopacity: 动画的初始不透明度
endopacity: 动画的结束不透明度
0 - 透明, 1 - 完全透明
0-不可见,1-完全可见

这个参数应该可以用小数,即是用0.5来控制该图片为半透明

EDIT:

至于用C来控制颜色的哪一段,简单来说就是 所有用SB写出来的颜色 比 原来的颜色 要暗。可以参考玩的时候背景会变暗。
Topic Starter
Breeze
This map has been deleted on the request of its creator. It is no longer available.
tsuka
非常感谢
lcclarke
那你说的这些脚本,在Design里面都能实现么?~
Topic Starter
Breeze

lcclarke wrote:

那你说的这些脚本,在Design里面都能实现么?~
Editor里只能实现最基础的四种功能:
  1. 移动
  2. 淡入淡出
  3. 放大缩小
  4. 旋转
如果是要变换颜色或者设定精确的坐标,时间点的话只能用脚本
对了,还有事件触发SB也只能个脚本编写
总之editor功能有很多限制
Darkrai7
就这么多了?~
循环中可以给图片的坐标自定义变量吗?~或随机坐标...
比如说~
我要在一段地方设定一个循环~而这个循环的步骤是:

淡出淡入~放大/缩小~淡出淡入~缩小/放大~移动到随机位置~淡出淡入...循环~

一共8次~每次有4X4张图片要执行这个动作...

像这样的动作怎么通过简短的操作去完成呢?~
尤其是当要处理的图片数量过多时...
Colin Hou
官方FAQ上说SBE肯定会实现那些现在只有脚本才能搞定的功能的...

只是不知何年何月了 *_*
Topic Starter
Breeze

Darkrai7 wrote:

就这么多了?~
循环中可以给图片的坐标自定义变量吗?~或随机坐标...
比如说~
我要在一段地方设定一个循环~而这个循环的步骤是:

淡出淡入~放大/缩小~淡出淡入~缩小/放大~移动到随机位置~淡出淡入...循环~

一共8次~每次有4X4张图片要执行这个动作...

像这样的动作怎么通过简短的操作去完成呢?~
尤其是当要处理的图片数量过多时...
坐标的自定变量应该是可以的,只要不是太简单的变量(即有可能出现在其他地方但其实又不是这个用处的相同变量)都是可以自定义的
随机坐标...这个貌似无法实现.所有的设定必须设定好,不能弄随机的
只是基本效果的SB的话推荐用SBE制作,因为是可见的操作也比较方便
emergist

Breeze wrote:

(255,255,255)的静态图片将会呈现他们原本的颜色,(0,0,0)上网图片将完全是黑色.这两者之间的任何数值都将形成减色(subtractive colour)【其实就是三原色的数值,(红色,绿色,蓝色),用过photoshop等图像处理软件的应该很熟悉这个,关于这个的使用可以参照我的AKB48 - Flying Get中灯光的使用】
AKB48 - Flying Get里面基本都是类似于 C,0,9949,10865,$white,$red 的东西,C后面不是应该有6个参数吗?
Topic Starter
Breeze

emergist wrote:

AKB48 - Flying Get里面基本都是类似于 C,0,9949,10865,$white,$red 的东西,C后面不是应该有6个参数吗?
如果你是指$white和$red的话, 那是我赋值的一个代码, 其实本身他所对应的是颜色的rgb值代码
emergist

Breeze wrote:

emergist wrote:

AKB48 - Flying Get里面基本都是类似于 C,0,9949,10865,$white,$red 的东西,C后面不是应该有6个参数吗?
如果你是指$white和$red的话, 那是我赋值的一个代码, 其实本身他所对应的是颜色的rgb值代码
Thx.
我弄错了,我把easing, starttime, endtime给当成颜色的前三个参数了(我说怎么这么大呢……)。
emergist

Breeze wrote:

emergist wrote:

AKB48 - Flying Get里面基本都是类似于 C,0,9949,10865,$white,$red 的东西,C后面不是应该有6个参数吗?
如果你是指$white和$red的话, 那是我赋值的一个代码, 其实本身他所对应的是颜色的rgb值代码

还有,
C,0,10865,11781,$red,$white
这段代码不太明白,在图中光线的颜色并没有从红色变为原本的颜色,而是直接变成了蓝色,那么这段代码起什么作用呢?
Topic Starter
Breeze

emergist wrote:

Breeze wrote:

还有,
C,0,10865,11781,$red,$white
这段代码不太明白,在图中光线的颜色并没有从红色变为原本的颜色,而是直接变成了蓝色,那么这段代码起什么作用呢?
具体是哪段代码? 因为我这图里面也用了很多循环代码, 而循环代码很多就是基于00:10:865开始的这段的, 实际上对应的时间点并不一定就刚好是这个时间点
emergist

Breeze wrote:

具体是哪段代码? 因为我这图里面也用了很多循环代码, 而循环代码很多就是基于00:10:865开始的这段的, 实际上对应的时间点并不一定就刚好是这个时间点
第一段(不好意思,我是新手,请多指教)。
Topic Starter
Breeze
麻烦复制这段代码给我看看
emergist

Breeze wrote:

麻烦复制这段代码给我看看

我把我不懂的地方一起贴出来吧:
1.
 L,0,4
C,0,9949,10865,$white,$red
C,0,10865,11781,$red,$white
C,0,11781,12697,$white,$blue
在游戏里,光线的颜色并没有从红色变为原本的颜色,而是直接变成了蓝色,我不太明白为什么。



2.

Breeze wrote:

用以下的简写参数也是可行的,应用的参数只在动画持续期间生效
这里的“动画”是否指的是sprite和animation?



3.原文里的Standard Loop的代码是:
_L,starttime,loopcount
__event, [...]
__event, [...]
而你的是:
_L,time difference,loopcount
__event, [...]
__event, [...]
不知道为什么会不一样……



4.
.osu里的SB该怎么写?是直接加到[Events]里吗?



5.
C,0,12697,13613,0,0,$white,255
这句貌似是运用了shorthand,但是我不太理解这个概念,能否说得更详细一些?非常感谢。




顺便说一下我对于你文章翻译里的几个小点的看法:
1.

Breeze wrote:

这个符号可以用来快速的把同一时间跨度的大量事件改写为脚本code
这里的“时间跨度”我觉得翻译成“时间间隔”或者“时间段”更好一些;




2.

Breeze wrote:

A - additive-blend colour (as opposed to alpha-blend)【理解不能...貌似是杂色效果?】
我觉得这个应该是XNA游戏框架里处理光影效果的一些方法,请见:
http://shiba.hpe.sh.cn/jiaoyanzu/wuli/s ... &classId=4
http://dev.gameres.com/Program/Visual/2D/alpha.htm
Topic Starter
Breeze

emergist wrote:

Breeze wrote:

麻烦复制这段代码给我看看

我把我不懂的地方一起贴出来吧:
1.
 L,0,4
C,0,9949,10865,$white,$red
C,0,10865,11781,$red,$white
C,0,11781,12697,$white,$blue
在游戏里,光线的颜色并没有从红色变为原本的颜色,而是直接变成了蓝色,我不太明白为什么。 :arrow: 红色变到原本颜色的时间点是00:11:781, 这里确实是变回了原本颜色的, 请再仔细看看



2.

Breeze wrote:

用以下的简写参数也是可行的,应用的参数只在动画持续期间生效
这里的“动画”是否指的是sprite和animation? :arrow: 简写代码因为我没用过所以也不太清楚, 这里只是照原文翻译, 不过应该说静态画面和动画都可以应用才是



3.原文里的Standard Loop的代码是:
_L,starttime,loopcount
__event, [...]
__event, [...]
而你的是:
_L,time difference,loopcount
__event, [...]
__event, [...]
不知道为什么会不一样…… :arrow: 原文的英文解释地不是很清楚, 循环代码的那个starttime就应该是循环开始的时间点和事件发生的时间点之间时间差, 这个是经过验证的所以可以放心使用



4.
.osu里的SB该怎么写?是直接加到[Events]里吗? :arrow: 对, 在event下直接编写就可以了, 但是要注意格式要正确, 格式不正确的时候读取时osu会报错, 会告诉你哪段代码有问题



5.
C,0,12697,13613,0,0,$white,255
这句貌似是运用了shorthand,但是我不太理解这个概念,能否说得更详细一些?非常感谢。 :arrow: 这里本身的代码是
C,0,12697,13613,0,0,255,255,255,255
然后我赋值了$white=255,255,255, 所以保存的时候系统会自动把255,255,255替换成$white, 这里实际上是把颜色从0,0,255换到255,255,255




顺便说一下我对于你文章翻译里的几个小点的看法:
1.

Breeze wrote:

这个符号可以用来快速的把同一时间跨度的大量事件改写为脚本code
这里的“时间跨度”我觉得翻译成“时间间隔”或者“时间段”更好一些; :arrow: ok, 谢谢提出




2.

Breeze wrote:

A - additive-blend colour (as opposed to alpha-blend)【理解不能...貌似是杂色效果?】
我觉得这个应该是XNA游戏框架里处理光影效果的一些方法,请见:
http://shiba.hpe.sh.cn/jiaoyanzu/wuli/s ... &classId=4
http://dev.gameres.com/Program/Visual/2D/alpha.htm :arrow: 因为没使用过这个效果所以我并不是太清楚, 加上你的链接了, 谢谢
emergist
非常感谢,不过我感觉你用了不少简写代码,如:
F,0,774,,0
M,0,10244,,320,240
M,0,28269,,320,240
等等。
abalee
這裡的話,是當開始時間和結束時間一樣,後面的結束時間可以省略。
Scorpiour
补充说明下循环的部分:两种用法皆可

用法A——例子
 L,0,5
_C,0,363,6881,240,120,240,240,0,0
_C,0,6881,13400,240,0,0,240,120,240

L,0,5 <---- Loop,每次循环额外延迟为0 (time difference), 循环5次。

这个0是从哪里开始计算的呢?答案是:

从物件生效的第一个时间点开始计算,也就是(363)

那么363开始,循环开始第一次,持续到13400结束,然后第2次....,总共5次。



于是这里就又引出了循环的用法B(我觉得更直观)

例子
 L,49090,15
_C,0,0,455,120,90,60,90,120,90
_C,0,455,910,90,120,90,60,90,120
_C,0,910,1365,60,90,120,90,60,90
_C,0,1365,1820,90,60,90,120,90,60

看这段代码:

time difference = 49090, 物件的第一动作时间点是0,那么实际整个循环是从49090+0=49090开始,运行到49090+1820为止是一个完整的循环,然后再继续,总共循环15次。



这么写应该足够清晰了……
emergist

Scorpiour wrote:

补充说明下循环的部分:两种用法皆可

用法A——例子
 L,0,5
_C,0,363,6881,240,120,240,240,0,0
_C,0,6881,13400,240,0,0,240,120,240

L,0,5 <---- Loop,每次循环额外延迟为0 (time difference), 循环5次。

这个0是从哪里开始计算的呢?答案是:

从物件生效的第一个时间点开始计算,也就是(363)

那么363开始,循环开始第一次,持续到13400结束,然后第2次....,总共5次。



于是这里就又引出了循环的用法B(我觉得更直观)

例子
 L,49090,15
_C,0,0,455,120,90,60,90,120,90
_C,0,455,910,90,120,90,60,90,120
_C,0,910,1365,60,90,120,90,60,90
_C,0,1365,1820,90,60,90,120,90,60

看这段代码:

time difference = 49090, 物件的第一动作时间点是0,那么实际整个循环是从49090+0=49090开始,运行到49090+1820为止是一个完整的循环,然后再继续,总共循环15次。



这么写应该足够清晰了……
这样的话微风和原文的意思应该是一样的,因为原文说的是:
Note that events inside a loop should be timed with a zero-base. This means that you should start from 0ms for the inner event's timing and work up from there. The loop event's start time will be added to this value at game runtime
这样的starttime其实也就是time difference。
emergist
还有一个小问题:sprite和animation中的origin(TopLeft/TopCenter...)指的是什么地方的位置?
abalee

Breeze wrote:

origin: 【初始点】
TopLeft【左上】
TopCenter【上方正中】
TopRight【右上】
CentreLeft【中左】
Centre【中央】
CentreRight【中右】
BottomLeft【左下】
BottomCentre【下方正中】
BottomRight【右下】
emergist

abalee wrote:

Breeze wrote:

origin: 【初始点】
TopLeft【左上】
TopCenter【上方正中】
TopRight【右上】
CentreLeft【中左】
Centre【中央】
CentreRight【中右】
BottomLeft【左下】
BottomCentre【下方正中】
BottomRight【右下】
我的意思是,这些位置指的是sprite或者animation中哪个点的位置?
Topic Starter
Breeze
这并不是一个确切的点, 而是动画效果所参考的一个"基准点"
比如说放大缩小以及长宽比例改变, 如果是Centre的话那么就是默认以中心点为基准来进行放大缩小以及长宽比例改变
如果是TopLeft则是以这个元件的最左上的像素点为基准点
这样应该可以理解了吧
abalee
每張圖都是長方形,center就是指的幾何中心,topleft是最左上角的那一個像素,如此類推,我是這樣理解的
emergist

Breeze wrote:

这并不是一个确切的点, 而是动画效果所参考的一个"基准点"
比如说放大缩小以及长宽比例改变, 如果是Centre的话那么就是默认以中心点为基准来进行放大缩小以及长宽比例改变
如果是TopLeft则是以这个元件的最左上的像素点为基准点
这样应该可以理解了吧
那么对于不同的基准进行的改变有什么不同呢?
Topic Starter
Breeze
就是改变的基准点不同啊...解释地应该很清楚了...
自己试试效果应该就可以理解的
emergist

Breeze wrote:

就是改变的基准点不同啊...解释地应该很清楚了...
自己试试效果应该就可以理解的

刚才做了一下实验,先发布一下实验结果:

1.
SPOILER
Sprite,Foreground,Centre,"eminem_nz6d1wc2.jpg",0,0

2.
SPOILER
Sprite,Foreground,TopLeft,"eminem_nz6d1wc2.jpg",0,0

3.
SPOILER
Sprite,Foreground,Centre,"eminem_nz6d1wc2,jpg",320,240

结论:
经过比较,我得出的结论是:origin指的是图片的左上、右下等位置在屏幕中的坐标(左上角是(0,0),右下角是(640,480)),但是我并没有发现origin对于scale或者vector scale有什么影响,所以我更同意abalee的看法。

虽然明白了origin的意思,但是关于这篇文章第二条技巧中的第二点我还是不太明白,为什么不同的origin可以导致不同的SB Load呢?
Topic Starter
Breeze

emergist wrote:

为什么不同的origin可以导致不同的SB Load呢?
http://osu.ppy.sh/wiki/SB_Load
show more
Please sign in to reply.

New reply