微人事項目實戰的數據庫腳本_EMP微前端實戰之cocos2d線上項目

b900a7734331d12f4db517d9ff28658e.png

團隊原文:

efoxTeam/emp?github.com
cc7d5343c6e8da37bdb05ac9c2ca0314.png


一.背景

目前cocos2d游戲最主要的開發方式是通過官方提供的GUI圖形界面工具——creator,通過 creator 開發者無需關注構建本身,只需通過界面操作即可對游戲代碼進行構建打包。但是這樣也存在著以下幾個問題:

  • 構建閉源,導致開發者對項目構建無法定制化,假如編譯出來的代碼存在兼容性問題,那只能進入 creator 安裝目錄尋找對應的某個配置文件進行修改,這種侵入性的修改很有可能會引發不穩定性。
  • 無法使用其他構建工具進行打包,意味著項目無法使用新的技術方案,只能局限于 creator 設定的框架之中
  • 游戲組件在不同項目之間難以復用,組件通常包含了 prefabsprite 等資源,如何發布托管并在其他項目復用組件,簡單地通過 creator 是無法做到的。通過 EMP微前端的方案 能從根本上解決這些問題

通過這些問題讓我們有了一種想法,有沒有可能通過其他構建工具打包的代碼,也能關聯到 creator 的項目中,這樣也能在creator cocos2d項目中引入EMP,從而解決組件復用的問題

二. creator項目接入webpack模型

首先看看單一 creator 的開發過程,它會在本地服務開啟 7456 的端口服務,整個本地開發流程如下圖:

5119bf329f61611def5f54f12e1c1510.png

接入 webpackemp 后的開發過程,首先 webpack 會通過 axios 抓去 creator服務生成出來的 index.html文件作為 template,并開啟一個新的服務,并通過 devServer 將資源請求轉發回 creator的端口服務,確保資源訪問正常,開發流程圖如下:

f8d36858aa90e957e52882116fc47a76.png

三. 接入流程

step1

全局安裝 @efox/emp-cli,通過 emp init 初始化游戲種子工程,選擇 cocos2d 模版

yarn add --global @efox/emp-cli && emp init

step2

在根項目通過命令 yarn 安裝依賴

step3

安裝 creator cocos 開發工具 ,打開 cocosDashboard, 導入剛剛的游戲模版項目,然后打開項目,下面是導入成功后的開發工具截圖;

403514ff6ccec00533eceb2a95681240.png

復制開發工具上方提示的本地調試鏈接到瀏覽器上,呈現出來的界面如下,可以看到右方console出現報錯的情況,這是因為目前打開的只是 creator 開啟的本地服務,而項目引入了 webpack 構建的代碼,所以暫時會出現報錯的情況;

659d10b02dea92c71e5abe6ec580a913.png

step4

進入項目根目錄,運行 yarn dev

瀏覽器會自動打開新端口服務,這個本地服務就是 webpack 代理 creator cocos 后的服務,通過下圖看到console已經沒有報錯了,并且界面上的 Hello World擁有了漸變背景色,這個漸變背景色實際上就是一個 Game Component,是通過 webpack 構建并注入到游戲項目中引入的;

84cfdb490c94fb285a0540f9e65bfc3a.png

ps: 必須先通過creator cocos開啟項目,再運行 yarn dev,因為 webpack 編譯時需要通過 axios 抓取 creator cocos 服務模版;

四. 項目代碼分析

emp-config.js

