主頁 > 軟體設計 > 制作游戲時,如何管理游戲資源? 逐行注釋!

制作游戲時,如何管理游戲資源? 逐行注釋!

2020-09-16 11:21:29 軟體設計

制作游戲時,如何管理游戲資源?

逐行注釋!

開發環境:

CocosCreator v2.3.1

node.js v10.16.0

vscode 1.46.1

基本思路:使用插件腳本,
1.定義一張表,將資源名和路徑一一映射,
2.選擇按組加載資源,記錄loadNum,配合ProgressBar節點可以實作一個畫面流暢的資源加載界面
3.然后將資源以{型別:{資源名,…},…}的結構保存在物件中,再將其存盤在全域window下,方便隨時獲取,

在這里插入圖片描述

優點:

1.使用資源管理器(res.js)來統一加載資源,可以避免因資源數量過多、即時加載資源時間過短而導致的各種資源獲取錯誤問題,

2.可以根據實時變化的loadNum設計你的加載界面

代碼如下:

res.js

/**

 \* JavaScript里(()=>{})和(function(){})是標準的函式,

 \* 它們沒有賦值給任何變數,沒有函式名,被稱為匿名函式,

 \* 因為沒有名字,所以在定義完成就要呼叫,(()=>{})(),

 \* 后面的()是呼叫運行這個匿名函式

 */

(() => {

  //資源映射表

  let TABLE = {

?    //音頻類------一級key,一般取名資源的型別(自定義)

?    audio: {

?      /**

?       \* 此資源的路徑,通常我們會把專案中需要動態加載的資源放在 resources 目錄下, 此處resources省略不寫

?       \* 所有需要通過腳本動態加載的資源,都必須放置在 resources 檔案夾或它的子檔案夾下,

?       \* resources 檔案夾需要在 assets 根目錄 下手動創建

?       */

?      path: "audio/",

?      //資源型別,Class for audio data handling.音瞥澩類

?      type: cc.AudioClip,

?      //資源串列,即同路徑下同型別的所有資源

?      list: ["MayRain", "別再問我什么是迪斯科", "思凡", "執迷不悔", "走鋼索的人", "龍卷風"]

?    },

?    //預制類

?    prefab: {

?      path: "prefab/",

?      type: cc.Prefab,

?      list: ["chapter", "menu", "block", "tip1", "tip2"]

?    },

?    //teture2D紋理類

?    authorImage: {

?      path: "texture/author/",

?      type: cc.SpriteFrame,

?      list: ["MayRain", "別再問我什么是迪斯科", "思凡", "執迷不悔", "走鋼索的人", "龍卷風"]

?    }

  }



  /**新建一個Cres資源加載類,實體化為g_Res并存在window下

   \* window物件:

   \* 所有瀏覽器都支持 window 物件,它代表瀏覽器的視窗,

   \* 所有全域 JavaScript 物件,函式和變數自動成為 window 物件的成員,

   \* 全域變數是 window 物件的屬性,

   \* 全域函式是 window 物件的方法,

   \* 甚至(HTML DOM 的)document 物件也是 window 物件屬性

   */

  window.g_Res = new class CRes {

?    //建構式中,初始化一個用于存放資源的_data物件,初始化需要加載的資源數量loadNum

?    constructor() {

?      this._data = {};

?      this.loadNum = -1;

?    }



?    //資源加載入口函式

?    loadRes() {

?      this.loadNum = 0;

?      for (let key in TABLE) {

?        //統計資源映射TABLE中有多少個一級key,即有多少種資源

?        this.loadNum++;

?        //按類加載資源

?        this.doLoadRes(key);

?      }

?    }



?    //實際的資源加載函式,加載key類資源

?    doLoadRes(key) {

?      //拼湊資源型別和名稱,結構為["audio/MayRain","..."],作為按組加載資源的第一個引數

?      let resList = [];

?      for (let name of TABLE[key].list) {

?        let resName = TABLE[key].path + name;

?        resList.push(resName);

?      }

?      //在_data物件中開辟一級結構,結構為this._data = {audio: {},...}

?      this._data[key] = {};

?      //定義加載資源方法,5個資源呼叫一次

?      let func = () => {

?        //從中資源串列中從首切分5個

?        let tempList = resList.splice(0, 5);

?        /**

?         \* 按組加載資源方法,

?         \* 第一個引數:資源組,

?         \* 第二個引數:資源型別,

?         \* 第三個引數:回呼函式(err,data)=>{},err:錯誤資訊,data:加載后的資源

?         */

?        cc.loader.loadResArray(

?          tempList,

?          TABLE[key].type,

?          (err, data) => {

?            //判斷此類資源是否加載完成,是,則讓loadNum-1,外部腳本可以通過獲取loadNum的值來判斷資源加載的進度;

?            if (resList.length <= 0) {

?              this.loadNum--;

?            } else {

?              //如果此類資源沒有加載完成,則繼續選擇5個一組的方式繼續加載

?              func();

?            }

?            //如果加載錯誤,則列印具體的加載錯誤資訊

?            if (err) {

?              console.log(err);

?            }

?            for (let res of data) {

?              //在_data物件中開辟二級結構,結構為this._data = {"audio": {"MayRain":它的audioClip,...},...}

?              this._data[key][res.name] = res;

?            }

?          }

?        );

?      }

?      //呼叫上面定義的資源加載方法func

?      func();

?    }



?    //定義獲取資源加載數的函式

?    getLoadNum() {

?      return this.loadNum;

?    }



?    //定義獲取資源方法,通過資源的型別key和名稱name來獲取你已經加載好的任和資源

?    getRes(key, name) {

?      //判斷獲取資源時時,是否所有的資源都已經加載完畢,否,則列印它的型別和名字方便開發者找錯

?      if (this.loadNum != 0) {

?        console.log("資源未加載完畢!", key, name);

?      }

?      //安全驗證

?      if (this._data[key]) {

?        return this._data[key][name];

?      } else {

?        console.log("目標資源不存在,請檢查資源名!", key, name);

?      }

?    }

  }

})()

