【问题标题】:OpenGL - drawing objects using text fileOpenGL - 使用文本文件绘制对象
【发布时间】:2013-02-24 00:45:34
【问题描述】:

我从一个包含对象位置的文本文件中加载了一个数组,它看起来像这样:

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(对象被玩家拾取)。我该怎么做?

【问题讨论】:

  • 可能值得研究一下Wavefront OBJ format。这是一种非常简单的格式,但它有很多功能,以及很多现有的加载器/解析器
  • 您的objects 存储在哪里?
  • @Bojangles 我认为标题欺骗了你——这与从文件中读取模型无关。这里的文件是一个对象板。
  • 是否可以在循环中添加另一个 if 语句?
  • @sftrabbit 我需要开始阅读,不是吗:(

标签: c++ opengl


【解决方案1】:

好的,我可以看到发生了什么;你把事情复杂了一点。除了非常愚蠢的位置比较之外,没有办法仅通过此循环访问任意对象:

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;
        }
    }
}

不要那样做。

而是存储一些对板上对象的引用。通过引用我的意思是(不限于!):

  • 唯一的对象 ID
  • 指向对象的指针

然后,您将能够更快、更轻松地访问驻留在给定图块上的对象。如果您需要示例,请发表评论,但我认为这两个选项都相当容易实现。

如果您仍想将这些“5”放在里面,请将 board 更改为结构数组。哦,使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多