@@ -54,7 +54,7 @@ lacop watch
54
54
55
55
可能与平时开发小程序/小游戏直接在 ` 微信开发者工具 ` 修改剧本不同的是,你无需修改 ` /minigame ` 目录中的任何资源,因为这是一个动态构建的产物,他会随着 ` /src ` 目录中的资源变化被不断覆盖。所以你真正需要修改的是 ` /src ` 中的代码资源。
56
56
57
- 接下来请你使用 JavaScript 代码编辑器打开本仓库目录 (如 VSCode 打开),找到 ` /src/launchOperaPlay/index.ts ` 脚本。
57
+ 接下来请你使用 JavaScript 代码编辑器打开当前工程目录 (如 VSCode 打开),找到 ` /src/launchOperaPlay/index.ts ` 脚本。
58
58
59
59
请修改脚本中大约第 51 行的 skipButton 的 setParams 参数为:
60
60
@@ -84,15 +84,15 @@ skipButton.setParams({
84
84
lacop build
85
85
```
86
86
87
- 等待程序执行结束后,你将在本仓库根目录看到 ` /release ` 目录,此时你可以将 release 目录内资源放到你的正式游戏工程导出的 minigame 目录下使用。
87
+ 等待程序执行结束后,你将在根目录看到 ` /release ` 目录,此时你可以将 release 目录内资源放到你的正式游戏工程导出的 minigame 目录下使用。
88
88
89
89
有关图片资源路径问题请阅读 [ 常见Q&A] ( #常见qa ) 中说明。
90
90
91
91
至此你已经完成了一次很小变动的剧本导出工作。
92
92
93
93
#### Step7 尝试更多的模板
94
94
95
- 启动剧情能够设计很复杂的交互剧情内容,但是这对于初学者还需要阅读本文更多的内容 ,后续请查阅 [ 进阶指南] ( #4进阶指南 ) 。如果你想快速应用场景,类似 Step5 中这样仅修改属性值就可以替换成自己的游戏素材还是十分便捷。我们提供了多种模板可供选择,只需要在命令行中输入 ` lacop template ` 可以快速切换提供的多种模板效果拿来使用。
95
+ 启动剧情能够设计很复杂的交互剧情内容,但是这对于初次使用的开发者还需要阅读本文更多的内容 ,后续请查阅 [ 进阶指南] ( #4进阶指南 ) 。如果你想快速应用场景,类似 Step5 中这样仅修改属性值就可以替换成自己的游戏素材还是十分便捷。我们提供了多种模板可供选择,只需要在命令行中输入 ` lacop template ` 可以快速切换提供的多种模板效果拿来使用。
96
96
97
97
** 实际上你可以直接执行 ` lacop ` 而无需带后面的参数进行能力的自主选择**
98
98
@@ -137,6 +137,7 @@ const skipButton = operaData.createFrame(FrameType.createImage, {
137
137
138
138
// 也可以创建后再修改其属性,与上面的写法实际效果完全一样
139
139
const skipButton = operaData .createFrame (FrameType .createImage );
140
+
140
141
skipButton .setParams ({
141
142
url: ` launchOpera/skip_button.png` ,
142
143
right: 25 ,
@@ -210,10 +211,10 @@ skipButton.setEvents({
210
211
// 创建
211
212
const storyLine = operaData .createStoryLine ();
212
213
213
- // 创建一系列的动作帧.....
214
+ // 创建一系列的动作帧...
214
215
215
216
// 如需添加动作帧
216
- storyLine .add (var_GC_GUIDE_STEP, startImg, video1, ... .. );
217
+ storyLine .add (var_GC_GUIDE_STEP, startImg, video1, ... );
217
218
```
218
219
219
220
##### 4.2.2.2 主故事线
@@ -238,14 +239,14 @@ storyLine.add(var_GC_GUIDE_STEP, startImg, video1, ..... );
238
239
239
240
FrameType | 释义
240
241
-|-
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 ) | 创建矩形区域(可透明、填充纯色、用于区域点击识别)
249
250
[ var] ( ) | 创建全局变量
250
251
[ setParam] ( ) | 设置某个关键动作帧的属性
251
252
[ setTimeout] ( ) | 创建延迟执行
@@ -258,20 +259,302 @@ FrameType | 释义
258
259
[ checkPoint] ( ) | 剧情检查点
259
260
[ reportCheckPointCount] ( ) | 上报剧情检查点个数
260
261
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
+
261
283
### 视频相关
262
284
263
- #### createVideo
285
+ #### FrameType. createVideo
264
286
265
287
创建视频组件。
266
288
267
289
##### 属性
268
290
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)
270
537
271
538
##### 事件
272
539
540
+ 事件名 | 参数 | 介绍
541
+ -|-|-
542
+ onClick | - | 当贴图被点击
543
+
273
544
##### 案例
274
545
546
+ ``` js
547
+ // 案例
548
+ ```
549
+
550
+ ### 属性修改
551
+
552
+ ### 条件判断
553
+
554
+ ### 动画相关
555
+
556
+ ### 全局变量
557
+
275
558
## 6.常见Q&A
276
559
277
560
#### 6.1 图片资源可以使用网络图片吗?
0 commit comments