2016-11-02 19:16:09 Elk_1024 阅读数 2006

egret 在 IOS 系统加载音频文件,会出现无法加载,从而卡在加载界面的情况。

解决方法: 将声音资源转换成 44100Hz,96kbps。
如果有问题再转一次,转到能用为止(不要吐槽,我转了三次就能用了。)

2016-01-06 16:04:57 taotao3686 阅读数 2382
由于 webAudio 对声音的格式有特定要求,在 ios 系统上如果测试碰到音频文件解码失败的情况,请使用具体来转换下格式(码率 44100Hz 96kbs ;工具推荐 绿色版glodwave)。
2019-01-19 15:29:38 gaofei880219 阅读数 1156

背景

用Egret开发的H5项目,调用第三方图片处理接口,由于图片大小和用户网络问题,接口返回时间有可能较长,影响用户体验,故需设置接口超时时间。

引擎中并没有类似于Ajax中的timeout参数,所以需要自己实现。

 

分析

实现原理是,设置一个计时器Timer模拟超时时间,超过指定时间后立刻中止请求。

 

代码示例

let portState = false; // 接口返回状态

let request = new egret.HttpRequest();
request.responseType = egret.HttpResponseType.TEXT;
request.open("https://...", egret.HttpMethod.POST);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send(params);
request.addEventListener(egret.Event.COMPLETE, function(event: egret.Event){
    let request = <egret.HttpRequest>event.currentTarget;
    let response = eval('(' + request.response + ')');

    portState = true; // 接口返回状态为true
}, this);

// 设置超时时间10s
let timer: egret.Timer = new egret.Timer(10000, 1);
timer.addEventListener(egret.TimerEvent.TIMER_COMPLETE, function(){
    if(!portState){ // 超过指定时间,接口返回状态仍为false,则中止请求
        request.abort();

        // todo: 在这里添加接口调用失败的逻辑
    }
}, this);
timer.start();

 

参考链接

Egret文档发送HTTP请求:http://developer.egret.com/cn/github/egret-docs/Engine2D/net/sendHTTP/index.html

Egret API HttpRequest:http://developer.egret.com/cn/apidoc/index/name/egret.HttpRequest#abort

httprequest和urlloader无法设置超时:https://bbs.egret.com/forum.php?mod=viewthread&tid=19894

egret HttpRequest如何设置请求超时时间:https://bbs.egret.com/forum.php?mod=viewthread&tid=47652

2018-06-12 11:45:36 honey199396 阅读数 6172
在Egret中是可以直接调用微信小游戏的API的,Egret中添加了平台代码,可以调用各个平台API。

该章效果如下:
这里写图片描述
一、新建工程会发现在src文件夹中会包含一个Platform.ts的文件,如果没有请创建。

/** 
 * 平台数据接口。
 * 由于每款游戏通常需要发布到多个平台上,所以提取出一个统一的接口用于开发者获取平台数据信息
 * 推荐开发者通过这种方式封装平台逻辑,以保证整体结构的稳定
 * 由于不同平台的接口形式各有不同,白鹭推荐开发者将所有接口封装为基于 Promise 的异步形式
 */
declare interface Platform {
    getUserInfo(): Promise<any>;
    login(): Promise<any>
}
class DebugPlatform implements Platform {
    async getUserInfo() {
        return { nickName: "username" }
    }
    async login() {
    }
}
if (!window.platform) {
    window.platform = new DebugPlatform();
}

declare let platform: Platform;
declare interface Window {
    platform: Platform
}

并将代码拷贝到Platform.ts中。

二、打包发布微信工程,并在微信开发者工具中打开,可以看到platform.js文件,若没有,请创建platform.js文件。微信的其他接口也要写到该文件中,分享、微信点击进入等。

/**
 * 请在白鹭引擎的Main.ts中调用 platform.login() 方法调用至此处。
 */

class WxgamePlatform {
    name = 'wxgame'
    login() {
        return new Promise((resolve, reject) => {
            wx.login({
                success: (res) => {
                    resolve(res)
                }
            })
        })
    }

    getUserInfo() {
        return new Promise((resolve, reject) => {
            wx.getUserInfo({
                withCredentials: true,
                success: function (res) {
                    var userInfo = res.userInfo
                    var nickName = userInfo.nickName
                    var avatarUrl = userInfo.avatarUrl
                    var gender = userInfo.gender //性别 0:未知、1:男、2:女
                    var province = userInfo.province
                    var city = userInfo.city
                    var country = userInfo.country
                    resolve(userInfo);
                }
            })
        })
    }

    openDataContext = new WxgameOpenDataContext();
}

