跳到主要内容

mapvision

简介

场景视野

一些说明:

  1. FMapVisionBase/MapVisionBase是基于ffi实现的;FMapVisionBaseNotffi/MapVisionBaseNotffi是不使用ffi实现的;

ffi版本实现时几个不利的地方:

  1. 由于使用者需要从脚本层向ffi登记回调函数,为了减少ffi调用脚本层所登记的回调函数的次数,遍历视野时需要构造视野里的实体数组;非ffi版本中则不需要这么处理;

  2. 由于脚本层只能将实体对象的引用记录在ffi层(比如handle_id),ffi层调用脚本层回调函数时,脚本层回调函数需要将实体对象的引用还原为实体对象;非ffi版本中则不需要这么处理;

  3. ffi版本中,相同情况下,获取实体列表后再遍历,比将回调函数扔给ffi进行遍历快但是相对浪费内存(ffi层调用脚本回调效率低,应该减少调用次数)

功能介绍

  1. 该包提供基于格子的场景视野功能,包括进程场景、移动的视野维护
  2. 使用该包的场景对象需要继承components/FMapVisionBase.gs,在场景中拥有视野的的实体对象需要继承FMapEntityVisionBase.gs

基本使用

  1. 创建一个具有视野的场景

    map1.gs
    component pkg.mapvision.components.FMapVisionBase;

    void create(map para = nil)
    {
    // init code
    }

    use.gs
    import .map1;

    map para = {
    "col" : 100, // 宽100
    "row" : 100, // 高100
    "vision" : 10 // 视野范围10
    };
    object map_ob = new_object(map1, this_domain(), para);
  2. 创建一个场景中的实体对象

    entity1.gs
    component pkg.mapvision.components.FMapEntityVisionBase;

    void create(map para = nil)
    {
    // init code
    }

    use.gs
    import .entity1;

    object en_ob = new_object(entity1, this_domain());
  3. 实体在场景中的一系列动作

    // 进入场景
    int x = 20;
    int y = 30;
    map_ob.entity_enter(en_ob, x, y);

    // 离开场景
    map_ob.entity_leave(en_ob);

    // 在场景中移动
    int new_x = 30;
    int new_y = 40;
    map_ob.entity_move(en_ob, new_x, new_y);

组件接口

FMapEntityVisionBase.gs

场景视野中的实体继承组件

函数原型函数作用
void notify_vision_create(object map_ob)实体进入视野场景后的回调
void notify_vision_destroy(object map_ob)视野场景中的实体被销毁后的回调
void notify_vision_appear(object map_ob, object entity_ob)实体进入视野后的回调
void notify_vision_disappear(object map_ob, object entity_ob)实体离开视野后的回调
void notify_vision_move(object map_ob, object entity_ob)实体在场景中移动后的回调

FMapVisionBase.gs

场景视野继承组件(ffi版本)

函数原型函数作用
array get_vision_at_pos(int x, int y, int radius = -1)通过坐标获取实体
array get_vision_of_entity(object ob, int radius = -1)获取实体半径范围内的所有实体
array get_vision()获取场景内的所有实体对象
void iterate_vision(function func)遍历场景内的所有实体
void iterate_vision_of_entity(object entity, int radius, function func)遍历场景内指定实体视野范围内的所有实体
void iterate_vision_at_pos(int x, int y, int radius, function func)遍历场景内指定位置内的所有实体
mixed get_entity_data(object ob)获取实体数据
void set_entity_custom_data(object ob, int data)设置实体私有数据
int get_entity_custom_data(object ob)获取实体私有数据

FMapVisionBaseNotffi.gs

场景视野继承组件(不使用ffi实现的版本)

函数原型函数作用
array get_vision_at_pos(int x, int y, int radius = -1)通过坐标获取实体
array get_vision_of_entity(object entity, int radius = -1)获取实体半径范围内的所有实体
array get_vision()获取场景内的所有实体对象
void iterate_vision(function func)遍历场景内的所有实体
void iterate_vision_of_entity(object entity, int radius, function func)遍历场景内指定实体视野范围内的所有实体
void iterate_vision_at_pos(int x, int y, int radis, function func)遍历场景内指定位置内的所有实体
mixed get_entity_data(object entity)获取实体数据
void set_entity_custom_data(object entity, mixed data)设置实体私有数据
int get_entity_custom_data(object entity)获取实体私有数据

mapvision.gs

函数原型函数作用
int get_on_event_address()获取回调函数地址
object new_map(map para)创建一个场景视野对象
object new_map_not_ffi(map para)创建一个场景视野对象

MapVisionBase.gs

场景视野对象(ffi版本)

函数原型函数作用
array get_vision_of_entity(int entity_id, int radius = -1)获取实体半径范围内的所有实体id
array get_vision_at_pos(int x, int y, int radius = -1)获取坐标点半径范围内的所有实体的id
array get_vision()获取所有场景内所有实体对象的id
void iterate_vision(function func)遍历场景内所有实体对象
void iterate_vision_at_pos(int x, int y, int radius, function func)遍历场景内指定位置内的所有实体
void iterate_vision_of_entity(int entity_id, int radius, function func)遍历场景内指定实体视野范围内的所有实体
map get_entity_data(int entity_id)获取实体数据
void set_entity_custom_data(int entity_id, int data)设置实体的私有数据
int get_entity_custom_data(int entity_id)获取实体私有数据
bool entity_enter(int entity_id, int x, int y)实体进入视野场景
bool entity_leave(int entity_id)实体离开视野对象
bool entity_move(int entity_id, int x, int y)实体移动
void on_event(enum VisionEvent type, int paras1_ptr, int paras2_ptr)事件回调,包括进入,离开,移动
void set_callback(VisionEvent type, function callback)注册事件处理函数

MapVisionBaseNotffi.gs

场景视野对象(不使用ffi实现的版本)

函数原型函数作用
array get_vision_of_entity(EntityIdType entity_id, int radius = -1)获取实体半径范围内的所有实体id
array get_vision_at_pos(int x, int y, int radius = -1)获取坐标点半径范围内的所有实体的id
array get_vision()获取场景内所有实体对象的id
void iterate_vision(function func)遍历场景内所有实体对象
void iterate_vision_at_pos(int x, int y, int radius, function func)遍历场景内指定位置内的所有实体
void iterate_vision_of_entity(EntityIdType entity_id, int radius, function func)遍历场景内指定实体视野范围内的所有实体
Entity get_entity_data(EntityIdType entity_id)获取实体数据
void set_entity_custom_data(EntityIdType entity_id, mixed data)设置实体的私有数据
mixed get_entity_custom_data(EntityIdType entity_id)获取实体私有数据
bool entity_enter(EntityIdType entity_id, int x, int y)实体进入视野场景
bool entity_leave(EntityIdType entity_id)实体离开视野对象
bool entity_move(EntityIdType entity_id, int x, int y)实体移动
void set_callback(VisionEvent type, function callback)注册事件处理函数