我目前正在考虑如何为一种游戏板制作二维 vector 数组。
棋盘应该是 vector ,因为大小可以变化,每个“正方形”应该包含关于该正方形中有哪些对象的信息。
问题是对象可能重叠,对象可能不是同一类型或类。
这是我目前正在考虑的:(伪代码)
struct Square {
vector<enum type>;
vector<pointers to objects>;
};
vector< vector <Square> >;
指针将指向不同的 vector 数组,每个 vector 数组包含特定的对象。
我不确定如何实现这样的功能,或者这是否可能,我认真地认为这可能比它需要的更复杂......
有些对象必须是类,但我可以使游戏板类中的所有对象类型都继承自一个主类。但最终对象完全不同,所以我不确定这是否有意义的差异。
我是不是瞎了眼,错过了一种更简单的方法来做我想做的事情:二维数组包含不同类型的元素,这些元素也可以在数组中重叠?
我非常感谢任何帮助、摘要或见解。
注意事项: 创建后板的大小不会改变。 物体必须能够在棋盘上四处移动。
最佳答案
这是我的建议。
#include <boost/shared_ptr.hpp>
class GameObject {
public:
virtual ~GameObject() {}
enum Type {
FOO,
BAR
};
virtual Type type() const = 0;
virtual std::string name() const = 0;
virtual void damaged() {}
};
class FooObject : public GameObject {
public:
Type type() const { return FOO; }
std::string name() const { return "Foo object"; }
void damaged() {
std::cout << "Foo was damaged!" << std::endl;
}
};
class BarObject : public GameObject {
public:
Type type() const { return BAR; }
std::string name() const { return "Bar object"; }
// Bar object doesn't respond to damage: no need to override damaged()
};
class Square {
std::vector<boost::shared_ptr<GameObject> > objects;
};
class Board {
// Details of the implementation here not important, but there
// should be a class to hide them.
Square* squares;
int width, height;
Board(int width, int height) :
squares ( new Square[ width * height ] ),
width ( width ),
height ( height )
{
}
~Board() {
delete [] squares;
}
Square& square(int x, int y) {
if( x < 0 || x >= width || y < 0 || y >= height ) {
throw std::logic_error( "accessed square out of bounds" );
}
return squares[ x + width * y ];
}
};
总结:
- 为可以放置在游戏板上的各种对象建立一个基类。
- 这种类型的类必须有一个虚拟析构函数,即使它是微不足道的。这是因为您将通过 GameObject 指针删除内容。
- 如果需要区分游戏对象,请使用返回“type”值的虚方法。
- 只要没有需要使用它,就不要使用该类型值,而是使用其他做有意义事情的虚拟方法。使用类型值(然后通常转换为子类型)应该被视为最后的手段。例如(自由发明关于你的游戏的细节):
- 每个对象都有一个名称,当您将光标放在它上面时会显示该名称。这在 name() 中返回。
- 游戏中的事件可能会“损坏”一个对象。这仅适用于某些类型的对象,因此 damaged() 的默认操作是什么都不做。对损坏做出响应的 Foo 对象用实际操作覆盖它。
- 无论您如何实现该板,请将您的确切实现隐藏在一个类中。 (不要把我的代码当作你不应该为此使用 vector<> 的指示,这绝对没问题。我个人稍微偏向于 vector< vector<>> 这里,但这也不是太糟糕。)
- 为游戏对象使用共享指针。
- Boost 具有出色且广泛使用的实现。
- 如果您不能使用共享指针,请在 Square 类之外控制游戏对象的生命周期(例如,在 Board 类中所有游戏对象的主列表中),然后在 Square 类中使用原始指针。
- 如果您确实使用了共享指针,而且这是您第一次使用,请先简要阅读一下。它们不是魔术,您需要注意某些事情,例如循环引用。
- 根据您的需要,您可能希望在 GameObject 中有一个到正方形或正方形坐标的“反向链接”,其中包含指向该 GameObject 的指针。这将使您能够轻松地从板上移除对象并四处移动它们。
关于c++ - 二维 vector ,重叠和数组中不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15593131/