// cocos2d emp配置
const withCocos2d = require('@efox/emp-cocos2d')
const ip = require('ip')module.exports = withCocos2d(({config, env, empEnv}) => {// webpack本地服務端口const port = 9000const projectName = 'empCocos2dDemo'const host = ip.address()const publicPath = `http://${host}:${port}/`config.plugin('mf').tap(args => {args[0] = {...args[0],...{name: projectName,library: {type: 'var', name: projectName},filename: 'emp.js',// remotes: {//   '@emp-game/base': 'empGameBase',// },exposes: {// 將當前項目的component expose出去給其他項目使用'./components': 'src/components',},},}return args})config.output.publicPath(publicPath)config.devServer.host(host)config.devServer.port(port)},{// creator開啟的服務端口creatorPort: 7456,// 引用基站資源鏈接empJs: [],},
)

src/index.ts

webpack 的代碼如何注入到 creator cocos 代碼中,靠的是 cc 這個全局變量,cc 變量是cocos2d引擎暴露在全局的,包含了全部的引擎方法;creator cocos 接入 emp 的關鍵點就是在 cc全局變量上創建一個 EMP 屬性,這樣后續無論遠程組件模塊,抑或是本地構建的module, 都可以附值在 cc.EMP 上,從而在游戲代碼中引入;

cc這個全局變量是cocos2d引擎暴露在全局的,這里也分為本地環境和生產環境的情況,這是因為本地環境cocos2d引擎腳本是同步加載的,而生產環境是異步的,這就是為什么下面代碼判斷了 window.boot 是否存在的情況,附值 cc.EMP 的操作是需要 cc 存在才能進行;

import Components from 'src/components'export type EMPData = {Components: typeof Components
}const EMP: EMPData = {Components,
}// 關鍵部分
// 生產環境 cocos2d腳本異步加載后 再執行window.boot
// 通過重寫 window.boot 在函數體內進行cc.EMP附值,再執行原函數,確保游戲代碼運行時 cc.EMP正常有值
if (window.boot) {const fn = window.bootwindow.boot = async function () {cc.EMP = EMPfn()}
} else {// 本地環境 直接附值cc.EMP = EMP
}

assets/Script/HelloWorld.ts

看回游戲代碼,了解游戲代碼是如何引入外部組件的

const {ccclass, property} = cc._decorator@ccclass
export default class Helloworld extends cc.Component {@property(cc.Label)label!: cc.LabelonLoad(): void {// 通過cc.EMP獲取Component模塊// 再通過Component模塊拓展出漸變背景色組件const {colorGrad} = cc.EMP.Components// 獲取labelNode 節點const labelNode = cc.find('labelNode', this.node)const label = cc.find('label', labelNode)// 通過addComponent添加漸變背景色,并設置腳本屬性 _colorslabelNode.addComponent(colorGrad)._colors = [cc.Color.WHITE.fromHEX('#ffffff'),cc.Color.WHITE.fromHEX('#5A51FF'),cc.Color.WHITE.fromHEX('#8668FF'),cc.Color.WHITE.fromHEX('#5A51FF'),]setTimeout(() => {// 重設labelNode節點寬高labelNode.setContentSize(label.width, label.height)})}
}

五. 已有項目如何接入

接入步驟如下:

  1. 在根項目安裝 emp 相關依賴;
yarn add -D @efox/cli
yarn add -D @efox/emp-tsconfig
yarn add -D @efox/emp-cocos2d
  1. package.json 添加如下片段:
{...,"scripts": {...,+ "dev": "emp dev",+ "build": "emp build --ts --env prod && cp -r ./dist/. ./build/web-mobile"}
}
  1. 根目錄創建 emp-config.js,并復制以下內容
const withCocos2d = require('@efox/emp-cocos2d')
const ip = require('ip')module.exports = withCocos2d(({config, env, empEnv}) => {const port = 9000const projectName = 'empCocos2dDemo'const host = ip.address()const publicPath = `http://${host}:${port}/`config.plugin('mf').tap(args => {args[0] = {...args[0],...{name: projectName,library: {type: 'var', name: projectName},filename: 'emp.js',// remotes: {// },exposes: {},},}return args})config.output.publicPath(publicPath)config.devServer.host(host)config.devServer.port(port)},{// creator開啟的服務端口creatorPort: 7456,// 引用基站資源鏈接empJs: [],},
)
  1. tsconfig.json 替換如下內容:
{"extends": "@efox/emp-tsconfig","compilerOptions": {"experimentalDecorators": true,"baseUrl": "./"},"include": ["src", "creator.d.ts", "index.d.ts", "assets"]
}
  1. 創建 src 目錄,并新建 index.ts
export type EMPData = {}const EMP: EMPData = {}if (window.boot) {const fn = window.bootwindow.boot = async function () {cc.EMP = EMPfn()}
} else {cc.EMP = EMP
}
  1. 創建 index.d.ts,定義 cc.EMP 類型聲明
import {EMPData} from './src'declare global {namespace cc {export let EMP: EMPData}interface Window {boot: () => void}
}

六. 總結

目前 creator cocos 游戲開發只能依賴官方開發工具,接入這套模型,能使得項目定制化更加便捷,且具有以下優點:

  1. 幾乎零成本接入

首先看看接入 emp 后的 creator cocos項目目錄結構

a60bc5638a8710f0e65fb9bb84bbe090.png

由上圖可以看出,與 普通的creator cocos2項目 相比,只多了以下2個文件1個目錄

  • src/*
  • emp-config.js
  • index.d.ts

無需改變原游戲代碼任何的部分,做到了幾乎0成本接入

  1. 將開發方式回歸到我們熟悉的步伐上,且更靈活,原本的開發方式是GUI工具制作 一個一個 prefab,再寫一個一個腳本綁定進去,雖然操作簡單,但開發體驗很不好,接入模型后,GUI工具依然負責制作 prefab,但腳本就可以抽離出來由webpack構建,這能給編寫的腳本帶來更多的新特性,豐富開發方式;
  2. 組件開發靈活,多項目共享,當前開發游戲組件只能在當前項目復用,如果其他游戲項目也想用呢?這時可能會想到發布到官方托管的倉庫或者npm倉庫,但是有個問題,如果這個組件依賴了圖片,那發布到npm倉庫可能是一個難題;emp基站的模型能很好地解決這些問題,因為本身游戲項目就是一個基站,其他游戲項目可以輕松復用其他游戲 expose 出來的組件

不同游戲項目之間組件的互相調用,可以參考 EMP中的cocos2d

基于Webpack 5 Module Federation實現的 EMP微前端方案,creator cocos這種閉源的開發過程都能接入 EMP,證明這套方案并不局限技術棧;如果是剛開始接觸微前端的話,可以嘗試去了解一下,可以帶給你很好的使用體驗喔

具體的EMP微前端方案教程目錄如下:

  • 基礎知識解析
    什么是微前端
    對比多種微前端方案
    webpack5 module Federation原理學習
    EMP的設計架構
  • 快速入門
    react項目如何使用和接入EMP
    vue項目如何使用和接入EMP
    輔助插件的使用教程
  • 進階教程
    Vue和React項目如何互相遠程調用
    cocos2d 項目如何使用和接入EMP
    教你基站搭建技巧

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534652.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

線粒體和葉綠體的基因組特點_如何組裝植物葉綠體基因組

可能出現的問題:*個人電腦上遇到不能collect memery的情況,是電腦內存較少,建議分成用2G左右的數據進行組裝。* Seed.fasta #用于起始組裝的種子序列,NOVOPlasty安裝軟件目錄下有這個文件,就叫這個名字,作者…

f3arra1n3.4.1版本_Sysmon v11.1新版本功能測試報告

一、概述根據微軟文檔的介紹,Sysmon v11新增了監控文件刪除的功能,并支持對刪除的文件進行存儲備份,極大提高了主機威脅檢測的能力。同時增加禁用反向DNS查詢的功能,可以有效降低噪音數據。Sysmon從v10.0到目前的v11.1共經歷了5個…

maya導出fbx沒動畫_Maya學習方法總結

關注我,一起來了解建模吧!今天小編就來總結一下Maya學習過程中遇到的困難和解決方法,我相信有一些應該也是普遍性問題,注意:小編說的版本是Maya2018。(1)一次性刪除所有幀的方法import的文件如果…

dev 中 gridcontrol1 滾動條重繪_瀏覽器的重繪和回流(Repaint amp; Reflow)

參考文獻:https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hlzh-cn?developers.google.com你真的了解回流和重繪嗎 Issue #4 chenjigeng/blog?github.com前言:重繪:由于…

礦井通風計算c語言_礦井通風機主要參數的含義

礦井通風機的作用就是把地面新鮮空氣送到井下,供工人呼吸,同時把有害氣體從井下排出,使有害氣體的濃度降到對人體無害的程度,在現代化煤礦中稱通風機為“礦井的肺臟”,可見其重要性。風機的參數是風機選型的唯一依據&a…

行健設計_行健要聞|“第四屆‘天行健創新創業設計大賽”培訓班成功舉辦

10月9日下午,由院團委主辦、商學部承辦第四屆“天行健”創新創業設計大賽動員大會暨首場培訓講座在教學樓4-103室成功啟動。院團委副書記唐典巧參加動員會,并頒發了第九屆“挑戰杯”廣西大學生課外學術科技作品競賽榮譽證書,動員會由商學部輔…

sql同時操作兩列_怎么在兩列同時篩選數據庫

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云數據庫專家保駕護航,為用戶…

ip地址轉換pta題目_PTA「實驗2-3-5 輸出華氏-攝氏溫度轉換表」

PTA是浙江大學設計類實驗輔助教學平臺。題目描述輸入2個正整數lower和upper(lower≤upper≤100),請輸出一張取值范圍為[lower,upper]、且每次增加2華氏度的華氏-攝氏溫度轉換表。溫度轉換的計算公式:C5(F?32)/9&#…

語言爬蟲字段為空_我為什么建議前端將Python 作為第二語言?

前言本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。作者: 前端勸退師PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取http://note.youdao.com/noteshare?id3054c…

5 獲取當前訪問的控制名稱_LabVIEW編程技巧:網絡通信中如何獲取計算機名稱、IP地址等信息...

問題引出在網絡通訊編程中,經常需要獲取當前主機的名稱、IP地址等信息,在LabVIEW中如何獲取這些信息呢?下面以本機為例進行說明,先看一下本機的信息。在Windows系統中打開控制臺程序,輸入“ipconfig /all”指令&#x…

ios 通過kvc修改屬性會觸發kvo_iOS開發-KVC和KVO的理解

KVC和KVO看起來很專業,其實用起來還是比較簡單的,KVC(Key-value coding)可以理解為鍵值對編碼,如果對象的基本類型,那么鍵值對編碼實際上和get,set方法沒有區別,如果是屬性是另外一個對象,那么發現KVC用起來…

python stdin和stdout_stdin似乎比stdout(python)慢得多.為什么?

我有兩個需要相互通信的python程序(一個是子進程).目前我通過stdin和stdout這樣做.然而,寫入子進程的標準似乎很慢.a.py,一個采用任意行輸入并打印時間的程序:from time import time, sleepfrom sys import stdout, stdinwhile True:stdin.readline()stdout.write(%…

postman生成python代碼_別再用手敲了,這個工具可以自動生成python爬蟲代碼

我們在寫爬蟲代碼時,常常需要各種分析調試,而且每次直接用代碼調試都很麻煩所以今天給大家分享一個工具,不僅能方便模擬發送各種http請求,還能輕松調試,最重要的是,可以將調試最終結果自動轉換成爬蟲代碼&a…

電工結業試卷_電工技術基礎結業考試試卷

電工技術基礎結業考試試卷適用年級2016級秋6班電子、計算機專業班級 姓名 學號一、 判斷題(每題2分,共30分)1、 電位越高則電壓越大。2、萬用表的電壓、電路及電阻檔的刻度都是均勻的。3、 在任何情況下,電壓源和電流源之間總是可以等效變換的。 4、 電容…

表格里面怎么打多個√_Excel怎樣在表格里打√?

我們做表的時候有時會遇到輸入對或錯的情況。Excel表格里面輸入√和,普通的方法是直接插入特殊符號來進行對勾的輸入。這樣輸入起來1個2個還可以接受,但是如果頻繁輸入,那我們得想想簡單方法。比如我們直接在excel單元格里面輸入1顯示√&…

@value 默認值為null_JAVA8之妙用Optional解決判斷Null為空的問題

引言在文章的開頭,先說下NPE問題,NPE問題就是,我們在開發中經常碰到的NullPointerException.假設我們有兩個類,他們的UML類圖如下圖所示在這種情況下,有如下代碼user.getAddress().getProvince();這種寫法,…

mysql百萬數據根據索引查詢_mysql創建多列索引查詢百萬表數據的性能優化經驗分享...

最近發現最代碼網站中的收到的評論,提到我的,心情被贊的查詢異常緩慢,通過nginx日志發現響應時間快的在5s,慢的有13s,終于忍無可忍花時間來解決了。執行explain之后的截圖如下:可以看到possible_keys中有很…

php用到的mysql語句_PHP中常用到的一些MySQL語句_php

在php開發中,經常會使用到mysql語句,下面就為您列舉了一些經常使用的MySQL語句,希望對您平時的學習和開發工作能起到些許的作用。MySQL語句顯示數據庫或表:show databases;//然后可以use database_name;show tables;MySQL語句更改表名:alter …

mysql執行計劃性能_MySQL SQL性能分析Explain執行計劃

一. 執行計劃返回信息詳解①. 執行計劃所含字段輸出列含義id查詢標識select_type查詢類型table查詢涉及的表partitions匹配到的分區信息type連接類型possible_keys可能選擇的索引key實際使用的索引key_len實際使用的索引的長度ref和索引進行比較的列rows需要被檢索的大致行數fi…

mysql定時作業_mysql 讓一個存儲過程定時作業的代碼(轉)

1、在mysql 中建立一個數據庫 test1語句:create database test12、創建表examinfocreate table examinfo(id int auto_increment not null,endtime datetime,primary key(id));3 插入數據:insert into examinfo values(‘1‘,‘2011-4-23 23:26:50‘);4 …