如何在不是基于网格的贪吃蛇游戏(使用 C++ 和 OpenGL)中实现食物生成器?

How do I implement a food generator in a snake game (using c++ and OpenGL) that is not grid-based?

我游戏中的蛇基本上是一个方块列表。此列表中的每个正方形都是使用 GL_QUADS 定义的,这需要定义两个顶点(x,y 和 x1,y1),如下所示:

void Square::draw() const
{
glBegin(GL_QUADS);

    glVertex2f(x, y);
    glVertex2f(x1, y);
    glVertex2f(x1, y1);
    glVertex2f(x, y1);

    glEnd();
}

蛇通过在列表的前面插入一个新元素并删除最后一个元素来移动。因此,如果蛇最初向左移动,并收到向上移动的命令,则会在蛇的(前一个)头部上方创建一个正方形,列表中的最后一个正方形将被删除。

为了生成食物,我有以下代码:

void generate_food()
{
    time_t seconds
    time(&seconds);
    srand((unsigned int)seconds);

        x = (rand() % (max_width - min_width + 1)) + min_width;
        y = (rand() % (max_height - min_height + 1)) + min_height;
        x1 = foodx + 10;
        y1 = foody + 10;

    food = new Square{x,y,x1,y1 };
}

(注意:宽度和高度是运动场的尺寸。)

我还实现了一个养蛇的功能:如果蛇头的坐标和食物的坐标相匹配。但是,当我 运行 程序时,蛇的头永远不会与食物块完全位于同一坐标上……这里和那里有几个像素的偏差。有什么方法可以解决这个问题,不需要我用基于网格的实现重新编写所有代码吗?

据我了解你的解释当蛇移动时你比较两个方块:新头和食物的方块。所以要让它正常工作,你应该检测正方形的碰撞而不是完全相等。

bool rectHitTest(const Square head, const Square food){
    if ((head.x2 < food.x1 || head.y2 < food.y1) || 
        (head.x1 > food.x2 || head.y1 > food.y2))
        return false;
    return true;
}

为了让它在屏幕上吃东西时没有图形碰撞,你可以用基本坐标绘制你的食物,但在扩展几个像素的情况下测试碰撞