wing的Platform.ts这么写
/**
* 平台数据接口。
* 由于每款游戏通常需要发布到多个平台上,所以提取出一个统一的接口用于开发者获取平台数据信息
* 推荐开发者通过这种方式封装平台逻辑,以保证整体结构的稳定
* 由于不同平台的接口形式各有不同,白鹭推荐开发者将所有接口封装为基于 Promise 的异步形式
*/
declare interface Platform {
getUserInfo(): Promise<any>;
login(): Promise<any>
getPlatformSign(): Promise<any>;
}
class DebugPlatform implements Platform {
async getUserInfo() {
return { nickName: "username" }
}
async login() {
}
async getPlatformSign() {
return { platform: "h5" };
}
}
if (!window.platform) {
window.platform = new DebugPlatform();
}
declare let platform: Platform;
declare interface Window {
platform: Platform
}
微信的platform.js这么写
/**
* 请在白鹭引擎的Main.ts中调用 platform.login() 方法调用至此处。
*/
class WxgamePlatform {
name = 'wxgame'
getPlatformSign() {
return {
platform: "wx"
};
}
login() {
return new Promise((resolve, reject) => {
wx.login({
success: (res) => {
resolve(res)
}
})
})
}
getUserInfo(left, bottom) {
return new Promise((resolve, reject) => {
let sysInfo = wx.getSystemInfoSync();
let sdkVersion = sysInfo.SDKVersion;
sdkVersion = sdkVersion.replace(/\./g, "");
sdkVersion = sdkVersion.substr(0, 3);
let sdkVersionNum = parseInt(sdkVersion);
//判断用户是否授权过
wx.getSetting({
success(res) {
console.log("res.code = ", res.code);
if (sdkVersionNum >= 201 && !res.authSetting['scope.userInfo']) {
//获取微信界面大小
let width = sysInfo.screenWidth;
let height = sysInfo.screenHeight;
let xPercent = (720 - 262) / 2 / 720;
let yPercent = (1280 - 98) / 2 / 1280;
let wPercent = (260 / 720);
let hPercent = (98 / 1280);
var button = wx.createUserInfoButton({
type: 'text',
text: ' ',
// type: 'image',
// image: 'http://www.oneh5.com/iptv/h5/egret/billiard/resource/game/jiqiu.png',
style: {
left: width * xPercent,
top: height * yPercent,
width: width * wPercent,
height: height * hPercent,
}
});
button.onTap((res) => {
if (res.userInfo) {
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;
button.destroy();
resolve(userInfo);
} else {
button.destroy();
resolve(userInfo);
}
});
} else {
wx.getUserInfo({
withCredentials: true,
success: 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);
},
fail: res => {
wx.showModal({
title: '友情提醒',
content: '请允许微信获得授权!',
confirmText: "授权",
showCancel: false,
success: res => {
resolve(null);
}
});
}
});
}
}
})
});
}
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;
if (egret.Capabilities.renderMode == "webgl") {
const renderContext = egret.wxgame.WebGLRenderContext.getInstance();
const context = renderContext.context;
需要用到最新的微信版本
调用其接口WebGLRenderingContext.wxBindCanvasTexture(number texture, Canvas canvas)
如果没有该接口,会进行如下处理,保证画面渲染正确,但会占用内存。
if (!context.wxBindCanvasTexture) {
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();
使用的时候,这么用
private async initWX() {
egret.log("initWX 1");
let bgImg: egret.Bitmap = new egret.Bitmap();
bgImg.texture = RES.getRes(ResImgDefine.img_loading_bg_jpg);
this.addChild(bgImg);
let btnLogin: egret.Bitmap = new egret.Bitmap();
btnLogin.texture = RES.getRes(ResImgDefine.btn_ok_png);
this.addChild(btnLogin);
btnLogin.x = (GDatas.getStageWidth() - btnLogin.width) / 2;
btnLogin.y = (GDatas.getStageHeight() - btnLogin.height) / 2;
let label: eui.Label = new eui.Label();
label.horizontalCenter = 0.5;
label.verticalCenter = 0.5;
label.verticalAlign = egret.VerticalAlign.MIDDLE;
label.bold = true;
label.size = 40;
label.textAlign = egret.HorizontalAlign.CENTER;
label.$setWidth(btnLogin.width);
label.$setHeight(btnLogin.height);
label.$setBackgroundColor(0x00ff00);
label.$setTextColor(0x000000);
label.$setText("开始");
this.addChild(label);
label.x = btnLogin.x;
label.y = btnLogin.y;
GDatas.platformType = EPlatformType.h5;
let sign = await platform.getPlatformSign();
if (sign) {
let plat: string = sign["platform"]
egret.log("is plat = ", plat);
if (plat === "wx") {
GDatas.platformType = EPlatformType.wx;
GDatas.userInfo = await platform.getUserInfo();
egret.log("GameEntry:: userInfo = ", GDatas.userInfo);
let loginRes = await platform.login();
// loginRes = {errMsg: "login:ok", code: "043NGnW70DszQF1nnCW700uHW70NGnWs"}
egret.log("loginRes = ", loginRes);
}
}
App.DisplayUtils.removeFromParent(btnLogin);
App.DisplayUtils.removeFromParent(bgImg);
App.DisplayUtils.removeFromParent(label);
this.enterGame();
}