@@ -247,13 +247,12 @@ FrameType | 释义
247
247
[ playAudio] ( #frametypeplayaudio ) | 将某个音频组件进行继续播放
248
248
[ createImage] ( #frametypecreateimage ) | 创建贴图
249
249
[ createRect] ( #frametypecreaterect ) | 创建矩形区域(可透明、填充纯色、用于区域点击识别)
250
+ [ setParam] ( #frametypesetparam ) | 设置某个关键动作帧的属性
251
+ [ setParamSizeAndPosition] ( #frametypesetparamsizeandposition ) | 同时设置组件的Size、Position属性
252
+ [ setTimeout] ( #frametypesettimeout ) | 创建延迟执行
253
+ [ createAnimationFunction] ( #frametypecreateanimationfunction ) | 创建动画函数
254
+
250
255
[ var] ( ) | 创建全局变量
251
- [ setParam] ( ) | 设置某个关键动作帧的属性
252
- [ setTimeout] ( ) | 创建延迟执行
253
- [ setParamSize] ( ) | 设置组件的Size属性
254
- [ setParamPosition] ( ) | 设置组件的Position属性
255
- [ setParamSizeAndPosition] ( ) | 同时设置组件的Size、Position属性
256
- [ createAnimationFunction] ( ) | 创建动画函数
257
256
[ if] ( ) | 条件判断
258
257
[ report] ( ) | 创建上报节点
259
258
[ checkPoint] ( ) | 剧情检查点
@@ -343,11 +342,10 @@ video.setEvent({
343
342
video .setEvent ({
344
343
event : ' onPlayTimeAt' ,
345
344
...
346
- })
347
-
345
+ });
348
346
```
349
347
350
- seek 的使用:
348
+ ###### seek 的使用案例
351
349
352
350
seek 需要配合 Frame.SetParam 使用,意味其他事件触发 Frame.SetParam 后为 video 关键动作帧赋值 seek 则产生视频跳转,如需了解 SetParam 请移步特定章节阅读,此处给出 seek 案例:
353
351
@@ -515,7 +513,23 @@ onClick | - | 当贴图被点击
515
513
##### 案例
516
514
517
515
``` 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
+ });
519
533
```
520
534
521
535
#### FrameType.createRect
@@ -544,35 +558,208 @@ onClick | - | 当贴图被点击
544
558
##### 案例
545
559
546
560
``` 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
+ })
548
577
```
549
578
550
579
### 属性修改
551
580
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
+ ```
553
667
554
668
### 动画相关
555
669
556
- ### 全局变量
670
+ #### FrameType.createAnimationFunction
557
671
558
- ## 6.常见Q&A
672
+ 创建动画函数,使得视图组件的某(几)个属性能够按照持续时间完成渐变。无需考虑卸载动画函数,当动画函数被作用的关键动作帧句柄不可视状态时,动画函数将自动结束。
559
673
560
- #### 6.1 图片资源可以使用网络图片吗?
561
- 目前图片资源只能存放于小游戏 minigame 目录中,不可使用网络图片。
674
+ 动画在微信开发者工具(模拟器)中表现异常,以真机表现为准。
562
675
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
+ );
565
734
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
+ });
567
746
568
- 你可以将本仓库 Fork 至自己 GitHub 名下,私有化后独立维护剧本创作。
747
+ // 挂载一个适合的故事线中触发后则实现「呼吸态」
748
+ storyLineX .add (button, goonButtonAnimationFadeOut);
749
+ ```
569
750
570
- ## 7.分享你的模板
751
+ ### 全局变量
571
752
572
- 如果你很了解启动剧情剧本的设计,非常欢迎分享出你设计的剧情。请 Fork 本仓库后进行相应的创作,并提交至本仓库。
753
+ ### 条件判断
573
754
574
- 你的作品需存放至 ` template ` 的子目录中,子目录名称根据时间先后数字排序(提交后可能被二次修改),将作品名称填写至作品目录的 ` readme.md ` 文件头(长度不要超过10个中文字符),正如 ` template/0/readme.md ` 相同的格式。
755
+ 条件判断
575
756
576
- 注意:提交仅接受剧情相关文件,如贴图、.ts剧情撰写代码、说明文档,并且切换模板能够正常播放体验。
757
+ ### 上报
577
758
578
- 请勿提供未确认版权的演示内容。
759
+ ## 6.常见Q&A
760
+
761
+ #### 6.1 图片资源可以使用网络图片吗?
762
+ 目前图片资源只能存放于小游戏 minigame 目录中,不可使用网络图片。
763
+
764
+ #### 6.2 为什么要放首帧图片(firstFramePic)
765
+ 图片资源是跟随微信小游戏包上传至微信服务器,所以在小游戏主逻辑运行时,图片资源也处于就绪状态可以同步加载,因此玩家打开游戏时首帧将看到具体的游戏画面。而视频是存放在CDN的远程资源,不可避免的存在加载延迟问题,所以配置好首帧图片后,在视频可播放后再隐藏图片资源。
0 commit comments