使用SFML为卡坦创建董事会

时间:2018-11-30 07:25:50

标签: c++ sfml

我想用SFML创建Catan游戏的棋盘,我需要的是每个形状都有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 :(得分:7)

我很久以前就做了这种机制,这是实现该目标的一种简单方法。

我的方法是将每个六角形表示为一个圆。绘制的六边形嵌入到该圆中。要检查鼠标是在角落还是在侧面,我做了一个简单的检查:

  • 如果该点同时在3个圆内,则为一个角(这3个圆的交汇角)

  • 如果该点在2个圆以内,则为侧面。

  • 如果点在1个圆以内,则为整个六角形

概念证明:

enter image description here

蓝色六边形与适当的木板相符,每个六角形都有一个红色的圆圈(比圆圈大一点)。

绿色六边形不在板中(它们不是游戏板的一部分),它们有助于了解鼠标是否在外部六边形的侧面或角上。

完整代码位于my Github repository中,但代码很旧,可能已过期