Skip to content

Commit 8718efd

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

File tree

1 file changed

+298
-15
lines changed

1 file changed

+298
-15
lines changed

Design/LaunchOperaDocument.md

+298-15
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ lacop watch
5454

5555
可能与平时开发小程序/小游戏直接在 `微信开发者工具` 修改剧本不同的是,你无需修改 `/minigame` 目录中的任何资源,因为这是一个动态构建的产物,他会随着 `/src` 目录中的资源变化被不断覆盖。所以你真正需要修改的是 `/src` 中的代码资源。
5656

57-
接下来请你使用 JavaScript 代码编辑器打开本仓库目录(如 VSCode 打开),找到 `/src/launchOperaPlay/index.ts` 脚本。
57+
接下来请你使用 JavaScript 代码编辑器打开当前工程目录(如 VSCode 打开),找到 `/src/launchOperaPlay/index.ts` 脚本。
5858

5959
请修改脚本中大约第 51 行的 skipButton 的 setParams 参数为:
6060

@@ -84,15 +84,15 @@ skipButton.setParams({
8484
lacop build
8585
```
8686

87-
等待程序执行结束后,你将在本仓库根目录看到 `/release` 目录,此时你可以将 release 目录内资源放到你的正式游戏工程导出的 minigame 目录下使用。
87+
等待程序执行结束后,你将在根目录看到 `/release` 目录,此时你可以将 release 目录内资源放到你的正式游戏工程导出的 minigame 目录下使用。
8888

8989
有关图片资源路径问题请阅读 [常见Q&A](#常见qa) 中说明。
9090

9191
至此你已经完成了一次很小变动的剧本导出工作。
9292

9393
#### Step7 尝试更多的模板
9494

95-
启动剧情能够设计很复杂的交互剧情内容,但是这对于初学者还需要阅读本文更多的内容,后续请查阅 [进阶指南](#4进阶指南)。如果你想快速应用场景,类似 Step5 中这样仅修改属性值就可以替换成自己的游戏素材还是十分便捷。我们提供了多种模板可供选择,只需要在命令行中输入 `lacop template` 可以快速切换提供的多种模板效果拿来使用。
95+
启动剧情能够设计很复杂的交互剧情内容,但是这对于初次使用的开发者还需要阅读本文更多的内容,后续请查阅 [进阶指南](#4进阶指南)。如果你想快速应用场景,类似 Step5 中这样仅修改属性值就可以替换成自己的游戏素材还是十分便捷。我们提供了多种模板可供选择,只需要在命令行中输入 `lacop template` 可以快速切换提供的多种模板效果拿来使用。
9696

9797
**实际上你可以直接执行 `lacop` 而无需带后面的参数进行能力的自主选择**
9898

@@ -137,6 +137,7 @@ const skipButton = operaData.createFrame(FrameType.createImage, {
137137

138138
// 也可以创建后再修改其属性,与上面的写法实际效果完全一样
139139
const skipButton = operaData.createFrame(FrameType.createImage);
140+
140141
skipButton.setParams({
141142
url: `launchOpera/skip_button.png`,
142143
right: 25,
@@ -210,10 +211,10 @@ skipButton.setEvents({
210211
// 创建
211212
const storyLine = operaData.createStoryLine();
212213

213-
// 创建一系列的动作帧.....
214+
// 创建一系列的动作帧...
214215

215216
// 如需添加动作帧
216-
storyLine.add(var_GC_GUIDE_STEP, startImg, video1, ..... );
217+
storyLine.add(var_GC_GUIDE_STEP, startImg, video1, ... );
217218
```
218219

219220
##### 4.2.2.2 主故事线
@@ -238,14 +239,14 @@ storyLine.add(var_GC_GUIDE_STEP, startImg, video1, ..... );
238239

239240
FrameType | 释义
240241
-|-
241-
[createVideo](#createvideo)| 创建视频组件
242-
[pauseVide]()| 将某个视频组件进行暂停
243-
[playVideo]()| 将某个视频组件进行继续播放
244-
[createAudio]()| 创建音频组件
245-
[pauseAudio]()| 将某个音频组件进行暂停
246-
[playAudio]()| 将某个音频组件进行继续播放
247-
[createImage]()| 创建贴图
248-
[createRect]()| 创建矩形区域(可透明、填充纯色、用于区域点击识别)
242+
[createVideo](#frametypecreatevideo)| 创建视频组件
243+
[pauseVide](#frametypepausevideo)| 将某个视频组件进行暂停
244+
[playVideo](#frametypeplayvideo)| 将某个视频组件进行继续播放
245+
[createAudio](#frametypecreateaudio)| 创建音频组件
246+
[pauseAudio](#frametypepauseaudio)| 将某个音频组件进行暂停
247+
[playAudio](#frametypeplayaudio)| 将某个音频组件进行继续播放
248+
[createImage](#frametypecreateimage)| 创建贴图
249+
[createRect](#frametypecreaterect)| 创建矩形区域(可透明、填充纯色、用于区域点击识别)
249250
[var]()| 创建全局变量
250251
[setParam]()| 设置某个关键动作帧的属性
251252
[setTimeout]()| 创建延迟执行
@@ -258,20 +259,302 @@ FrameType | 释义
258259
[checkPoint]()| 剧情检查点
259260
[reportCheckPointCount]()| 上报剧情检查点个数
260261

262+
### 类型约定
263+
264+
类型主要包括以下几种:
265+
266+
类型名 | 说明
267+
-|-
268+
String | 字符串
269+
Boolean | 布尔值
270+
Number | 数值
271+
None | 可缺省值
272+
Percent | 百分比字符串,如 30%
273+
Frame | 关键动作帧句柄,如 Frame.var 只接受 FrameType 为 var 的句柄
274+
275+
### 空间描述约定
276+
277+
在描述组件的空间位置时,提供了几种简单的描述几乎可以满足大部分的使用需要。
278+
279+
空间描述主要涉及:left、right、top、bottom、width、height 5个属性,这5个属性均支持缺省(None),实际上描述一个组件在屏幕中的位置有时不需要将5个属性完全设置,比如当你规定了 left=0、right=0 时,也就意味着 width=屏幕宽度(width=100%),同理当你 left=0、width=100%,自然right也就=0。
280+
281+
在处理相对位置的时候有时 Number 与 Percent 可能都不能满足你的需要,比如:left=50% 代表屏幕中间,但是你希望屏幕中间再靠左10像素,就无法直接使用 Percent 实现,因为不同用户的设备宽度是不相同的,此时用到 calc 表达式方式,比如刚刚的案例中你可以这样描述: left=calc(50%-10) 就可以了。
282+
261283
### 视频相关
262284

263-
#### createVideo
285+
#### FrameType.createVideo
264286

265287
创建视频组件。
266288

267289
##### 属性
268290

269-
...
291+
属性名 | 类型 | 介绍
292+
-|-|-
293+
top | Number/Percent | 顶端。可参阅[空间描述约定](#空间描述约定)
294+
bottom | Number/Percent | 底端
295+
left | Number/Percent | 左端
296+
right | Number/Percent | 右端
297+
visible | Boolean | 可视
298+
width | Number/Percent | 宽度
299+
height | Number/Percent | 高度
300+
url | String/Frame.var | 视频资源CDN地址
301+
autoPlay | Boolean | 是否自动播放
302+
playing | Boolean | 是否播放中
303+
objectFit | String/Frame.var | 视频的缩放模式,可选值:fill(填充拉伸)、contain(包含,可能有黑边)、cover(覆盖,可能有部分内容溢出屏幕)
304+
seek | Number/String/Frame.var | 视频跳转到特定秒数,如果 < 0 则不跳转
305+
loop | Boolean | 是否循环播放
306+
307+
##### 事件
308+
309+
事件名 | 参数 | 介绍
310+
-|-|-
311+
onPlayTimeAt | sec:Number | 当播放到第sec秒数时(sec单位:秒)
312+
onEnded | - | 视频播放结束时
313+
onPlay | - | 视频开始播放时
314+
315+
##### 案例
316+
317+
```js
318+
const video = operaData.createFrame(FrameType.createVideo);
319+
320+
video.setParams({
321+
// 全屏视频
322+
left: 0,
323+
right: 0,
324+
top: 0,
325+
bottom: 0,
326+
// 视频完整呈现,可能存在黑边
327+
objectFit: 'contain',
328+
// 视频CDN
329+
url: 'http://abc.com/xx.mp4',
330+
autoPlay: true,
331+
});
332+
333+
// 播放 1.5s 时触发新的关键动作帧
334+
video.setEvent({
335+
event: 'onPlayTimeAt',
336+
param: {
337+
sec: 1.5,
338+
},
339+
bind: [ xxxx ] // 新的关键动作帧/故事线
340+
});
341+
342+
// 可以创建多个事件,互相独立
343+
video.setEvent({
344+
event: 'onPlayTimeAt',
345+
...
346+
})
347+
348+
```
349+
350+
seek 的使用:
351+
352+
seek 需要配合 Frame.SetParam 使用,意味其他事件触发 Frame.SetParam 后为 video 关键动作帧赋值 seek 则产生视频跳转,如需了解 SetParam 请移步特定章节阅读,此处给出 seek 案例:
353+
354+
```js
355+
const video = ... // 创建video
356+
357+
// 创建一个 setParam ,对 video 的 seek 属性设置为 10
358+
// 意味着当触发 seek0 时,video 组件视频将从10秒的位置开始播放
359+
const seek0 = operaData.createFrame(FrameType.setParam, {
360+
frame: video,
361+
param: 'seek',
362+
value: '10'
363+
});
364+
365+
... // 在特定条件下触发 seek0
366+
```
367+
368+
#### FrameType.pauseVideo
369+
370+
暂停视频。
371+
372+
##### 属性
373+
374+
属性名 | 类型 | 介绍
375+
-|-|-
376+
video | Frame.createVideo | 需要暂停的视频的关键动作帧句柄
377+
378+
##### 案例
379+
380+
```js
381+
const video = ... // 创建video
382+
383+
const playVideo0 = operaData.createFrame(FrameType.playVideo, {
384+
video: video,
385+
});
386+
387+
... // 在特定条件下触发 playVideo0
388+
```
389+
390+
#### FrameType.playVideo
391+
392+
(继续)播放视频。
393+
394+
##### 属性
395+
396+
属性名 | 类型 | 介绍
397+
-|-|-
398+
video | Frame.createVideo | 需要(继续)播放的视频的关键动作帧句柄
399+
400+
##### 案例
401+
402+
[FrameType.pauseVideo](#frametypepausevideo) 使用。
403+
404+
### 音频相关
405+
406+
#### FrameType.createAudio
407+
408+
创建音频组件。
409+
410+
##### 属性
411+
412+
属性名 | 类型 | 介绍
413+
-|-|-
414+
url | String/Frame.var | 音频资源CDN地址
415+
autoPlay | Boolean | 是否自动播放
416+
playing | Boolean | 是否播放中
417+
seek | Number/String/Frame.var | 视频跳转到特定秒数,如果 < 0 则不跳转
418+
loop | Boolean | 是否循环播放
419+
volume | Number | 音量,0~1之间的数值,默认为1
420+
421+
##### 事件
422+
423+
事件名 | 参数 | 介绍
424+
-|-|-
425+
onPlayTimeAt | sec:Number | 当播放到第sec秒数时(sec单位:秒)
426+
onEnded | - | 音频播放结束时
427+
onPlay | - | 音频开始播放时
428+
429+
##### 案例
430+
431+
```js
432+
const audio = operaData.createFrame(FrameType.createAudio);
433+
434+
audio.setParams({
435+
// 视频CDN
436+
url: 'http://abc.com/xx.mp3',
437+
autoPlay: true,
438+
});
439+
440+
// 播放 1.5s 时触发新的关键动作帧
441+
audio.setEvent({
442+
event: 'onPlayTimeAt',
443+
param: {
444+
sec: 1.5,
445+
},
446+
bind: [ xxxx ] // 新的关键动作帧/故事线
447+
});
448+
449+
// 可以创建多个事件,互相独立
450+
audio.setEvent({
451+
event: 'onPlayTimeAt',
452+
...
453+
})
454+
```
455+
456+
#### FrameType.pauseAudio
457+
458+
暂停音频。
459+
460+
##### 属性
461+
462+
属性名 | 类型 | 介绍
463+
-|-|-
464+
audio | Frame.createAudio | 需要暂停的音频的关键动作帧句柄
465+
466+
##### 案例
467+
468+
[FrameType.pauseVideo](#frametypepausevideo) 使用。
469+
470+
#### FrameType.playAudio
471+
472+
(继续)播放音频。
473+
474+
##### 属性
475+
476+
属性名 | 类型 | 介绍
477+
-|-|-
478+
audio | Frame.createAudio | 需要(继续)播放的音频的关键动作帧句柄
479+
480+
##### 案例
481+
482+
[FrameType.pauseVideo](#frametypepausevideo) 使用。
483+
484+
485+
### 贴图相关
486+
487+
#### FrameType.createImage
488+
489+
创建贴图组件。
490+
491+
贴图只能加载小游戏包内图片资源,并且需要主动设置高宽(不会自动读取贴图资源尺寸)。
492+
493+
##### 属性
494+
495+
属性名 | 类型 | 介绍
496+
-|-|-
497+
top | Number/Percent | 顶端。可参阅[空间描述约定](#空间描述约定)
498+
bottom | Number/Percent | 底端
499+
left | Number/Percent | 左端
500+
right | Number/Percent | 右端
501+
visible | Boolean | 可视
502+
width | Number/Percent | 宽度
503+
height | Number/Percent | 高度
504+
opacity | Number | 透明度 0~1
505+
url | String/Frame.var | 图片资源本地路径
506+
scaleWidth | Number | 宽度放缩系数
507+
scaleHeight | Number | 高度放缩系数
508+
509+
##### 事件
510+
511+
事件名 | 参数 | 介绍
512+
-|-|-
513+
onClick | - | 当贴图被点击
514+
515+
##### 案例
516+
517+
```js
518+
// 案例
519+
```
520+
521+
#### FrameType.createRect
522+
523+
创建透明、纯色矩形区域,通常用于透明点击区域、背景色。
524+
525+
##### 属性
526+
527+
属性名 | 类型 | 介绍
528+
-|-|-
529+
top | Number/Percent | 顶端。可参阅[空间描述约定](#空间描述约定)
530+
bottom | Number/Percent | 底端
531+
left | Number/Percent | 左端
532+
right | Number/Percent | 右端
533+
visible | Boolean | 可视
534+
width | Number/Percent | 宽度
535+
height | Number/Percent | 高度
536+
color | String | 十六进制颜色描述字符串(如:#FFFFFF00)
270537

271538
##### 事件
272539

540+
事件名 | 参数 | 介绍
541+
-|-|-
542+
onClick | - | 当贴图被点击
543+
273544
##### 案例
274545

546+
```js
547+
// 案例
548+
```
549+
550+
### 属性修改
551+
552+
### 条件判断
553+
554+
### 动画相关
555+
556+
### 全局变量
557+
275558
## 6.常见Q&A
276559

277560
#### 6.1 图片资源可以使用网络图片吗?

0 commit comments

Comments
 (0)