mapvision
简介
场景视野
一些说明:
- FMapVisionBase/MapVisionBase是基于ffi实现的;FMapVisionBaseNotffi/MapVisionBaseNotffi是不使用ffi实现的;
ffi版本实现时几个不利的地方:
-
由于使用者需要从脚本层向ffi登记回调函数,为了减少ffi调用脚本层所登记的回调函数的次数,遍历视野时需要构造视野里的实体数组;非ffi版本中则不需要这么处理;
-
由于脚本层只能将实体对象的引用记录在ffi层(比如handle_id),ffi层调用脚本层回调函数时,脚本层回调函数需要将实体对象的引用还原为实体对象;非ffi版本中则不需要这么处理;
-
ffi版本中,相同情况下,获取实体列表后再遍历,比将回调函数扔给ffi进行遍历快但是相对浪费内存(ffi层调用脚本回调效率低,应该减少调用次数)
功能介绍
- 该包提供基于格子的场景视野功能,包括进程场景、移动的视野维护
- 使用该包的场景对象需要继承
components/FMapVisionBase.gs
,在场景中拥有视野的的实体对象需要继承FMapEntityVisionBase.gs
基本使用
-
创建一个具有视野的场景
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); -
创建一个场景中的实体对象
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()); -
实体在场景中的一系列动作
// 进入场景
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实现的版本)