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

0

Таким образом, у меня есть вектор объектов из моего класса 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 даже правильным способом связать область на экране с объектом?

  • 0
    Вам нужен пространственный индекс en.wikipedia.org/wiki/Spatial_database
  • 0
    @nikitoz, это просто крестики-нолики, а не ролевые игры. Я ищу что-то более эффективное, чем гигантский список операторов if, но, возможно, не такой сложный, как пространственный индекс.
Теги:
sfml
map

2 ответа

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
};
  • 0
    Хорошо, я не знаком со структурами, так какой быстрый псевдокод вы можете предоставить для этого примера?
  • 1
    Вы используете class es, но вы не знакомы со struct s? Разница между ними заключается в доступе по умолчанию: class имеет private доступ по умолчанию, struct имеет public доступ по умолчанию. Обычно условия можно поменять местами.
Показать ещё 4 комментария
0

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

  • 0
    Под матрицей вы подразумеваете 2d массив?
  • 0
    @ jburn7 да, именно так
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню