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做退出操作。

相关推荐
开心工作室_kaic1 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā1 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年2 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder2 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727572 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
SoaringHeart3 小时前
Flutter进阶:基于 MLKit 的 OCR 文字识别
前端·flutter
会发光的猪。3 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客3 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
猫爪笔记3 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
前端李易安4 小时前
Webpack 热更新(HMR)详解:原理与实现
前端·webpack·node.js