kbengine:【菜鳥寫的教程系列01】在線列表的例子

用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傳進來加到那個列表裏

reqPlayerSumAccount實體調用來獲取在線人數的方法,把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);

     }

 

客戶端部分青蛙視頻裏說的很好 這裏就不贅述了 這樣 一個在線人數列表維護的例子就完了

菜鳥經驗~歡迎指正 哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章