C++ 如何使用std映射将形状映射到类对象?

C++ 如何使用std映射将形状映射到类对象?,c++,map,sfml,C++,Map,Sfml,所以我有一个来自Box类的对象向量,我想把每个框映射到屏幕上的一组坐标,这样当你点击某个区域时,一个特定的框将从向量中访问。我正在使用SFML2.1创建矩形,用作可单击区域。以下是我到目前为止的情况: Board.h(一种容纳盒子的游戏板): #pragma一次 #包括“stdafx.h” #包括 #包括 #包括“Box.h” #包括“SFML/Graphics.hpp” #包括“ImageManager.h” 班级委员会{ 公众: 董事会(影像经理和im); ~Board(); void Fi

所以我有一个来自Box类的对象向量,我想把每个框映射到屏幕上的一组坐标,这样当你点击某个区域时,一个特定的框将从向量中访问。我正在使用SFML2.1创建矩形,用作可单击区域。以下是我到目前为止的情况:

Board.h(一种容纳盒子的游戏板):

#pragma一次
#包括“stdafx.h”
#包括
#包括
#包括“Box.h”
#包括“SFML/Graphics.hpp”
#包括“ImageManager.h”
班级委员会{
公众:
董事会(影像经理和im);
~Board();
void FillVectors();
void FillMap();
std::vector&getbox();
sf::Sprite GetGameBoard();
私人:
精灵游戏板;
ImageManager&imgr;
向量矩形;
std::向量盒;
std::map-boxMap;
};
在Board.cpp中:

void Board::FillVectors(){
for(int i = 0; i < 9; i++){
    sf::RectangleShape rectangle(sf::Vector2f(80,80));
    Box box;

    rectangles.push_back(rectangle);
    boxes.push_back(box);
}
for(int i = 1; i < boxes.size() + 1; i++){
    std::cout << boxes[i].GetName();
    rectangles[i].setPosition((i * 20) + 10, (i * 20) + 10);
}
void Board::FillVectors(){
对于(int i=0;i<9;i++){
矩形(sf::Vector2f(80,80));
盒子;
矩形。向后推(矩形);
盒子。推回(盒子);
}
对于(int i=1;istd::cout您正在查找关联数组或映射。由于映射将包含指向方框的链接,因此无法将其放置在方框类中

一种方法是为坐标创建一个结构,并使用指向方框的指针:

struct Coordinate; // Forward declaration, you provide the details.  
typedef std::map<Coordinate, Box *> Box_Container;  

对于tic tac toe,只需声明一个矩阵3x3(2d数组),它将对应于您的游戏场。所有单元格大小相同。每个单元格可能包含某种类型的对象。要查找与坐标(x,y)对应的单元格编号:
i=x/cell\u size;j=y/cell\u size
;其中/是一个整数除法,i-行数,j-列

你需要一个空间索引@nikitoz,它只是一个tic-tac-toe,而不是一个rpg。我在寻找一个比if语句的庞大列表更有效的东西,但可能不像空间索引那么复杂的东西。矩阵是指2d数组?是的,我同意这个概念。单击时获得坐标,然后遍历框以查找已单击的坐标。坐标只是框对象的一个属性。显然,对于搜索或在数据结构中高效搜索框的排列方式是另一回事屏幕上的方框和集合中的方式不一定相关。@xebo我们谈论的是tic-tac-toe游戏,我不确定“方框排列”是什么意思。我认为这个案例的有效数据结构只是一个特殊的网格。好吧,它没有通过,这是一个简单的tic-tac-toe。那么是的,一个简单的公式就可以了。(可能我想得太多了,或者想找到一个通用的解决方案。)框排列,我想到了屏幕上随机排列的框。好吧,我不熟悉structs,那么你能为这个例子提供一个快速的伪代码吗?你使用的是
class
es,但你不熟悉
struct
s?两者之间的区别是默认访问:
class
has
private
作为默认值,
struct
具有
public
访问权限作为默认值。通常,这些术语可以互换。如果您考虑一下std::map中为您的结构使用的谓词,您就会明白为什么这是一个错误的想法。我介绍的普通结构不能按原样使用
std::map
,因为该结构需要
运算符==
操作符在注释中,我意识到向量会更简单,但我想让框可以点击。本质上,我试图将
sf::RectangleShape
映射到
box
。因此我需要将sf名称空间合并到框中,但我不确定如何实际将sf对象链接(或映射)到常规对象。
void Board::FillMap(){
    for(std::map<sf::Vector2f, std::vector<Box>>::const_iterator it = boxMap.begin(); it != boxMap.end(); ++it){
        for(int i = 0; i < boxes.size(); i++){
            boxMap[rectangles[i].getOrigin()];
        }
    }
}
struct Coordinate; // Forward declaration, you provide the details.  
typedef std::map<Coordinate, Box *> Box_Container;  
struct Coordinate
{
  int x; // or horizontal
  int y; // or vertical
};