C++ SFML:如何成功地迭代渲染形状?
C++ SFML: How to successfully Iteratively render shapes?
我想迭代地创建一组不同颜色的矩形,并将它们显示在屏幕上的不同位置。这应该会产生一个由矩形组成的迷宫。
形状的位置应反映存储 9x9 迷宫的阵列。
我能够成功地创建一个单一的形状,改变它的颜色和位置。但是,当我尝试对数组内的形状执行相同操作时,它不起作用。屏幕右上角只生成一个蓝色矩形。
int main() {
sf::RenderWindow window(sf::VideoMode(1920, 1080), "Baphomet");
sf::RectangleShape tiles[81] = {sf::RectangleShape(sf::Vector2f(20, 20))};
char maze[81] = {0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 1, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 1, 1, 0, 1, 0, 1, 0,
0, 0, 0, 1, 0, 1, 0, 1, 0,
0, 1, 1, 1, 0, 1, 1, 1, 0,
0, 0, 1, 0, 0, 0, 1, 0, 0,
0, 0, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0};
int x;
int y;
for (int i = 0; i < 81; i++) {
if (maze[i] == 0) {
tiles[i].setFillColor(sf::Color::Blue);
} else if (maze[i] == 1) {
tiles[i].setFillColor(sf::Color::Red);
}
x = (i % 9) * 20;
y = (i / 9) * 20;
std::cout << x << " " << y << std::endl;
tiles[i].setPosition((float)x, (float)y);
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
for (int i = 0; i < 81; i++) {
window.draw(tiles[i]);
}
window.display();
}
return 0;
}
如何让形状成功地改变它们对 x 和 y 变量的位置?
我认为主要问题是定义
sf::RectangleShape tiles[81] = {sf::RectangleShape(sf::Vector2f(20, 20))};
此处您仅显式初始化 first 元素 (tiles[0]
)。其余所有元素将只有默认构造的形状对象。
要将所有元素正确初始化为相同的值,请使用循环
for (auto& shape : tiles)
shape = sf::RectangleShape(sf::Vector2f(20, 20));
或者使用向量
std::vector<sf::RectangleShape> tiles(81, sf::RectangleShape(sf::Vector2f(20, 20)));
我想迭代地创建一组不同颜色的矩形,并将它们显示在屏幕上的不同位置。这应该会产生一个由矩形组成的迷宫。
形状的位置应反映存储 9x9 迷宫的阵列。
我能够成功地创建一个单一的形状,改变它的颜色和位置。但是,当我尝试对数组内的形状执行相同操作时,它不起作用。屏幕右上角只生成一个蓝色矩形。
int main() {
sf::RenderWindow window(sf::VideoMode(1920, 1080), "Baphomet");
sf::RectangleShape tiles[81] = {sf::RectangleShape(sf::Vector2f(20, 20))};
char maze[81] = {0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 1, 1, 0,
0, 1, 0, 1, 0, 1, 0, 1, 0,
0, 1, 1, 1, 0, 1, 0, 1, 0,
0, 0, 0, 1, 0, 1, 0, 1, 0,
0, 1, 1, 1, 0, 1, 1, 1, 0,
0, 0, 1, 0, 0, 0, 1, 0, 0,
0, 0, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0};
int x;
int y;
for (int i = 0; i < 81; i++) {
if (maze[i] == 0) {
tiles[i].setFillColor(sf::Color::Blue);
} else if (maze[i] == 1) {
tiles[i].setFillColor(sf::Color::Red);
}
x = (i % 9) * 20;
y = (i / 9) * 20;
std::cout << x << " " << y << std::endl;
tiles[i].setPosition((float)x, (float)y);
}
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
for (int i = 0; i < 81; i++) {
window.draw(tiles[i]);
}
window.display();
}
return 0;
}
如何让形状成功地改变它们对 x 和 y 变量的位置?
我认为主要问题是定义
sf::RectangleShape tiles[81] = {sf::RectangleShape(sf::Vector2f(20, 20))};
此处您仅显式初始化 first 元素 (tiles[0]
)。其余所有元素将只有默认构造的形状对象。
要将所有元素正确初始化为相同的值,请使用循环
for (auto& shape : tiles)
shape = sf::RectangleShape(sf::Vector2f(20, 20));
或者使用向量
std::vector<sf::RectangleShape> tiles(81, sf::RectangleShape(sf::Vector2f(20, 20)));