Создать доску для катана с SFML - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу создать доску для игры Catan с SFML, и все, что мне нужно, это 19 фигур (шестиугольников), для каждого из которых я могу взять все 6 углов и 6 сторон, чтобы построить города или дороги.Для фигур я делаю это:

std::vector<sf::CircleShape> shape(19);
int n = 0;
int shape_y = 100;
for (size_t index = 0; index < shape.size(); index++) {
    if (index < 3) {
        sf::CircleShape sh(80, 6);
        sh.setPosition(200 + n, shape_y);
        sh.setFillColor(sf::Color::Magenta);
        shape[index] = sh;
        n += 140;
    }
    if (index == 3)
        n = 0;
    if (index < 7 && index >= 3) {
        sf::CircleShape sh(80, 6);
        sh.setPosition(130 + n, shape_y + 120);
        sh.setFillColor(sf::Color::Blue);
        shape[index] = sh;
        n += 140;
    }
    if (index == 7)
        n = 0;
    if (index >= 7 && index < 12) {
        sf::CircleShape sh(80, 6);
        sh.setPosition(60 + n, shape_y + 240);
        sh.setFillColor(sf::Color::Red);
        shape[index] = sh;
        n += 140;
    }
    if (index == 12)
        n = 0;
    if (index >= 12 && index < 16) {
        sf::CircleShape sh(80, 6);
        sh.setPosition(130 + n, shape_y + 360);
        sh.setFillColor(sf::Color::Green);
        shape[index] = sh;
        n += 140;
    }
    if (index == 16)
        n = 0;
    if (index >= 16 && index < 19) {
        sf::CircleShape sh(80, 6);
        sh.setPosition(200 + n, shape_y + 480);
        sh.setFillColor(sf::Color::Yellow);
        shape[index] = sh;
        n += 140;
    }
}

Это выглядит так:

enter image description here

Но как мне получить углы и стороны от фигур?Если я использую getPoint (0) для угла, он не рисует точку, где он принадлежит.Если это не очень хорошая идея, что я могу использовать для этой проблемы?

1 Ответ

0 голосов
/ 30 ноября 2018

Я сделал этот механизм давным-давно, простой способ достичь этого.

Мой подход состоял в том, чтобы представлял каждый шестиугольник в виде круга .Нарисованный шестиугольник был встроен в этот круг.Чтобы проверить, была ли мышь над углом или стороной, я сделал простую проверку:

  • Если точка находилась внутри 3 окружностей одновременно, это был угол (угол встречи тех3 круга)

  • Если точка находилась внутри 2 окружностей, это была сторона.

  • Если точка находилась внутри 1 круга, она былацелый шестиугольник

Подтверждение концепции:

enter image description here

Синие шестиугольники соответствуют каждой доске, каждая изу них есть красный круг (немного больше, чем круг).

Зеленые шестиугольники находятся вне поля (они не являются частью игрового поля), и они помогают узнать, находится ли мышь над сторонами или угламииз внешних шестигранников.

Полный код находится в моем хранилище Github , но довольно стар и может быть устаревшим

...