如何在不是基于网格的贪吃蛇游戏(使用 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;
}
为了让它在屏幕上吃东西时没有图形碰撞,你可以用基本坐标绘制你的食物,但在扩展几个像素的情况下测试碰撞
我游戏中的蛇基本上是一个方块列表。此列表中的每个正方形都是使用 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;
}
为了让它在屏幕上吃东西时没有图形碰撞,你可以用基本坐标绘制你的食物,但在扩展几个像素的情况下测试碰撞