Skip to content

自定义复杂类型(排行榜)

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之内。

你这个东西你就自己方法调用传给客户端算了。

Clone this wiki locally