首先,如果标题没有正确描述我的问题,我很抱歉,但我想不出更好的问题。 = /
我正在尝试创建一个游戏,我需要在屏幕上绘制的所有实体都是Actor类的子项。
actor类有一个名为“虚拟空白drawMe()”的虚函数,被子节点覆盖以指定它应该如何绘制。
Ergo,在游戏循环结束时,我想画出所有演员。我创建了一个“ vector allActors ”来帮助我解决这个问题,每次创建一个新演员时我都这样做:“ allActors.push_back(& newActor)”。到目前为止一切都很好(我认为)。
要在循环结束时绘制它们,我会遍历allActors中的所有元素,并为每个元素调用“ allActors [i] - > drawMe()”。
但我发现这种方法不适用于我在本地创建的演员,比如角色射击时创建的子弹(它们是在if语句中创建的)。 我认为这是因为当我在allActors向量中保存项目符号的地址时,在if语句结束后,actor本身就被销毁了,所以它是一个无地址。
示例:
if ( characterShot == true)
{
Bullet newBullet;
allActors.push_back( &newBullet );
characterShot = false;
}
我不知道如何以一种有效的方式做到这一点,因为我只能在角色射击时创造子弹演员!
请帮助我找出一种更好,更实用的方法来做我想做的事。
提前谢谢!
答案 0 :(得分:2)
动态分配对象:
allActors.push_back(new Bullet);
请注意,终身管理将是一场真正的噩梦;你应该使容器元素成为某种智能指针(理想情况为std::unique_ptr<Bullet>
或某些合适的基类)。
答案 1 :(得分:0)
您认为将地址推送到本地对象然后超出范围是正确的。这样做会导致您的应用程序非常不稳定。
使用智能指针在堆上分配对象,该指针会为您跟踪对象的生命周期:
allActors.push_back(tr1::shared_ptr<Bullet>(new Bullet));
这会给您带来另一个问题:您必须在allActors
阵列到达目标后从其中移除子弹。