圣叹@游戏开发

我们面对现实,我们终于理想

Widget开发实例"Love Me”——数据存储

| |
13:56 , Qizhi
如果要开发游戏,存储玩家数据,或制作排行榜单,或调查问卷,或......比如圣叹新作:Love Me挂件只是逗逗美女,离开了数据的存储--尤其是所有挂件用户可见(非Person Appdata)就显得无能为力。Opensocial 0.7删除了用于全局存储的newUpdateInstanceAppDataRequest方法,且newFetchPersonAppDataRequest只能使用ViewerID存储,但是Myspace为开发者们提供了另一条存储路径:MyOpenSpace扩展。

在MyOpenSpace扩展中仍然使用Opensocial协议的newFetchPersonAppDataRequest / newUpdatePersonAppDataRequest方法,只是在存取是添加参数MyOpenSpace.Group.GLOBAL_APP_DATA即可实现InstanceAppData的功能,格式如下:

newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, "key");
newUpdatePersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, "key", "value");

比如在Love Me挂件中,每个用户独立的数据存储在全局GLOBAL_APP_DATA表中,为了区分不同用户的数据使用挂件安装者(Owner)的ID做Key,所以在获取数据之前要首先取得OwnerID:

function init()
{
$('errorBox').style.display = "none";
var os = opensocial.Container.get();  
var dataReqObj = os.newDataRequest();
dataReqObj.add(os.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER));
dataReqObj.send(onGetOwner);
}

function onGetOwner(response)
{
if(response.hadError())
{
  //
}
else
{    
  var owner = response.get(opensocial.DataRequest.PersonId.OWNER).getData();
  ownername = owner.getDisplayName();
  ownerid = owner.getId();
  getAppData();
}
}

接下来则需要利用该ownerid获取存储的数据,由于每条数据由正文和回复组成,所以key由ownerid + 'lovemewidget' 与ownerid + 'lovememanager'组成:

function getAppData()
{
var os = opensocial.Container.get();  
var dataReqObj = os.newDataRequest();
  
dataReqObj.add(os.newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, ownerid + 'lovemewidget'), 'loveme');
dataReqObj.add(os.newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, ownerid + 'lovememanager'), 'manager');
      
dataReqObj.send(onGetAppdata);
}

function onGetAppdata(response)
{
if(response.hadError())
{
  //
}
else
{    
  var data = response.get('loveme').getData();
  var resp = response.get('manager').getData();
  var html = "";

  if(data[ownerid + "lovemewidget"])
    html+= data[ownerid + "lovemewidget"];
  if(resp[ownerid + "lovememanager"])
    html+= resp[ownerid + "lovememanager"];

  $('output').innerHTML = html;
  getViewerData();  
}
}

注意取得Appdata的方式与普通newFetchPersonAppDataRequest的区别,不再使用PersonAppData中的ViewerID取值,而是直接使用getData()方法:
var data = response.get('loveme').getData();

数据的存储也仅仅在newUpdatePersonAppDataRequest添加参数实现,例如:

function onSubmit()
{
  if(viewername == "")
  {
    $('errorBox').style.display = "block";
    $('errorBox').innerHTML = "您可能尚未登录...";
    return;
  }
  var actionObj = $("actionSel");
  var resultObj = $("resultSel");
  var actionStr = actionObj.options[actionObj.selectedIndex].text;
  var resultStr = resultObj.options[resultObj.selectedIndex].text;
    
  var rs = opensocial.newDataRequest();

  //key由ownerid区分
  var key = ownerid + "lovemewidget";
  var value = ownername + "正在被 " + "<a href=\""+ viererprofile +"\" target=\"_blank\">" + viewername + "</a> <strong>"+ actionStr + "</strong>的<strong>" + resultStr + "</strong>";
  displayContent = value;
  
  //存储Appdata,全局变量
  rs.add(rs.newUpdatePersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, key, value), 'loveme');
  rs.send(updateSent);
  $('output').innerHTML = "正在保存数,IE浏览器请提交后刷新页面查看结果。";
}


更加详细的源代码请参考Love Me挂件:http://www.myspace.cn/1306769259
网友评论(0):
发表评论:

昵称: 
电邮:
网址: