electron如何和cocos通信

通信这块,你查找资料会有很多,但是,都是一块一块的,只有自己亲自动手,你才会遇到各种问题。

在这里,我将个人研究运行后的路径发布如下,旨在能帮助更多的人节约时间。里面的各个字段的意义,百度查一下即可了解。

1.index.js

/*

* @Author: xhd

* @Date: 2024-10-19 17:39:24

* @FilePath: \dmyxToWin\index.js

* @LastEditTime: 2024-10-20 13:58:15

* @Description: Do not edit

*/

// app模块控制应用程序的事件生命周期。

// BrowserWindow模块创建和管理应用程序窗口。

const { app, BrowserWindow, ipcMain } = require("electron");

const path = require("path"); // 添加这行

// 保持一个对于 window 对象的全局引用,如果你不这样做,

let mainWindow;

/** 创建窗口 */

const createWindow = () => {

mainWindow = new BrowserWindow({

width: 1920,

height: 1080,

autoHideMenuBar: true,

resizable: false, // true缩放 false不能缩放

title: "游戏名称",

minimizable: false, // 窗口是否可以最小化

maximizable: false, // 窗口是否可以最大化

webPreferences: {

nodeIntegration: false, // 改为 false

contextIsolation: true, // 改为 true

preload: path.join(__dirname, "preload.js"),

},

});

// 加载 index.html

mainWindow.loadFile("web-mobile/index.html");

mainWindow.on("close", (e) => {

e.preventDefault();

if (mainWindow && mainWindow.webContents) {

console.log("Attempting to send app-close event to renderer");

mainWindow.webContents.send("app-close");

console.log("Sent app-close event to renderer");

// 添加一个超时,给渲染进程一些时间来响应

setTimeout(() => {

console.log("Timeout reached, forcing app to quit");

mainWindow.destroy();

app.quit();

}, 2000); // 5秒后强制退出

} else {

console.log("mainWindow or webContents is not available");

app.quit();

}

});

// 添加这个监听器来查看是否收到了 quit-app 消息

ipcMain.on("quit-app", () => {

console.log("Received quit-app event from renderer");

if (mainWindow) {

mainWindow.destroy();

}

app.quit();

});

// 添加这行来打开开发者工具

mainWindow.webContents.openDevTools();

};

// 这段程序将会在 Electron 结束初始化和创建浏览器窗口的时候调用

// 部分 API 在 ready 事件触发后才能使用。

app.whenReady().then(createWindow);

// 当所有窗口都被关闭的时候退出程序。

app.on("window-all-closed", () => {

if (process.platform !== "darwin") {

app.quit();

}

});

app.on("activate", () => {

if (BrowserWindow.getAllWindows().length === 0) {

createWindow();

}

});

2.preload.js

/*

* @Author: xhd

* @Date: 2024-10-20 10:08:01

* @FilePath: \dmyxToWin\preload.js

* @LastEditTime: 2024-10-20 13:54:24

* @Description: Do not edit

*/

const { contextBridge, ipcRenderer } = require("electron");

console.log("Preload script is running");

contextBridge.exposeInMainWorld("electron", {

onAppClose: (callback) => {

console.log("Setting up onAppClose listener");

ipcRenderer.on("app-close", (...args) => {

console.log("Received app-close event in preload", args);

callback(...args);

});

},

quitApp: () => {

console.log("Calling quitApp from preload");

ipcRenderer.send("quit-app");

},

});

console.log("Electron API exposed to renderer");

3.写一个bat方便一键执行,内容为

cnpm run-script package

4.提交git,更加.gitignore排除掉不需要提交的内容

/web-mobile/

/debug/

/release/

npm-debug.log

*.log

.DS_Store

/node_modules/

/*/node_modules/

5.cocos要监听消息

window['electron'].onAppClose((event) => {

console.log('Received app-close event in Cocos');

App.log.logBusiness('退出游戏', event);

// 执行您的清理操作

// to do exit

// 清理完成后,通知 Electron 可以退出了

console.log('Cocos cleanup done, sending quit-app event');

window['electron'].quitApp();

});

5.说下我这里实现的内容,点击关闭窗口,通知cocos做退出操作。

相关推荐
小墨宝23 分钟前
js 生成pdf 并上传文件
前端·javascript·pdf
HED38 分钟前
用扣子快速手撸人生中第一个AI智能应用!
前端·人工智能
DN金猿42 分钟前
使用npm install或cnpm install报错解决
前端·npm·node.js
丘山子42 分钟前
一些鲜为人知的 IP 地址怪异写法
前端·后端·tcp/ip
志存高远661 小时前
Kotlin 的 suspend 关键字
前端
www_pp_1 小时前
# 构建词汇表:自然语言处理中的关键步骤
前端·javascript·自然语言处理·easyui
YuShiYue1 小时前
pnpm monoreop 打包时 node_modules 内部包 typescript 不能推导出类型报错
javascript·vue.js·typescript·pnpm
天天扭码2 小时前
总所周知,JavaScript中有很多函数定义方式,如何“因地制宜”?(ˉ﹃ˉ)
前端·javascript·面试
一个专注写代码的程序媛2 小时前
为什么vue的key值,不用index?
前端·javascript·vue.js
장숙혜2 小时前
ElementUi的Dropdown下拉菜单的详细介绍及使用
前端·javascript·vue.js