2017-07-27 33 views
0

我目前正在研究一个Roguelike,其中有多个不同的事件队列(以向量的形式),它处理多个不同的事件类别。或者说,不同的游戏对象有自己的私人事件队列。将多个向量投射到void *

在地图瓦片数据中,我有一个特殊的触发器结构,当玩家(或其他任何东西)进入瓦片时激活。该图块结构提供用于生成事件标志的数据,然后该标志需要放置到适当的事件队列中。

瓦片结构如下:

struct tile{ 
    int t_type; 
    trigger t_dgram; 

    vector<actor*> occupied; 
    vector<item*> loot; 
public: 
    void trigger_tile(int ns, int we,); 
}; 

触发结构本身可以用于确定哪个队列中合适的一个保存信息,但它是不可行的保持指针的所有可能的事件队列中的每一个瓦地图,特别是我有地图动态地生成无限地图的地形。

所以现在的问题是双重的:难道是在调用函数时投下向量空指针是一个好主意:

void tile :: trigger_tile(int ns, int we, void *queue_ob); 

tile对象本身就能够确定正确的队列矢量型并使用trigger t_dgram成员变量取消引用void指针,但这是个好主意吗?有没有我不知道的这种危险?

你个人认为我会达到类似的效果吗?

谢谢你的时间。

+1

它不可能有一个单一的事件队列,其中实际的事件可以是不同的类型? 'struct Event {}; struct ActorEvent:public Event {}; ...'。然后将所有内容存储在单个'std ::队列事件'中。但是,这可能与您计划使用它们的方式正交。 – pingul

+0

@pingul其实我已经想到了。不走这条路线的主要原因是许多事件导致实体不得不查询其他对象并等待额外处理的结果。可悲的是,拥有一个队列会导致太多的性能问题。而且,不同标志的服务通常需要由具有不同访问权限的不同对象处理,并且具有单个处理程序类最终导致灵活性问题。 :“d – Druid

回答

0

所以现在的问题是双重的:难道是在调用函数时投下向量空指针是一个好主意:

不,不健全的权利。也许你打算把一个指针指向一个void*,只要在访问矢量的元素之前使用void*强制转换的下游函数返回到矢量指针,这将是OK。

1

“触发器”听起来像一个类给我。

struct Trigger { 
    virtual void triggeredOn(tile *tile) = 0; 
} 

然后tile有一个指针指向其触发:从Trigger衍生可容纳指向任何队列,甚至做一些事情,不涉及队列

struct tile{ 
    ... 
    ... 
    Trigger *trigger; 
    void trigger_tile(int ns, int we,){trigger.triggeredOn(this)}; 
}; 

现在班。