上一篇文章介绍了主域和子域的概念,微信小游戏:主域子域,这一篇介绍一下怎样在微信小游戏中制作好友排行榜
创建工程
由于开放数据域是一个封闭、独立的 JavaScript 作用域,所以开发者需要创建两个项目:
- 主域项目工程(正常的游戏项目)
- 子域项目工程(通过微信 API 获取用户数据来做排行榜等功能)
在我的示例中client是主域工程,children是子域工程,工程目录可以不相关
发布设置有几点注意事项
- 首先,左侧主域中开放数据域代码目录要和右侧子域的游戏名称相同
- 其次,右侧子域的发布路径要在主域发布路径之下,在我的工程中,主域的发布路径是
G:\B2\trunk\code\client\build,那么子域的发布路径就要是G:\B2\trunk\code\client\build\wechatgame - 最后要先构建主域,再构建子域,因为构建子域的时候主域目录可能不存在,如果确认主域已经构建过,且只修改了子域的内容,也可以只构建子域工程。如果构建了主域要重新构建子域,因为构建的时候,Cocos Creator会把之前的构建目录删除掉。
核心代码
主域
这段代码可以写在你的游戏结算函数中,告诉子域游戏要结算了
if(cc.sys.platform == cc.sys.WECHAT_GAME)
{
wx.postMessage({score : this.score, type : "open"});
}
子域
var self = null;
cc.Class({
extends: cc.Component,
properties: {
scroll_view_content : cc.Node,
score_num_txt : cc.Label,
max_score_notice : cc.Node,
scroll_item_prefab : cc.Prefab,
root_node : cc.Node,
},
start () {
this.max_score = 0;
if(cc.sys.platform == cc.sys.WECHAT_GAME)
{
wx.onMessage(this.on_message_come);
wx.getUserCloudStorage({
keyList : ["max_score"],
success : this.get_user_data_success,
fail : this.get_user_data_fail,
});
wx.getFriendCloudStorage({
keyList : ["max_score"],
success : this.get_friend_data_success,
fail : this.get_friend_data_fail,
});
}
self = this;
},
on_message_come : function(data)
{
if(data["type"] == "open")
{
var score = data["score"];
self.refresh(score);
if(score > self.max_score)
{
wx.setUserCloudStorage({
KVDataList : [{key : "max_score", value : score.toString()}],
success : self.set_data_success,
fail : self.set_data_fail,
});
wx.getFriendCloudStorage({
keyList : ["max_score"],
success : self.get_friend_data_success,
fail : self.get_friend_data_fail,
});
self.max_score = score;
}
}
},
refresh : function(score)
{
this.score_num_txt.string = score;
if(score > this.max_score)
{
this.max_score_notice.active = true;
}
else
{
this.max_score_notice.active = false;
}
var items_d = [];
for(var k in this.cached_data)
{
items_d.push(this.cached_data[k]);
}
items_d.sort(function(a, b){return b["max_score"] - a["max_score"];});
for(var i = 0; i < items_d.length; i++)
{
if(i < this.cached_scroll_item.length)
{
this.cached_scroll_item[i].refresh(i, items_d[i]);
}
else
{
var new_node = cc.instantiate(this.scroll_item_prefab);
new_node.parent = this.scroll_view_content;
var controller = new_node.getComponent("RankItemController");
controller.refresh(i, items_d[i]);
this.cached_scroll_item.push(controller);
}
}
},
set_data_success : function(result)
{
console.log(result);
},
set_data_fail : function(result)
{
console.log(result);
},
get_user_data_success : function(result)
{
console.log(result);
var data = result["KVDataList"];
for(var item in data)
{
if(data[item]["key"] == "max_score")
{
self.max_score = parseInt(data[item]["value"]);
break;
}
}
},
get_user_data_fail : function(result)
{
console.log(result);
},
get_friend_data_success : function(result)
{
var data = result["data"];
for(var k in data)
{
var final_d = {};
var item_d = data[k];
var kv_list = item_d["KVDataList"]
final_d["url"] = item_d["avatarUrl"];
final_d["nickname"] = item_d["nickname"];
for(var kv in kv_list)
{
if(kv_list[kv]["key"] == "max_score")
{
final_d["max_score"] = parseInt(kv_list[kv]["value"]);
break;
}
}
self.cached_data[item_d["openid"]] = final_d;
}
console.log(result);
console.log(self.cached_data);
},
get_friend_data_fail : function(result)
{
console.log(result);
}
});
- 获取好友数据成功后的数据格式可以参考微信小游戏:主域子域中的介绍
- 各个子域函数的用法也可以参考微信小游戏:主域子域中的介绍
下一篇文章将介绍一些微信小游戏中遇到的一些问题及解决方式
1.开发工具:https://www.cocos.com/
推广一下自己做的简单的小游戏
创建了一个小游戏交流群,如果过期或者满了或者有问题交流 可以加我微信 备注“微信小游戏”