使用CocosCreator制作PPT

Shawn前段时间尝试用Cocos Creator做了一个PPT,发现还挺好玩的,有很多东西值得去研究,这里给大家分享一点使用Creator制作PPT的一些思路和方法。

1. 页面切换

相信大多数人都知道,PPT是由一页页顺序组成的幻灯片所构成,在Creator中直接使用场景来充当灯片页面是最简单的方式,看下图:

使用场景做PPT页面

页面之间的衔接有两种方式,一种是使用我们之前讲在过的场景切换组件LoadScene,将组件挂载到一个节点上,点击即可切换,看下图:

LoadScene组件

这种方式就像做超链接,用起来是简单,但需要一页页地去配置。Shawn这里还尝试了一种方式,编写一个导航组件,解析所有场景文件名并做一个排序,提供向前翻页、向后翻页的接口函数,可以提供Button组件调用,看下面代码:

//Navigation.js
cc.Class({
    extends: cc.Component,
    onLoad () {
    this.pageIndex = 0;
        //获取所有场景并排序
        this._sceneArray = cc.game._sceneInfos.sort((info1, info2) => {
            let num1 = parseFloat(cc.path.basename(info1.url, '.fire').split('-')[1]);
            let num2 = parseFloat(cc.path.basename(info2.url, '.fire').split('-')[1]);
            return num1 - num2;
        });
        //设置为常驻节点
        cc.game.addPersistRootNode(this.node);
        this.node.on(cc.Node.EventType.TOUCH_END, () => {
            this.loadScene();
        });
    },
    
    //根据pageIndex变量加载场景
    loadScene() {
        let info = this._sceneArray[this.pageIndex];
        if (info) {
            cc.director._loadSceneByUuid(info.uuid);
        }
    },
    
    //修改pageIndex
    next() {
        this.pageIndex++;
        this.loadScene();
    },
    
    //修改pageIndex
    back() {
        this.pageIndex--;
        this.loadScene();
    },
});

将上面这个组件挂载到首场景的一个节点上,在内部放入两个按钮,一个调用组件的next方法,一个调用back方法,看下图:

Navigation组件.jpg

有了这个导航组件,只需要注意场景命名就行了,场景中的内容尽量使用Widget组件做好相对布局与自适应。

2. 内容逐一显示

在PPT中加入一些互动操作,比如点击屏幕时让文字或内容逐一显示,比如像下面演示一样:


点击逐一显示.gif

这个操作实现的方法有很多,我在这里写了一个组件脚本,将要控制的节点收集起来,在组件start运行时将节点全部隐藏。

收集要控制的节点.png

老方法使用Button去调用ActiveNode.setActive函数:


使用Button调用组件方法.png

利用这个组件不管是显示图片和文字都可以,现在来看它还有些缺点,如果我们有几十个节点需要逐一显示,要拖动几十次,很是麻烦,如何解决这个问题,大家可以想一下。

在这个组件上还可以做一些扩展,一种是点击显示,一种是由时间间隔显示,可以让我们这个PPT的表现更丰富一点。

3. 点击切换图片

点击图片,切换下一张,可以使用之前讲过的SpriteIndex搞定,不过这里为了让组件少一点,使用起来简单一些,我是从cc.Sprite上继承的,看下代码:

let SpriteEx = cc.Class({
    extends: cc.Sprite,

    properties: {
        spriteFrames: [cc.SpriteFrame],

        _index: 0,
        index: {
            type: cc.Integer,
            range: [0, 100],
            set(value) {
                this._index = value % this.spriteFrames.length;
                this.spriteFrame = this.spriteFrames[this._index];
            },
            get() {
                return this._index;
            }
        }
    },

    next() {
        this.index++;
    },

});

//屏蔽一些cc.Sprite不需要的属性
cc.Class.Attr.setClassAttr(SpriteEx, 'spriteFrame', 'visible', false);
cc.Class.Attr.setClassAttr(SpriteEx, '_atlas', 'visible', false);
//条件显示cc.Sprite上的一些属性
cc.Class.Attr.setClassAttr(SpriteEx, 'fillType', 'visible', function() {
    return this._type === cc.Sprite.Type.FILLED;
});

cc.Class.Attr.setClassAttr(SpriteEx, 'fillCenter', 'visible', function() {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'fillStart', 'visible', function() {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'fillEnd', 'visible', function() {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'fillRange', 'visible', function() {
    return this._type === cc.Sprite.Type.FILLED;
});

cc.Class.Attr.setClassAttr(SpriteEx, 'srcBlendFactor', 'visible', function() {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'dstBlendFactor', 'visible', function() {
    return this._type === cc.Sprite.Type.FILLED;
});

module.exports = SpriteEx;

上面代码有点多,主要是继承cc.Sprite后会有一大堆属性会显示到属性面板上,会对组件的使用者产生不好的体验,使用可以cc.Class.Attr.setClassAttr来控制组件属性的显示。

SpriteEx.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,101评论 4 62
  • 命令 新建项目: cocos new -l js projectname 运行项目:cocos run -p we...
    LIsPeri阅读 4,591评论 0 2
  • 生命是一叶枯草 漂浮于睡眠的海 海的禁忌无人得知 我遵循古老的痕迹 拾起童年遗失的海螺 黄昏与流血类似的情意 穿过...
    深海的鲸看不见鱼阅读 415评论 0 1
  • 我的家乡,她是一个美丽的城市她在我国历史上有着不可估量的价值,在2017年,仍被保留文明城市的资格,她就是我国的十...
    12345never阅读 537评论 3 17
  • 大家好,我知道你们要问我为什么想入会,在我回答这个问题之前,我想先问你们两个问题。 第一, 我们都会死,对...
    殷大侠阅读 1,006评论 4 5