class WxgameOpenDataContext {
    createDisplayObject(type,width,height){
        const bitmapdata = new egret.BitmapData(sharedCanvas);
        bitmapdata.$deleteSource = false;
        const texture = new egret.Texture();
        texture._setBitmapData(bitmapdata);
        const bitmap = new egret.Bitmap(texture);
        bitmap.width = width;
        bitmap.height = height;

        egret.startTick((timeStarmp) => {
            egret.WebGLUtils.deleteWebGLTexture(bitmapdata.webGLTexture);
            bitmapdata.webGLTexture = null;
            return false;
        }, this);
        return bitmap;
    }

    postMessage(data){
        const openDataContext = wx.getOpenDataContext();
        openDataContext.postMessage(data);
    }
}

window.platform = new WxgamePlatform();

Platform声明了平台函数,在egret中可以直接调用,在各个平台中实现代码即可。

三、在egret中调用登陆,并获取微信用户信息。在main.ts中写入如下代码。

await platform.login()调用登陆API,
const userInfo = await platform.getUserInfo();获取微信用户信息,并返回用户信息,
await 异步调用,返回调用结果在执行下一步。

class Main extends egret.DisplayObjectContainer {

    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
    }

    private onAddToStage(event: egret.Event) {
        this.runGame().catch(e => {
            console.log(e);
        })
    }

    private async runGame() {
        await platform.login();
        const userInfo = await platform.getUserInfo();
        this.createGameScene(userInfo);
    }

    private textfield: egret.TextField;

    /**
     * 创建游戏场景
     * Create a game scene
     */
    private createGameScene(userInfo: any) {

        let bg: eui.Rect = new eui.Rect();
        this.addChild(bg);
        bg.width = this.stage.width;
        bg.height = this.stage.height;
        bg.fillColor = 0xF8F8F8;

        let avatar: eui.Image = new eui.Image();
        avatar.x = 100;
        avatar.y = 100;
        avatar.width = 120;
        avatar.height = 120;
        avatar.source = userInfo.avatarUrl;
        this.addChild(avatar);

        let nickName: eui.Label = new eui.Label();
        nickName.x = 100;
        nickName.y = 250;
        nickName.textColor = 0xff0000;
        nickName.text = userInfo.nickName;
        this.addChild(nickName);
    }
}

打包微信工程,并在开发者工具打开。运行获取到微信用户信息。

2017-05-06 09:27:52 ubunrabbit 阅读数 492

进入主题

 

Android端

 

通过gameEngine.setRuntimeInterface获取Egret向本地发送的命令消息进行读取写入操作,这里只介绍sharedprefference,数据库存储类似。

 

 

/**
* 写入
* @param context
* @param key
* @param data
*/
public static void saveData(Context context, String key, Object data){

String type = data.getClass().getSimpleName();
SharedPreferences sharedPreferences = context
.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();

if ("Integer".equals(type)){
editor.putInt(key, (Integer)data);
}else if ("Boolean".equals(type)){
editor.putBoolean(key, (Boolean)data);
}else if ("String".equals(type)){
editor.putString(key, (String)data);
}else if ("Float".equals(type)){
editor.putFloat(key, (Float)data);
}else if ("Long".equals(type)){
editor.putLong(key, (Long)data);
}

editor.commit();
}

/**
* 读取
* @param context
* @param key
* @param defValue
* @return
*/
public static Object getData(Context context, String key, Object defValue){

String type = defValue.getClass().getSimpleName();
SharedPreferences sharedPreferences = context.getSharedPreferences
(FILE_NAME, Context.MODE_PRIVATE);

//defValue为为默认值,如果当前获取不到数据就返回它
if ("Integer".equals(type)){
return sharedPreferences.getInt(key, (Integer)defValue);
}else if ("Boolean".equals(type)){
return sharedPreferences.getBoolean(key, (Boolean)defValue);
}else if ("String".equals(type)){
return sharedPreferences.getString(key, (String)defValue);
}else if ("Float".equals(type)){
return sharedPreferences.getFloat(key, (Float)defValue);
}else if ("Long".equals(type)){
return sharedPreferences.getLong(key, (Long)defValue);
}

return null;
}

 

 

 

最后

 

IOS端

通过[EgretRuntimegetInstance] setRuntimeInterface获取Egret向native发送的消息,并做相关处理

这里只介绍NSUserDefaults方式,其他方式类似,轻量级用这个也足够了。

#pragma mark - 写入

+ (void)setItem:(NSString *)key value:(NSString *)value{

    NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];

    [user setObject:value forKey:key];

}

 

#pragma mark - 读取

+ (NSString *)getItem:(NSString *)key{

    NSUserDefaults *user = [NSUserDefaultsstandardUserDefaults];

    NSString *value = [user objectForKey:key];

    return value;

 

}

 

完成

 

原理,通过egret与本地通讯,实现native调用。

egret

阅读数 741

没有更多推荐了,返回首页