Таким образом, у меня есть вектор объектов из моего класса 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 даже правильным способом связать область на экране с объектом?
Вы ищете ассоциативный массив или карту. Так как карта будет содержать ссылки на поля, она не может быть помещена в класс ящиков.
Один из способов сделать это - создать структуру координат и использовать указатели для полей:
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
};
class
es, но вы не знакомы со struct
s? Разница между ними заключается в доступе по умолчанию: class
имеет private
доступ по умолчанию, struct
имеет public
доступ по умолчанию. Обычно условия можно поменять местами.
Для tic tac toe просто объявите матрицу 3x3 (2d-массив), которая будет соответствовать вашему игровому полю. Все ячейки имеют одинаковый размер. Каждая ячейка может содержать объект некоторого типа. Найти номер ячейки, соответствующий координате (x, y): i = x/cell_size; j = y/cell_size
i = x/cell_size; j = y/cell_size
; где / - целочисленное деление, я - число строк, j - столбцов