-
Notifications
You must be signed in to change notification settings - Fork 4
自定义复杂类型(排行榜)
ilvxna edited this page Aug 8, 2018
·
5 revisions
问:
我想做个排行榜,每一秒钟更新一次排行榜。排行榜在游戏房间里会被显示。不知道哪里出错了,插入的时候总是错误。 我在cell/Room.py中加入了一个更新的函数。获取info会有数据,就是插入的时候错误。
错误代码:
[S_ERROR]: TypeError: set FIXED_DICT(RANKING_DATA) error! at key: socre(NULL), keyNames=[name(UNICODE), socre(SCORE)].
[S_ERROR]: TypeError: Array elements must be set to type ss (setting slice 0-0)
cell/Room.py中的更新函数:
def updateRankingList(self):
for i in self.avatars:
info={
"name":KBEngine.entities.name,
"score":KBEngine.entities.score
}
INFO_MSG("%s %s " % (info,[info]))
self.roomRankingList["value"].extend([info])
自定义类型:
<SCORE> UINT32 </SCORE>
<RANKING_DATA> FIXED_DICT
<Properties>
<name>
<Type> UNICODE </Type>
</name>
<socre>
<Type> SCORE </Type>
</socre>
</Properties>
</RANKING_DATA>
<RANKING_DATA_LIST> FIXED_DICT
<Properties>
<value>
<Type> ARRAY <of> RANKING_DATA </of> </Type>
</value>
</Properties>
</RANKING_DATA_LIST>
Room.def:
<Properties>
<roomKey>
<Type> SPACE_KEY </Type>
<Flags> BASE </Flags>
<Persistent> true </Persistent>
</roomKey>
<roomKeyC>
<Type> SPACE_KEY </Type>
<Flags> CELL_PUBLIC </Flags>
</roomKeyC>
<roomRankingList>
<Type> RANKING_DATA_LIST </Type>
<Flags> ALL_CLIENTS </Flags>
<Persistent> false </Persistent>
</roomRankingList>
</Properties>
答: 直接append试试。
问:
def updateRankingList(self):
for i in self.avatars:
info={
"name":KBEngine.entities.name,
"score":KBEngine.entities.score
}
INFO_MSG("%s %s " % (info,[info]))
self.roomRankingList["value"].append(info)
还是一样有错误:
[S_ERROR]: TypeError: set FIXED_DICT(RANKING_DATA) error! at key: socre(NULL), keyNames=[name(UNICODE), socre(SCORE)].
[S_ERROR]: TypeError: Array elements must be set to type ss (setting slice 0-0)
答: socre错了。
问: 我现在已经在cell/Room.py中获得了各个用户的姓名和得分,并按照得分排好顺序了,保存在:
self.roomRankingList["value"]
里。现在要如何把排好序的自定义类型数据发送给客户端。我在客户端用了
set_roomRankingList()
方法接收不到。也在服务器用了
self.allClients.onUpdataRankingList(self.roomRankingList)
都不行。
def updateRankingList(self):
for index in self.avatars:
self.rankingList[index]["score"]=KBEngine.entities[index].score
temp= sorted(self.rankingList.items(), key=lambda d:d[1].get("score",0), reverse = True)
index=3
topThree=[]
for i in temp:
if index>0:
topThree.append(i[1])
index-=1
else:
break
self.roomRankingList["value"]=topThree
self.allClients.onUpdataRankingList(self.roomRankingList)
<Properties>
<roomRankingList>
<Type> RANKING_DATA_LIST </Type>
<Flags> ALL_CLIENTS </Flags>
<Persistent> false </Persistent>
</roomRankingList>
</Properties>
<ClientMethods>
<onUpdataRankingList>
<Arg> RANKING_DATA_LIST </Arg>
</onUpdataRankingList>
</ClientMethods>
答:
self.roomRankingList=self.roomRankingList
就可以同步了。 字典和数组改动元素不通知.
问: 我在
updateRankingList()
函数最后面加了:
self.roomRankingList=self.roomRankingList
。然后客户端那边要怎么写。直接在Avatar.cs中写:
set_roomRankingList()
方法吗?还是新建一个Room.cs(跟Food.cs那样),然后在Room.cs写
set_roomRankingList()
就好?我像上面那样写都不行,可以说下吗?谢谢!!!
答:
set_roomRankingList
写在对应的实体cs里.
问:
namespace KBEngine
{
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
public class Room : KBEngine.Entity
{
public Room()
{
}
public void set_roomRankingList(object old)
{
Debug.Log("Room_set_roomRankingList");
object v = getDefinedProperty("roomRankingList");
Event.fireOut("set_roomRankingList", new object[] { this, v });
}
}
}
我把set_roomRankingList放在Room.cs里还是没有收到信息。
答:
ALL_CLIENTS 类属性想要同步给客户端, 需要实体有cell部分, 并且实体处于玩家的AOI之内。
你这个东西你就自己方法调用传给客户端算了。