跳到主要内容

game_server.entity_sync

简介

基于engine和发布/订阅机制实现的实体数据同步功能

一些说明:

  1. 进行数据同步的实体对象需要包含组件pkg.entity_sync.FEntitySync;

  2. 通过new_sync_id申请一个同步频道sync_id

  3. 需要进行数据同步的实体对象通过join_sync加入同步频道

  4. 实体对象可以通过quit_sync主动退出同步频道

  5. 可以通过stop_sync让同步频道中的所有实体对象退出同步

组件接口

FEntitySync.gs

基于发布/订阅机制实现的实体对象数据同步组件

实体对象申请一个同步频道ID(new_sync_id)

其他参与者通过同步频道ID加入同步频道(join_sync)

频道创建实体对象可以主动停止同步频道(stop_sync)

其它频道参与者可以通过主动退出同步频道(quit_sync)

函数原型函数作用
string new_sync_id(string name)申请一个同步频道
void stop_sync(string sync_id)停止同步频道(所有参与者退出)
bool join_sync(string sync_id, function func)加入同步频道
void quit_sync(string sync_id)退出已参加的同步频道
void quit_all_sync()从已参与的所有同步频道中退出
void sync_raise(string sync_id, string event, ...)发布数据同步事件!
bool sync_flush(string sync_id, mixed wait_time = -1)等待频道消息执行完

样例

object create_hero()
{
map hero_dbase = {};
return EntityFactory.create_entity(1, hero_dbase);
}

public void test()
{
int i;
object ob1 = create_hero();
object ob2 = create_hero();

string sync_id = ob1=>new_sync_id("NAME");

ob2=>join_sync(sync_id, (: on_event_sync_id1 :));
for (i = 1 upto 10)
ob1=>sync_raise(sync_id, "event_id", i);

ob1=>stop_sync(sync_id);
for (i = 11 upto 20)
ob1=>sync_raise(sync_id, "event_id", i);

string sync_id2 = ob1=>new_sync_id("NAME2");
ob2=>join_sync(sync_id2, (: on_event_sync_id2 :));
for (i = 1 upto 10)
ob1=>sync_raise(sync_id2, "event_id2", i);

ob2=>quit_sync(sync_id2);

for (i = 11 upto 20)
ob1=>sync_raise(sync_id2, "event_id2", i);
}

void on_event_sync_id1(string sync_id, string event, object raiser, ...)
{
printf("event1: %O", $<);
}

void on_event_sync_id2(string sync_id, string event, object raiser, ...)
{
printf("event2: %O", $<);
}