core-egret.ByteArray

egret.ByteArray 讀寫範例


class Main extends eui.UILayer {

    protected createChildren(): void {
        super.createChildren();
        egret.lifecycle.onPause = () => egret.ticker.pause();
        egret.lifecycle.onResume = () => egret.ticker.resume();
        egret.registerImplementation('eui.IAssetAdapter', new AssetAdapter());
        egret.registerImplementation('eui.IThemeAdapter', new ThemeAdapter());
        this.runGame();
    }

    private async loadResource() {
        let loadingView = this.stage.addChild(new LoadingUI()) as LoadingUI;
        await RES.loadConfig('resource/default.res.json', 'resource/');
        await new Promise(resolve => new eui.Theme('resource/default.thm.json', this.stage).once(eui.UIEvent.COMPLETE, resolve, this));
        await RES.loadGroup('preload', 0, loadingView);
        this.stage.removeChild(loadingView);
    }

    private async runGame() {
        await this.loadResource();
        // --- Edwin 給你最乾淨的程式碼, 從這行以下開始寫喔 ---

        // 建立 websocket (egret.WebSocket 需要建立專案時勾選 socket 網路通訊庫, 或事後加入通訊庫亦可)
        const socket = new egret.WebSocket();
        // 採用 Binary Frame 傳輸資料 (有些服務器不支援 Binary Frame 可用 TYPE_STRING)
        socket.type = egret.WebSocket.TYPE_BINARY;
        // 每當資料從服務器回傳時觸發事件
        socket.addEventListener(egret.ProgressEvent.SOCKET_DATA, e => {
            // 將 echo.websocket.org server 回傳資料寫進 byte 變數
            const byte: egret.ByteArray = new egret.ByteArray();
            socket.readBytes(byte); 
            // 需要依照回傳格式依序讀取資料 (與後端討論讀取格式), echo.websocket.org server 是原資料回傳
            console.log(byte.readUTF(), byte.readFloat()); 
        }, this);
        // CONNECT 成功只會執行一次函式就不用了所以用 once 註冊事件
        socket.once(egret.Event.CONNECT, ()=>console.log('connect 成功!'), this);
        // 連線至 echo.websocket.org server
        socket.connect('echo.websocket.org', 80);

        // 建立發送資料按鈕
        const btn = new eui.Button;
        btn.label = '送出資料';
        btn.addEventListener(egret.TouchEvent.TOUCH_TAP,() => {
            // 還沒連線成功則返回
            if(!socket.connected) return;
            // 建立 ByteArray 物件, 此範例寫入格式是先寫字串再寫浮點數 (與後端討論寫入格式)
            let byte: egret.ByteArray = new egret.ByteArray();
            byte.writeUTF('Edwin 的隨機數');
            byte.writeFloat(Math.random());
            // 送出資料到 echo.websocket.org server
            socket.writeBytes(byte, 0, byte.bytesAvailable);
        },this);
        // 按鈕加至場景
        this.addChild(btn);

    }

}

spacer

沒有留言:

張貼留言