如何使用std贴图将形状映射到类对象?

时间:2014-09-09 15:14:20

标签: c++ map sfml

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

Board.h(一个装有盒子的游戏板):

#pragma once
#include "stdafx.h"
#include <vector>
#include <map>
#include "Box.h"
#include "SFML/Graphics.hpp"
#include "ImageManager.h"

class Board{
public:
    Board(ImageManager &im);
    ~Board();

    void FillVectors();
    void FillMap();

    std::vector<Box> &GetBoxes();

    sf::Sprite GetGameBoard();
private:
    sf::Sprite gameBoard;

    ImageManager &imgr;

    std::vector<sf::RectangleShape> rectangles;
    std::vector<Box> boxes;

    std::map<sf::Vector2f, std::vector<Box>> 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::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()];
        }
    }
}

没有任何错误,但我真的迷失了从这里做什么。 std :: map甚至是将屏幕上的区域链接到对象的正确方法吗?

2 个答案:

答案 0 :(得分:0)

您正在寻找关联数组或地图。由于地图将包含指向框的链接,因此无法将其放置在框类中。

执行此操作的一种方法是为坐标创建结构并使用指向框的指针:

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

这是制作指向记录的索引表的常用技术。

注意:更简单的设计使用方框编号作为std::vector的索引。

编辑1:结构示例

struct Coordinate
{
  int x; // or horizontal
  int y; // or vertical
};

答案 1 :(得分:0)

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