Как использовать стандартную карту для отображения фигур на объект класса?

Итак, у меня есть вектор объектов из моего класса 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 ответа

Вы ищете ассоциативный массив или карту. Поскольку карта будет содержать ссылки на блоки, она не может быть размещена в классе блоков.

Один из способов сделать это - создать структуру для координат и использовать указатели на поля:

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
};

Для крестика-нолика просто объявите матрицу 3x3 (массив 2d), которая будет соответствовать вашему игровому полю. Все клетки имеют одинаковый размер. Каждая ячейка может содержать объект некоторого типа. Чтобы найти номер ячейки, соответствующий координате (x, y): i = x/cell_size; j = y/cell_size; где / - целочисленное деление, i - номер строки, j - столбец

Другие вопросы по тегам