Cocos Creator 记录七-全局变量

本文介绍如何在CocosCreator中利用插件脚本特性定义全局变量,并演示了如何使用XMLHttpRequest和WebSocket进行网络通信。

全局变量

由于所有插件脚本都保证了会在普通脚本之前加载,那么除了用来加载插件,你还可以利用这个特性声明一些特殊的全局变量。你可以在项目中添加这样一个脚本,并且设置“导入为插件”:

/* globals.js */

// 定义新建组件的默认值
window.DEFAULT_IP = "192.168.1.1";

// 定义组件开关
window.ENABLE_NET_DEBUGGER = true;

// 定义引擎 API 缩写(仅适用于构造函数)
window.V2 = cc.Vec2;
接下来你就能在任意的普通脚本中直接访问它们:

/* network.js */

cc.Class({
    extends: cc.Component,
    properties: {
        ip: {
            default: DEFAULT_IP
        }
    }
});
/* network_debugger.js */

if (ENABLE_NET_DEBUGGER) {
    // ENABLE_NET_DEBUGGER 时这个组件才生效
    cc.Class({
        extends: cc.Component,
        properties: {
            location: {
                default: new V2(100, 200)
            }
        },
        update: function () {
            ...
        },
    });
}
else {
    // 否则这个组件什么也不做
    cc.Class({
        extends: cc.Component,
        start: function () {
            // 在开始后就移除该组件
            this.destroy();
        }
    });
}

标准网络接口

在 Cocos Creator 中,我们支持 Web 平台上最广泛使用的标准网络接口:

XMLHttpRequest:用于短连接
WebSocket:用于长连接
当然,在 Web 平台,浏览器原生就支持这两个接口,之所以说 Cocos Creator 支持,是因为在发布原生版本时,用户使用这两个网络接口的代码也是可以运行的。也就是遵循 Cocos 一直秉承的 “一套代码,多平台运行” 原则。

使用方法

XMLHttpRequest 简单示例:

 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function () {
     if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
         var response = xhr.responseText;
         console.log(response);
     }
 };
 xhr.open("GET", url, true);
 xhr.send();

开发者可以直接使用 new XMLHttpRequest() 来创建一个连接对象,也可以通过 cc.loader.getXMLHttpRequest() 来创建,两者效果一致。

XMLHttpRequest 的标准文档请参考 MDN 中文文档

WebSocket

简单示例:

 ws = new WebSocket("ws://echo.websocket.org");
 ws.onopen = function (event) {
     console.log("Send Text WS was opened.");
 };
 ws.onmessage = function (event) {
     console.log("response text msg: " + event.data);
 };
 ws.onerror = function (event) {
     console.log("Send Text fired an error");
 };
 ws.onclose = function (event) {
     console.log("WebSocket instance closed.");
 };

 setTimeout(function () {
     if (ws.readyState === WebSocket.OPEN) {
         ws.send("Hello WebSocket, I'm a text message.");
     }
     else {
         console.log("WebSocket instance wasn't ready...");
     }
 }, 3);

WebSocket 的标准文档请参考 MDN 中文文档

### 实现全局屏幕点击事件 在 Cocos Creator 3.x 中,为了创建一个响应全屏点击的机制,可以利用 `cc.EventTarget` 或者通过挂载脚本到 Canvas 节点上监听触摸事件。由于不再推荐使用 `cc` 全局变量[^2],应当采用模块化的方式引入所需组件。 下面是一个简单的例子来展示如何实现这一功能: #### 创建一个新的 TypeScript 文件用于处理点击逻辑 ```typescript import { _decorator, Component } from 'cc'; const { ccclass, property } = _decorator; @ccclass('GlobalClickHandler') export class GlobalClickHandler extends Component { onLoad() { this.node.on(Node.EventType.TOUCH_START, this.onClick, this); } onClick(event) { console.log("Screen clicked at position:", event.getLocation()); } } ``` 此代码片段定义了一个名为 `GlobalClickHandler` 的类,并重写了 `onLoad()` 方法,在其中订阅了触控开始事件 (`TOUCH_START`)。每当检测到屏幕上发生触摸动作时就会触发 `onClick()` 函数并打印出点击位置的信息。 需要注意的是,如果希望这个处理器能够接收到所有的触摸输入,则应该将其附加给场景中的根节点 (通常是 Canvas),而不是某个特定的游戏对象之上。 另外,考虑到不同设备上的交互方式差异较大(比如桌面端可能更常用鼠标),也可以考虑同时监听鼠标的点击事件: ```typescript this.node.on(Node.EventType.MOUSE_DOWN, this.onClick, this); // 添加对鼠标左键按下的支持 ``` 最后提醒一点,当不需要再接收这些事件的时候记得取消注册相应的回调函数以免造成内存泄漏等问题。可以在组件被销毁之前调用如下方法完成清理工作: ```typescript onDestroy(){ this.node.off(Node.EventType.TOUCH_START, this.onClick, this); this.node.off(Node.EventType.MOUSE_DOWN, this.onClick, this); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值