我从文本文件中加载了一个数组,其中包含对象的位置,如下所示:
0,0,0,5
0,5,0,0
0,0,5,0
0,5,5,0
该对象如下所示:
struct object
{
int x, y, value;
}
其中x,y是坐标,值是1或0(它告诉对象是否被“拾取”),所有对象在开头都有1)。对象存储在数组object obj_array[5]
中。
要绘制它们,我使用此功能: (BOARD_Y和BOARD_Y是数组的大小,这里是4x4)
void draw_board(){
for (int iy = 0; iy < BOARD_Y; iy++) {
for (int ix = 0; ix < BOARD_X; ix++) {
if ( (board[iy][ix] == 5) )
{
glPushMatrix();
glTranslatef( ix, iy, 0 );
glutSolidCube(1);
glPopMatrix();
}
}
}
}
它完美地吸引了所有这些。但我想跳过绘制一个对象,如果它的值为0(该对象被玩家挑选)。我怎么能这样做?
答案 0 :(得分:0)
if ( (board[iy][ix] == 5) ) {
for (auto const& obj : objects) {
if (obj.x == ix && obj.y == iy) {
// obj is the object in given position
// ...
break;
}
}
}
不要这样做。
相反,要么存储对板上对象的一些引用。通过引用我的意思是(不限于!):
然后,您将能够更快,更轻松地访问驻留在给定图块上的对象。如果你想要示例,请删除评论,但我认为这两个选项都很容易实现。
如果您仍想将这些“5”保持在内部,请将板更改为结构数组。哦,请使用std::array
代替int**
。
这是示例
using id_t = unsigned;
std::map<id_t, object> objects;
constexpr std::size_t size_x = 4, size_y = 4;
std::array<id_t, size_x * size_y> board;
假设id
等于0意味着对象不在那里。
现在,您可以通过以下方式访问特定对象:
unsigned x, y;
id_t obj_id = board[x + size_x * y];
if (obj_id != 0) // is there any object?
if (objects[obj_id].value != 0) // is its value equal to 0?
// ...
并按board[...] = obj;
为每个对象生成唯一ID的简单方法就是增加计数器。
id_t last_id = 1;
objects[last_id++] = obj_id;