我想用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;
}
}
这看起来像这样:
但是我如何从形状获得角和边?如果我将getPoint(0)用于角落,则不会绘制其所属的点。 如果这不是一个好主意,那么该怎么办?
答案 0 :(得分:7)
我很久以前就做了这种机制,这是实现该目标的一种简单方法。
我的方法是将每个六角形表示为一个圆。绘制的六边形嵌入到该圆中。要检查鼠标是在角落还是在侧面,我做了一个简单的检查:
如果该点同时在3个圆内,则为一个角(这3个圆的交汇角)
如果该点在2个圆以内,则为侧面。
如果点在1个圆以内,则为整个六角形
概念证明:
蓝色六边形与适当的木板相符,每个六角形都有一个红色的圆圈(比圆圈大一点)。
绿色六边形不在板中(它们不是游戏板的一部分),它们有助于了解鼠标是否在外部六边形的侧面或角上。
完整代码位于my Github repository中,但代码很旧,可能已过期