Skip to content

Commit 387acf9

Browse files
author
nebulaliu
committed
docs: launch opera
1 parent 8718efd commit 387acf9

File tree

1 file changed

+212
-25
lines changed

1 file changed

+212
-25
lines changed

Design/LaunchOperaDocument.md

+212-25
Original file line numberDiff line numberDiff line change
@@ -247,13 +247,12 @@ FrameType | 释义
247247
[playAudio](#frametypeplayaudio)| 将某个音频组件进行继续播放
248248
[createImage](#frametypecreateimage)| 创建贴图
249249
[createRect](#frametypecreaterect)| 创建矩形区域(可透明、填充纯色、用于区域点击识别)
250+
[setParam](#frametypesetparam)| 设置某个关键动作帧的属性
251+
[setParamSizeAndPosition](#frametypesetparamsizeandposition)| 同时设置组件的Size、Position属性
252+
[setTimeout](#frametypesettimeout)| 创建延迟执行
253+
[createAnimationFunction](#frametypecreateanimationfunction)| 创建动画函数
254+
250255
[var]()| 创建全局变量
251-
[setParam]()| 设置某个关键动作帧的属性
252-
[setTimeout]()| 创建延迟执行
253-
[setParamSize]()| 设置组件的Size属性
254-
[setParamPosition]()| 设置组件的Position属性
255-
[setParamSizeAndPosition]()| 同时设置组件的Size、Position属性
256-
[createAnimationFunction]()| 创建动画函数
257256
[if]()| 条件判断
258257
[report]()| 创建上报节点
259258
[checkPoint]()| 剧情检查点
@@ -343,11 +342,10 @@ video.setEvent({
343342
video.setEvent({
344343
event: 'onPlayTimeAt',
345344
...
346-
})
347-
345+
});
348346
```
349347

350-
seek 的使用:
348+
###### seek 的使用案例
351349

352350
seek 需要配合 Frame.SetParam 使用,意味其他事件触发 Frame.SetParam 后为 video 关键动作帧赋值 seek 则产生视频跳转,如需了解 SetParam 请移步特定章节阅读,此处给出 seek 案例:
353351

@@ -515,7 +513,23 @@ onClick | - | 当贴图被点击
515513
##### 案例
516514

517515
```js
518-
// 案例
516+
const image = operaData.createFrame(FrameType.createImage);
517+
518+
// 右下角跳过贴图
519+
image.setParams({
520+
bottom: 10,
521+
right: 10,
522+
width: 100,
523+
height: 30,
524+
url: 'launchOperaPlay/skip.png',
525+
});
526+
527+
// 点击事件
528+
image.setEvent({
529+
event: 'onClick',
530+
bind: [ ... ],
531+
keep: true, // 事件始终有效
532+
});
519533
```
520534

521535
#### FrameType.createRect
@@ -544,35 +558,208 @@ onClick | - | 当贴图被点击
544558
##### 案例
545559

546560
```js
547-
// 案例
561+
const rect = operaData.createFrame(FrameType.createRect);
562+
563+
// 一个全屏的透明区域,可以用于点击事件透明遮罩
564+
rect.setParams({
565+
top: 0,
566+
left: 0,
567+
bottom: 0,
568+
right: 0,
569+
color: '#FFFFFF00'
570+
});
571+
572+
// 点击事件
573+
rect.setEvent({
574+
event: 'onClick',
575+
bind: [ ... ],
576+
})
548577
```
549578

550579
### 属性修改
551580

552-
### 条件判断
581+
#### FrameType.setParam
582+
583+
设置单个属性。
584+
585+
##### 属性
586+
587+
属性名 | 类型 | 介绍
588+
-|-|-
589+
frame | Frame | 需要修改的 frame 句柄
590+
param | String | 属性名
591+
value | String/Frame.var/Number/Boolean | 新的值
592+
593+
##### 案例
594+
595+
参阅 [seek的使用案例](#seek-的使用案例) 案例
596+
597+
#### FrameType.setParamSizeAndPosition
598+
599+
同时设置 Size 或 Position 相关属性。相比较于 [FrameType.setParam](#frametypesetparam) 每次只能设置1个属性,对于常见的位置属性可以使用 `FrameType.setParamSizeAndPosition` 一次性设置。
600+
601+
##### 属性
602+
603+
类型中 None 代表可缺省,即不设置该属性。
604+
605+
属性名 | 类型 | 介绍
606+
-|-|-
607+
frame | Frame | 需要修改的 frame 句柄
608+
top | Number/Percent/None | 顶端
609+
bottom | Number/Percent/None | 底端
610+
left | Number/Percent/None | 左端
611+
right | Number/Percent/None | 右端
612+
visible | Boolean/None | 可视
613+
width | Number/Percent/None | 宽度
614+
height | Number/Percent/None | 高度
615+
opacity | Number/None | 透明度 0~1
616+
scaleWidth | Number/None | 宽度放缩系数
617+
scaleHeight | Number/None | 高度放缩系数
618+
619+
##### 案例
620+
621+
```js
622+
const image = ... // 创建image
623+
624+
// 调整Image位置
625+
const setPositon = operaData.createFrame(FrameType.setParamSizeAndPosition, {
626+
frame: image,
627+
top: 0,
628+
right: '10%',
629+
opacity: 0.5
630+
});
631+
632+
... // 在特定条件下触发 setPositon
633+
```
634+
635+
### 延迟执行
636+
637+
#### FrameType.setTimeout
638+
639+
类似 JavaScript `setTimeout` 的延迟执行。
640+
641+
##### 属性
642+
643+
属性名 | 类型 | 介绍
644+
-|-|-
645+
timeout | String/Number/Frame.var | 延迟时长,单位 ms
646+
cancel | Boolean | 取消状态,运行时赋值false可提前终止延迟执行
647+
648+
##### 事件
649+
650+
事件名 | 参数 | 介绍
651+
-|-|-
652+
onEnded | - | 当延迟结束后
653+
onCancel | - | 当主动取消时
654+
655+
##### 案例
656+
657+
```js
658+
const delay1000 = operaData.createFrame(FrameType.setTimeout, {
659+
timeout: 1000, // 1000ms
660+
});
661+
662+
delay1000.setEvent({
663+
event: 'onEnded',
664+
bind: [ ... ] // 1000ms 后执行的关键动作帧/故事线
665+
});
666+
```
553667

554668
### 动画相关
555669

556-
### 全局变量
670+
#### FrameType.createAnimationFunction
557671

558-
## 6.常见Q&A
672+
创建动画函数,使得视图组件的某(几)个属性能够按照持续时间完成渐变。无需考虑卸载动画函数,当动画函数被作用的关键动作帧句柄不可视状态时,动画函数将自动结束。
559673

560-
#### 6.1 图片资源可以使用网络图片吗?
561-
目前图片资源只能存放于小游戏 minigame 目录中,不可使用网络图片。
674+
动画在微信开发者工具(模拟器)中表现异常,以真机表现为准。
562675

563-
#### 6.2 为什么要放首帧图片(firstFramePic)
564-
图片资源是跟随微信小游戏包上传至微信服务器,所以在小游戏主逻辑运行时,图片资源也处于就绪状态可以同步加载,因此玩家打开游戏时首帧将看到具体的游戏画面。而视频是存放在CDN的远程资源,不可避免的存在加载延迟问题,所以配置好首帧图片后,在视频可播放后再隐藏图片资源。
676+
##### 属性
677+
678+
属性名 | 类型 | 介绍
679+
-|-|-
680+
frame | Frame | 动画被作用的关键动作帧句柄
681+
duration | String/Frame.var | 持续时长
682+
easing | String/Frame.var | 曲率函数,如 ease-out
683+
top | Number/Percent/None | 顶端
684+
bottom | Number/Percent/None | 底端
685+
left | Number/Percent/None | 左端
686+
right | Number/Percent/None | 右端
687+
visible | Boolean/None | 可视
688+
width | Number/Percent/None | 宽度
689+
height | Number/Percent/None | 高度
690+
opacity | Number/None | 透明度 0~1
691+
scaleWidth | Number/None | 宽度放缩系数
692+
scaleHeight | Number/None | 高度放缩系数
693+
694+
##### 事件
695+
696+
事件名 | 参数 | 介绍
697+
-|-|-
698+
onEnded | - | 当动画结束后。
699+
700+
##### 演示
701+
702+
使用动画实现贴图按钮“点击继续”的「呼吸态」是最常见的实用应用,本演示将提供呼吸态按钮的实现:
703+
704+
```js
705+
// 一个位于底部的 点击继续按钮
706+
const button = operaData.createFrame(FrameType.createImage, {
707+
bottom: 20,
708+
left: '50%',
709+
width: 100,
710+
height: 25,
711+
url: 'launchOperaPlay/click_go_on.png'
712+
});
713+
714+
// 创建一个淡出的动画(透明度从 1->0.2)
715+
const goonButtonAnimationFadeOut = operaData.createFrame(
716+
FrameType.createAnimationFunction,
717+
{
718+
opacity: 0.2,
719+
duration: 1000,
720+
easing: 'ease-out',
721+
frame: button,
722+
},
723+
);
724+
// 再创建一个淡入的动画(透明度从 0.2->1)
725+
const goonButtonAnimationFadeIn = operaData.createFrame(
726+
FrameType.createAnimationFunction,
727+
{
728+
opacity: 1,
729+
duration: 1000,
730+
easing: 'ease-out',
731+
frame: button,
732+
},
733+
);
565734

566-
#### 6.3 如何托管自己的剧本?
735+
// 需要两个 Animation 结束后互相调用,即 淡入->结束->淡出->结束->... 循环之
736+
goonButtonAnimationFadeOut.setEvent({
737+
event: 'onEnded',
738+
bind: goonButtonAnimationFadeIn,
739+
keep: true, // keep = true 很关键,因为该事件将被反复执行
740+
});
741+
goonButtonAnimationFadeIn.setEvent({
742+
event: 'onEnded',
743+
bind: goonButtonAnimationFadeOut,
744+
keep: true,
745+
});
567746

568-
你可以将本仓库 Fork 至自己 GitHub 名下,私有化后独立维护剧本创作。
747+
// 挂载一个适合的故事线中触发后则实现「呼吸态」
748+
storyLineX.add(button, goonButtonAnimationFadeOut);
749+
```
569750

570-
## 7.分享你的模板
751+
### 全局变量
571752

572-
如果你很了解启动剧情剧本的设计,非常欢迎分享出你设计的剧情。请 Fork 本仓库后进行相应的创作,并提交至本仓库。
753+
### 条件判断
573754

574-
你的作品需存放至 `template` 的子目录中,子目录名称根据时间先后数字排序(提交后可能被二次修改),将作品名称填写至作品目录的 `readme.md` 文件头(长度不要超过10个中文字符),正如 `template/0/readme.md` 相同的格式。
755+
条件判断
575756

576-
注意:提交仅接受剧情相关文件,如贴图、.ts剧情撰写代码、说明文档,并且切换模板能够正常播放体验。
757+
### 上报
577758

578-
请勿提供未确认版权的演示内容。
759+
## 6.常见Q&A
760+
761+
#### 6.1 图片资源可以使用网络图片吗?
762+
目前图片资源只能存放于小游戏 minigame 目录中,不可使用网络图片。
763+
764+
#### 6.2 为什么要放首帧图片(firstFramePic)
765+
图片资源是跟随微信小游戏包上传至微信服务器,所以在小游戏主逻辑运行时,图片资源也处于就绪状态可以同步加载,因此玩家打开游戏时首帧将看到具体的游戏画面。而视频是存放在CDN的远程资源,不可避免的存在加载延迟问题,所以配置好首帧图片后,在视频可播放后再隐藏图片资源。

0 commit comments

Comments
 (0)