附贈加載界面的loading.js腳本

loading.js

cc.Class({

  extends: cc.Component,



  properties: {

  },



  loadRes() {

?    let curResNum = g_Res.getLoadNum();   //未加載資源

?    let readyResNum = this.resNum - curResNum;    //已加載資源

?    this.goal = readyResNum / this.resNum / 2;   //前50%是用來加載資源的,所以進度最多到50%

?    //判斷資源是否加載完畢

?    if (this.progressBar.progress >= 0.5) {

?      this.loadScene();    //預加載場景函式

?    }

  },



  loadScene() {

?    this.step = 2;

?    cc.director.preloadScene(    //預加載場景(只加載場景,場景中的onload()在場景打開后才加載)

?      "main",

?      (cur, all) => {   // cur:已經加載的資源數 all:總共有多少資源數

?        this.goal = cur / all / 2 + 0.5;

?      },

?      () => { },

?    );

  },



  init() {

?    this.step = 3;

?    cc.director.loadScene("main");

  },



  playAnim() {

?    this.whiteBlock.getComponent(cc.Animation).play("whiteBlock");

  },



  // LIFE-CYCLE CALLBACKS:



  // onl oad() {},



  start() {

?    g_Res.loadRes();

?    this.progressBar = cc.find("Canvas/UILayer/temporatyUI/progressBar").getComponent(cc.ProgressBar);

?    this.proLabel = cc.find("Canvas/UILayer/temporatyUI/proLabel").getComponent(cc.Label);

?    this.whiteBlock = cc.find("Canvas/UILayer/permanentUI/title/whiteBlock");

?    this.progressBar.progress = 0;

?    this.goal = 0;

?    this.speed = 0.01;

?    this.step = 1;

?    this.resNum = g_Res.getLoadNum();

?    this.playAnim();

  },



  update(dt) {

?    if (this.progressBar.progress < this.goal) {

?      this.progressBar.progress += this.speed;

?      this.proLabel.string = "進度" + Math.floor(this.progressBar.progress * 100) + "%"

?    }

?    if (this.step == 1) {   //第一步,加載資源

?      this.loadRes();

?    } else if (this.step == 2 && this.progressBar.progress >= 1) {

?      this.init();

?    }

  },

});


this.progressBar.progress < this.goal) {

?      this.progressBar.progress += this.speed;

?      this.proLabel.string = "進度" + Math.floor(this.progressBar.progress * 100) + "%"

?    }

?    if (this.step == 1) {   //第一步,加載資源

?      this.loadRes();

?    } else if (this.step == 2 && this.progressBar.progress >= 1) {

?      this.init();

?    }

  },

});

在這里插入圖片描述
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/56573.html

標籤:其他

上一篇:牛批!清華畢業的Java大牛用一個坦克大戰游戲專案來演示設計模式

下一篇:Educational Codeforces Round 95 題解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more