CocosCreator載入界面動畫效果

【原創(chuàng)博文,轉(zhuǎn)載請注明出處!】

游戲中不少類似彈窗這樣的界面,比如設(shè)置、分享、用戶信息...,顯示的時候最暴力的方式就是設(shè)置根節(jié)點(diǎn)node.active = true or false;這樣界面通常在瞬間展現(xiàn),毫無動畫,有一種生硬的感覺。于是我嘗試寫了個通用動畫組件,給界面增加一種類似“FadeInFadeOut”的效果(為了演示效果,我故意將動畫縮放時間*2,所以GIF看起來有點(diǎn)慢??),先看一下GIF演示效果,如果覺得OK,可以繼續(xù)看下實現(xiàn)源碼(* ̄︶ ̄)。

CocosCreator界面載入動畫.gif

動畫效果組件FadeInFadeOut.js如下:

/*
 * FadeInFadeOut.js
 * 界面FadeInFadeOut效果
 * @Author: Rephontil 
 * @Date: 2018-09-19 10:16:48 
 * @Last Modified by: Rephontil
 * @Last Modified time: 2018-09-20 12:34:19
 */

cc.Class({
    extends: cc.Component,

    properties: {
        /**動畫速度 */
        defaultAnimSpeed: 0.15,
        /**界面圖層隊列 */
        viewQueue: new Array(),
        /**最頂層視圖對象 => { "pageNode": pageNode, "allNodeContainer": allNodeContainer } */
        toppestViewObject: null,
    },

    init() {
        // 動畫 
        var cbFadeOut = cc.callFunc(this.onFadeOutFinish, this);
        var cbFadeIn = cc.callFunc(this.onFadeInFinish, this);
        this.actionFadeIn = cc.sequence(cc.spawn(cc.fadeTo(this.defaultAnimSpeed, 255), cc.scaleTo(this.defaultAnimSpeed, 1.0)), cbFadeIn);
        this.actionFadeOut = cc.sequence(cc.spawn(cc.fadeTo(this.defaultAnimSpeed, 0), cc.scaleTo(this.defaultAnimSpeed, .2)), cbFadeOut);
    },

    /**
     * 執(zhí)行彈進(jìn)動畫
     * @param {界面根節(jié)點(diǎn)(包含黑色蒙版)} pageNode 
     * @param {需要進(jìn)行縮放的根節(jié)點(diǎn)(也就是去掉黑色蒙版后所有子節(jié)點(diǎn)父視圖)} allNodeContainer 
     */
    startFadeIn(pageNode, allNodeContainer) {
        cc.eventManager.pauseTarget(allNodeContainer, true);
        allNodeContainer.position = cc.p(0, 0);
        allNodeContainer.setScale(.2);
        allNodeContainer.opacity = 0;
        allNodeContainer.runAction(this.actionFadeIn);

        let viewObject = { "pageNode": pageNode, "allNodeContainer": allNodeContainer };
        this.viewQueue.push(viewObject);
        console.log("界面上FadeInFadeOut彈窗層數(shù)",this.viewQueue.length);
    },

    /**
     *  彈進(jìn)動畫完成回調(diào)
     */
    onFadeInFinish() {
        console.log("彈進(jìn)動畫完成回調(diào)");
        let index = this.viewQueue.length-1;
        let viewObject = this.viewQueue[index];
        cc.eventManager.resumeTarget(viewObject.allNodeContainer, true);
    },

    /**
     * 執(zhí)行彈出動畫
     */
    startFadeOut() {
        this.toppestViewObject = this.viewQueue.pop();
        cc.eventManager.pauseTarget(this.toppestViewObject.allNodeContainer, true);
        this.toppestViewObject.allNodeContainer.runAction(this.actionFadeOut);
    },

    /**
     * 彈出動畫完成回調(diào)
     */
    onFadeOutFinish() {
        this.toppestViewObject.pageNode.active = false;
        this.toppestViewObject = null;
        console.log("界面上FadeInFadeOut彈窗層數(shù)",this.viewQueue.length);
    },

});

解釋一下:

startFadeIn(pageNode, allNodeContainer) {};這個方法帶了兩個參數(shù)pageNode、allNodeContainer。
其中:
pageNode是整個界面的根節(jié)點(diǎn);
allNodeContainer是界面中需要做縮放部分的組件的根節(jié)點(diǎn);
貌似對這兩個參數(shù)的解釋有點(diǎn)繞口,沒事我截圖項目文件說明一下

項目節(jié)點(diǎn)關(guān)系.png

根據(jù)圖中的節(jié)點(diǎn)關(guān)系,由于我們這邊的設(shè)計需求,每個界面都有一個與手機(jī)屏幕等尺寸的灰色背景,展示彈窗內(nèi)容的部分因為比手機(jī)屏幕?。ㄒ簿褪菆D中的白色區(qū)域),如果整體都做縮放動畫,會影響視覺體驗。所以一般都是灰色背景瞬間鋪滿屏幕,內(nèi)容部分以動畫展現(xiàn),效果也就是上文中GIF的樣式。所以我的項目中這個界面的展現(xiàn)代碼是這樣實現(xiàn)的:

headImage() {
        this.myCardInfoLayer.active = true;
        cc.vv.fadeInFadeOut.startFadeIn(this.myCardInfoLayer, this.myCardInfoLayer.getChildByName("mycard_container_bg"));
    },

總結(jié)一下FadeInFadeOur.js使用方法:

  • ①新建FadeInFadeOur全局實例對象;
    (注: cc.vv是我的游戲項目中全局對象。這個我是參照麒麟子大神那個開源的幽麟游戲源碼,應(yīng)該不少CocosCreator朋友也這么寫的吧(*^^*))
 /**
   * 界面淡入淡出動畫效果
  */
  let FadeInFadeOur = require("FadeInFadeOur");
  cc.vv.fadeInFadeOut = new FadeInFadeOur();
  cc.vv.fadeInFadeOut.init();
  • ②設(shè)置界面顯示效果;
 this.shareLayer.active = true;
 cc.vv.fadeInFadeOut.startFadeIn(this.shareLayer,  this.shareLayer.getChildByName("share_bg"));

  • ③設(shè)置關(guān)閉界面效果。
 closeBtnOnClicked() {
     cc.vv.fadeInFadeOut.startFadeOut();
 },

github源腳本地址

圖片發(fā)自簡書App
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,994評論 2 59
  • 有時候,靜不下心來,完全是自己再給自己添堵。 無關(guān)的事,不要去想,不要去動腦子。 受到外界的影響太大了。 分清主次...
    希雅的花園閱讀 144評論 0 0
  • 我路過白羊 白羊也路過我 她脹痛的乳房沒有家 我想給她一個藥片 一個止痛的最后的藥片 潔白的羊毛貼近我 傻子 你流...
    liquorices閱讀 246評論 2 12
  • 摘戴隱形眼鏡小技巧: 1、戴上隱形眼鏡后不要急于閉眼睛,眼球先上下左右旋轉(zhuǎn)一下,等眼鏡和眼球前表面完美匹配后,再輕...
    陌雨123閱讀 1,227評論 0 0
  • 隱痛 且等待著 等待著你的問候 從你的口中 到我的心里 需要多長時間 又要多少愛意 從我的心里 到你的心里 路徑已...
    如_柒閱讀 168評論 0 3

友情鏈接更多精彩內(nèi)容