用KBE用了小半年 還是菜鳥級別 最近感覺會了些東西,發出來共享一下哈~
謝謝KBE大大的指導以及青蛙大神的視頻,讓我學會了部分用的方法,我是想做一個卡牌的遊戲,這個帖子就是一個在線列表的例子。
基礎:
看完青蛙的教程
主要內容:
維護一個實體
實體間通信
正文:
首先在kbe的腳本文件夾裏新建一個實體的腳本文件,這裏就弄一個Hall.py
與之對應的,需要在assets\scripts\entity_defs文件夾裏新建一個Hall.def的文件
還有在entities.xml文件裏註冊該實體,三個文件按以下內容(供參考)
首先是Hall.py這個文件
# -*- coding: utf-8 -*-
import KBEngine
import random
import time
from KBEDebug import *
class Hall(KBEngine.Base):
def __init__(self):
DEBUG_MSG("Hall加載完成")
KBEngine.Base.__init__(self)
#儲存大廳
KBEngine.globalData["Halls"] = self
# 存放所有在線玩家mailbox
self.player = []
#定時更新當前玩家
self.addTimer(3, 6, 1)
def onTimer(self, id, userArg):
DEBUG_MSG(id, userArg)
#更新在線人數
if userArg == 1:
self.UpdataPlayer()
def UpdataPlayer(self):
#此函數更新在線人數
for i in range(len(self.player)):
if self.player[i].isDestroyed == True:
del self.player[i]
DEBUG_MSG("當前在線人數:%i" % len(self.player))
def reqAddPlayer(self,player):
#此函數添加上線玩家入列表
if player in self.player:
return
self.player.append(player)
def reqPlayerSum(self,player):
#此函數是爲了獲得在線人數
player.OnPlayerSum(len(self.player))
下面大概說一下上面的Hall.py
前面的都差不多
在init裏面KBEngine.Base.__init__(self)我也不太懂。。
KBEngine.globalData["Halls"] = self
這個是把這個實體註冊到kbe的全局變量裏(globalData),這樣別的腳本調用這個就直接KBEngine.globalData["Halls"].XXXX就能調用了
下面那個定時器是更新在線玩家用的 UpdataPlayer裏會刪除列表裏的無效實體
後面reqAddPlayer 是把Account實體的Mailbox傳進來加到那個列表裏
reqPlayerSum是Account實體調用來獲取在線人數的方法,把mailbox傳進來 再調用mailbox的方法把在線人數傳出去
然後是Hall.def
<root>
<Implements>
</Implements>
<Properties>
</Properties>
<BaseMethods>
<UpdataPlayer>
<!--更新有多少在線玩家的方法 -->
</UpdataPlayer>
<reqAddPlayer>
<!--玩家上線向彙報的方法 -->
<Arg> MAILBOX </Arg>
</reqAddPlayer>
</BaseMethods>
<CellMethods>
</CellMethods>
</root>
我是這樣寫的 中間BaseMethods裏我也不知道需要加多少方法 但是寫到這麼多就可以用了 好像是外部調用才寫
Entities.xml裏面加一行 <Hall/>就行了
除此之外,還需要在assets\scripts\base\kbengine.py裏面添加初始化Hall.py的代碼,自己寫的時候就是沒加。。。感謝kbe的指正。。。
def onBaseAppReady(isBootstrap):
"""
KBEngine method.
baseapp已經準備好了
@param isBootstrap: 是否爲第一個啓動的baseapp
@type isBootstrap: BOOL
"""
INFO_MSG('onBaseAppReady: isBootstrap=%s, bootstrapGroupIndex=%s, bootstrapGlobalIndex=%s' % \
(isBootstrap, os.getenv("KBE_BOOTIDX_GROUP"), os.getenv("KBE_BOOTIDX_GLOBAL")))
if isBootstrap:
# 創建大廳
KBEngine.createBaseLocally( "Hall", {} )
這個方法改寫成這樣就行了 主要後三行 夾着前面註釋可以看的懂 就不說了
然後在assets\scripts\base\Account.py裏面寫一些(官方最小assert裏面就有 我就是用那個寫的)
首先
def __init__(self):
KBEngine.Proxy.__init__(self)
"""
在在線玩家列表註冊自己
"""
KBEngine.globalData["Halls"].reqAddPlayer(self)
Init加一行 就最後的 在初始化的時候註冊自己
而後
def reqPlayerSum(self):
KBEngine.globalData["Halls"].reqPlayerSum(self)
def OnPlayerSum(self,sum):
self.client.onGetPlayerSum(sum)
添加這樣兩個方法
第一個允許客戶端調用 來獲取在線玩家數量
第二個方法是Hall.py調用的 來獲取人數的 順便給調用客戶端方法 來通知客戶端
客戶端部分
Account.cs裏添加一個得到的方法
public void onGetPlayerSum(object data)
{
Event.fireOut("onGetPlayerSum", data);
}
客戶端部分青蛙視頻裏說的很好 這裏就不贅述了 這樣 一個在線人數列表維護的例子就完了
菜鳥經驗~歡迎指正 哈