Cocos实例2:实现VideoPlayer奥利奥夹心饼干

实现VideoPlayer奥利奥夹心饼干

在CocosCreator中,VideoPlayer 支持的视频格式为 mp4,所以在需要使用到VideoPlayer组件时,确保视频资源是正确的编码和格式。另外不同平台对于 VideoPlayer 组件的授权、API都不同,并没有形成统一的标准,Creator中的VideoPlayer组件目前只支持 Web、iOS、Android。该实例以Web平台为例子。Creator版本为3.6.3。

如何实现VideoPlayer夹心饼干

因为VideoPlayer 组件独特渲染机制的限制,在CocosCreator中默认是显示在canvas的上层,引擎也提供了设置Video在canvas下层的方式,以官方文档中所提供的方法,VideoPlayer只能显示在最上层或最下层,没法做夹心饼干。例如想要把视频放在一个UI背景上,在视频的上方也要有可以交互的UI按钮等。于是想了一种方法:结合Mask组件实现该效果。
  • 原理:
    1.设置VideoPlayer在最下层显示;
    2.添加背景,结合Mask组件在该背景上 “挖出” 一个刚好能显示VideoPlayer的洞;
    3.添加可以交互的UI
  • 实例
    • 准备资源
      1.一张背景图片
      2.一个Mp4文件
    • 搭建UI
      在这里插入图片描述
      大致如上图。
      接下来挖个洞来显示视频,创建一个反向遮罩,把上面搭建的UI节点们放在遮罩下面
      在这里插入图片描述

另外还需要注意一点:除了勾选“stayOnBottom”,还需要在Creator的 项目设置 -> 宏配置中勾选 ENABLE_TRANSPARENT_CANVAS
在这里插入图片描述
如果不设置Canvas透明支持,即使视频包含透明区域,这部分也会被Canvas的不透明背景色填充,导致看不到视频。
搭建UI就到这里,接下来要实现预览界面中,视频刚好显示在空白的广告牌中,功能按钮点击可以控制视频播放。
- 编写脚本VideoCtrl.ts

import { _decorator, Component, Label, Node, Slider, VideoPlayer } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('VideoCtrl')
export class VideoCtrl extends Component {
    // 定义一个VideoPlayer类型的属性,名称为test_video,初始值为null
    @property(VideoPlayer)
    test_video: VideoPlayer = null;
    // 定义一个Label类型的属性,名称为rate_Label,初始值为null
    @property(Label)
    rate_Label:Label = null;

    // 定义一个私有变量,名称为_playRate,初始值为1
    _playRate:number = 1;
    // 定义一个点击播放的方法
    onClickPlay(){
        // 调用test_video的play方法
        this.test_video.play();
    }
    // 定义一个点击暂停的方法
    onClickPause(){
        // 调用test_video的pause方法
        this.test_video.pause();
    }
    // 定义一个点击重新开始的方法
    onClickResume(){
        // 调用test_video的resume方法
        this.test_video.resume();
    }

    // 定义一个滑动改变的方法
    onSlideChange(slider: Slider){
        // 调用test_video的currentTime方法,传入slider的progress乘以test_video的duration
        this.test_video.currentTime = slider.progress * this.test_video.duration;
    }
    // 定义一个改变播放速率的方法
    onChangeRate () {
        // 将_playRate加1,如果大于等于3,则重置为1,然后调用test_video的playbackRate方法,传入_playRate,最后调用rate_Label的string方法,传入_playRate的值
        this._playRate = this._playRate++ >= 3 ? 1 : this._playRate;
        this.test_video.playbackRate = this._playRate;
        this.rate_Label.string = `x${this._playRate}`;
    }
}

把它绑定到控制节点上,对应的引用属性都填好。
在这里插入图片描述

  • 运行预览

请添加图片描述

	看起来还不错
  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现 scrollView 的无限滚动,可以通过以下步骤: 1. 创建一个 scrollView,并将其滚动方向设置为水平(或垂直)方向。 2. 在 scrollView 中添加若干个节点,这些节点将作为滚动的内容。 3. 在 scrollView 中添加两个额外的节点,它们分别是第一个节点的复制和最后一个节点的复制。这些节点将用于实现无限滚动的效果。 4. 在 scrollView 的回调函数中,判断当前滚动的位置,如果滚动到了第一个节点或最后一个节点的复制,就将 scrollView 的位置设置到对应的节点上,从而实现无限滚动的效果。 下面是一个简单的示例代码,演示了如何实现 scrollView 的无限滚动: ```c++ // 创建 scrollView auto scrollView = cocos2d::ui::ScrollView::create(); scrollView->setDirection(cocos2d::ui::ScrollView::Direction::HORIZONTAL); scrollView->setContentSize(cocos2d::Size(600, 200)); scrollView->setInnerContainerSize(cocos2d::Size(1200, 200)); addChild(scrollView); // 添加节点 for (int i = 0; i < 5; i++) { auto node = cocos2d::LayerColor::create(cocos2d::Color4B(0, 255, 0, 255), 200, 200); node->setPosition(i * 200, 0); scrollView->addChild(node); } // 添加节点的复制 auto firstNode = scrollView->getChildren().at(0); auto lastNode = scrollView->getChildren().at(scrollView->getChildrenCount() - 1); auto firstNodeCopy = firstNode->clone(); firstNodeCopy->setPosition(lastNode->getPositionX() + 200, 0); scrollView->addChild(firstNodeCopy); auto lastNodeCopy = lastNode->clone(); lastNodeCopy->setPosition(firstNode->getPositionX() - 200, 0); scrollView->addChild(lastNodeCopy); // scrollView 的回调函数 scrollView->addEventListener([=](cocos2d::Ref* sender, cocos2d::ui::ScrollView::EventType eventType) { if (eventType == cocos2d::ui::ScrollView::EventType::CONTAINER_MOVED) { auto position = scrollView->getInnerContainerPosition(); if (position.x < -200) { auto lastNode = scrollView->getChildren().at(scrollView->getChildrenCount() - 2); scrollView->setInnerContainerPosition(cocos2d::Vec2(lastNode->getPositionX() + 200, 0)); } else if (position.x > 1000) { auto firstNode = scrollView->getChildren().at(1); scrollView->setInnerContainerPosition(cocos2d::Vec2(firstNode->getPositionX() - 200, 0)); } } }); ``` 在上面的代码中,我们创建了一个水平方向的 scrollView,并添加了 5 个绿色的节点。然后,我们在 scrollView 中添加了第一个节点和最后一个节点的复制,分别为 firstNodeCopy 和 lastNodeCopy。在 scrollView 的回调函数中,我们通过判断 scrollView 的位置,来实现对滚动位置的调整,从而实现了无限滚动的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值