Egret引擎与Android端的交互----小白教程(含坑)
生活随笔
收集整理的這篇文章主要介紹了
Egret引擎与Android端的交互----小白教程(含坑)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ?最近在接觸一個新事物,Egret引擎。話說一個用于開發(fā)Html5游戲的引擎,其使用js的超集.ts的TypeScrice來開發(fā)。而,最近的需求是,需要把利用這個Egret引擎開發(fā)的Html5游戲與公司開發(fā)的SDK結(jié)合起來。就是說,需要把這個Html5游戲打包成為apk,并在這個apk中使用我們的SDK功能。如果在android使用過Html5開發(fā)過頁面的話,我們都知道,html5與android的交互靠的是js腳本.在android端打開這個html5頁面的時候,給這個頁面的window中設置一個js類。Html5在通過這個js類來調(diào)用android端本來定義好接口,來完成交互。但Egret引擎是一個代碼集,他們本來已經(jīng)對這個封裝好了,所以我們主要根據(jù)他們的文檔來就可以了。詳細參考:Egret與Native的通訊技巧
? ? ?看過上面的文章之后,其實腦海里面已經(jīng)好清晰了,基本交互原理和java代碼差不多,但問題是,如果我們是一個寫android工程或java工程的人員,這里該如何入手呢?第一步:首先我們要先實現(xiàn)上面文章的這個列子根據(jù)網(wǎng)站教程:Egret小白快速上手。 我們可以現(xiàn)在來體驗一下Egret引擎的IDE編寫代碼。有兩個點需要知道:1.如果調(diào)用方法 ,在Egret wind的IDE中編寫ts代碼,其風格有點類似于js,又類似于OC。熟悉其書寫方法,和類的使用,變量的聲明等。2.如果使用點擊事件,其實就是響應用戶操作,因為這個可以建立按鈕,方便我們調(diào)式的時候,通過點擊按鈕來調(diào)用android端接口。
第二步:在window中把Egret工程打包成apk.我把這個弱智的打包命令封裝成了一個批處理文件。
? ?? 只要把Egret里面的工程html5Demo的文件夾拖動到批處理文件中,就會自動生成一個對應的android工程,免去敲打命令的煩惱。 主要有兩個文件:1.配置文件:properties.ini 2.批處理命令.bat 配置文件內(nèi)容: ############android工程名稱############
android_proj_name=Fish_Native_2
############android工程模板############
#1 D:\Html5ToAndroid\egret-android-support-3.0.0
#2 D:\Egret\egret-android-support-2.5.6
android_model=D:\Html5ToAndroid\egret-android-support-3.0.0
批處理命令內(nèi)容:@echo off setlocal enabledelayedexpansionfor /f "delims=" %%a in ('type "properties.ini"^| find /i "="') do ( set %%a )cd /d "%~dp0"@set H5_path=%1 @set Android_path=%cd%\%android_proj_name% @echo H5工程地址 = %H5_path% @echo 生成的android工程地址 = %Android_path% @echo 用于生成android工程的模板 = %android_model%@echo ----------------生成android工程-----------------------@call egret create_app %Android_path% -f %H5_path% -t %android_model%pause 第三步:編寫Egret端代碼,監(jiān)聽Native發(fā)送來信息和向Native端發(fā)送信息。 在main.ts的createGameScene方法界面加入如下代碼: this.setNativeListener();//監(jiān)聽android發(fā)來的信息this.callAndroid();//調(diào)用android
然后分別實現(xiàn)這兩個方法: private callAndroid():void{egret.ExternalInterface.call("callAndroid","i am from Egret");}private setNativeListener(): void{egret.ExternalInterface.addCallback("sendToJS",function(message:string){console.log("message from Native is = "+message);//注意 如果再在這里調(diào)用main.ts的其他方法的話 使用this.調(diào)用的話會報錯this.showMessage(message);//編譯不報錯 但運行報錯});}private showMessage(message:string):void{console.log("showMessage----- message= " + message);}
?這里面引發(fā)了第一個坑,this.的引用。 為了應對這個坑,可以使用另一種方式實現(xiàn)callback方法。 private setNativeListener(): void{egret.ExternalInterface.addCallback("sendToJS",this.sendToJScallback);}private sendToJScallback(message: string){console.log("message from Native is = " + message);this.showMessage(message);//這里可以使用this.引用 調(diào)用其他方法。}private showMessage(message:string):void{console.log("showMessage----- message= " + message);}
這里包含了js中this的引用機制,雖然不是很了解,也不知道這樣做法是否正確,反正可以正常運行就ok了,我們只是用來測試的。 第四步:把Egret工程生成Android工程。 在Eclipse中導入工程,并且在主activity中先設置監(jiān)聽。并再接收到Egret端發(fā)送過來的信息后,向Egret發(fā)出信息。 private void setInterfaces() {// Egret(TypeScript)-Runtime(Java)通訊// setRuntimeInterface(String name, IRuntimeInterface interface) 用于設置一個runtime的目標接口// callEgretInterface(String name, String message) 用于調(diào)用Egret的接口,并傳遞消息gameEngine.setRuntimeInterface("sendToNative", new IRuntimeInterface() {@Overridepublic void callback(String message) {Log.d(TAG, message);gameEngine.callEgretInterface("sendToJS", "A message from android");}});} 第五步:運行這個android工程,查看log. 經(jīng)過以上步驟,我們已經(jīng)熟悉如何在Egret端與Native端進行消息通訊了,那么如何定義他們之間的協(xié)議。由其方法我們可以知道,他們的消息只允許發(fā)送一個string的字符串。那么最好就使用json協(xié)議來定義了,方便兩邊進行數(shù)據(jù)解析,可是android端可以使用很多json幫助類,但Egret端呢?如何將一個實體生成Json字符串和解析一個字符串變成一個實體類呢。 ? 其實可以在Egret的WebSocket章節(jié)看到,Egret中包含一個關(guān)鍵詞:JSON. 這個JSON關(guān)鍵詞中包含兩個非常有用的方法:
批處理命令內(nèi)容:@echo off setlocal enabledelayedexpansionfor /f "delims=" %%a in ('type "properties.ini"^| find /i "="') do ( set %%a )cd /d "%~dp0"@set H5_path=%1 @set Android_path=%cd%\%android_proj_name% @echo H5工程地址 = %H5_path% @echo 生成的android工程地址 = %Android_path% @echo 用于生成android工程的模板 = %android_model%@echo ----------------生成android工程-----------------------@call egret create_app %Android_path% -f %H5_path% -t %android_model%pause 第三步:編寫Egret端代碼,監(jiān)聽Native發(fā)送來信息和向Native端發(fā)送信息。 在main.ts的createGameScene方法界面加入如下代碼: this.setNativeListener();//監(jiān)聽android發(fā)來的信息this.callAndroid();//調(diào)用android
然后分別實現(xiàn)這兩個方法: private callAndroid():void{egret.ExternalInterface.call("callAndroid","i am from Egret");}private setNativeListener(): void{egret.ExternalInterface.addCallback("sendToJS",function(message:string){console.log("message from Native is = "+message);//注意 如果再在這里調(diào)用main.ts的其他方法的話 使用this.調(diào)用的話會報錯this.showMessage(message);//編譯不報錯 但運行報錯});}private showMessage(message:string):void{console.log("showMessage----- message= " + message);}
?這里面引發(fā)了第一個坑,this.的引用。 為了應對這個坑,可以使用另一種方式實現(xiàn)callback方法。 private setNativeListener(): void{egret.ExternalInterface.addCallback("sendToJS",this.sendToJScallback);}private sendToJScallback(message: string){console.log("message from Native is = " + message);this.showMessage(message);//這里可以使用this.引用 調(diào)用其他方法。}private showMessage(message:string):void{console.log("showMessage----- message= " + message);}
這里包含了js中this的引用機制,雖然不是很了解,也不知道這樣做法是否正確,反正可以正常運行就ok了,我們只是用來測試的。 第四步:把Egret工程生成Android工程。 在Eclipse中導入工程,并且在主activity中先設置監(jiān)聽。并再接收到Egret端發(fā)送過來的信息后,向Egret發(fā)出信息。 private void setInterfaces() {// Egret(TypeScript)-Runtime(Java)通訊// setRuntimeInterface(String name, IRuntimeInterface interface) 用于設置一個runtime的目標接口// callEgretInterface(String name, String message) 用于調(diào)用Egret的接口,并傳遞消息gameEngine.setRuntimeInterface("sendToNative", new IRuntimeInterface() {@Overridepublic void callback(String message) {Log.d(TAG, message);gameEngine.callEgretInterface("sendToJS", "A message from android");}});} 第五步:運行這個android工程,查看log. 經(jīng)過以上步驟,我們已經(jīng)熟悉如何在Egret端與Native端進行消息通訊了,那么如何定義他們之間的協(xié)議。由其方法我們可以知道,他們的消息只允許發(fā)送一個string的字符串。那么最好就使用json協(xié)議來定義了,方便兩邊進行數(shù)據(jù)解析,可是android端可以使用很多json幫助類,但Egret端呢?如何將一個實體生成Json字符串和解析一個字符串變成一個實體類呢。 ? 其實可以在Egret的WebSocket章節(jié)看到,Egret中包含一個關(guān)鍵詞:JSON. 這個JSON關(guān)鍵詞中包含兩個非常有用的方法:
? ? ? ? ? 一個是把json字符串解析成為一個 JSobject, 一個是把JSObject轉(zhuǎn)換成json字符串。有了這個api之后,我們就只定義Egret端與Android端的通訊協(xié)議了。
? ? ? ? ?
總結(jié)
以上是生活随笔為你收集整理的Egret引擎与Android端的交互----小白教程(含坑)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel卡方检验,chisq.test
- 下一篇: ML之FE:机器学习算法/数据挖掘中特征