2014-09-09 1 views
0

그래서 Box 클래스의 객체 벡터가 있고, 각 상자를 화면의 좌표 집합에 매핑하여 특정 영역을 클릭하면 벡터에서 특정 상자에 액세스 할 수 있습니다. 저는 sfml 2.1을 사용하여 클릭 가능한 영역으로 사용될 직사각형을 만듭니다.std map을 사용하여 도형을 클래스 객체에 매핑하는 방법은 무엇입니까?

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

공간 인덱스가 필요합니다. http://en.wikipedia.org/wiki/Spatial_database – nikitoz

+0

@nikitoz @nikitoz, tic tac 발가락, rpg가 아닙니다. . 거대한 if 문 목록보다 더 효율적인 무언가를 찾고 있는데, 아마도 공간 인덱스처럼 보이지 않는 무언가가 아닙니다. – jburn7

답변

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

좋아요, 구조체에 익숙하지 않아서이 예제에서 제공 할 수있는 빠른 의사 코드가 있습니까? – jburn7

+1

'class'es를 사용하고 있습니다 만'struct's에 익숙하지 않은가요? 이 둘의 차이점은 기본 액세스입니다.'class'는 기본값으로'private'을 가지며'struct'는 기본값으로'public' 액세스를가집니다. 일반적으로 용어는 상호 교환 될 수 있습니다. –

+0

구조체에 std :: map에서 사용되는 술어에 대한 생각이 잘못된 이유는 무엇입니까? – nikitoz

0

의 예는, 당신의 게임 필드에 해당하는 매트릭스 3 × 3 (2 차원 배열)을 선언합니다. 모든 셀의 크기는 같습니다. 각 셀은 어떤 유형의 객체를 포함 할 수 있습니다. 좌표 (x, y)에 대응하는 셀 번호를 찾으려면 : i = x/cell_size; j = y/cell_size; /는 정수 나누기입니다. i - 행 번호, j- 열

+0

매트릭스로 2 차원 어레이를 의미합니까? – jburn7

+0

@ jburn7 예, 정확히 – nikitoz

+0

예이 개념에 동의합니다. 클릭하면 좌표가 표시되고 상자를 반복하여 클릭 한 좌표를 찾습니다. 좌표는 Box 객체의 속성 일뿐입니다. 분명히 검색이나 효율적인 검색을 위해 데이터 구조를 정렬하는 방식에있어 상자는 다른 문제입니다. 화면 상에있는 상자의 배열과 방법은 반드시 관련이있는 것은 아닙니다. – ervinbosenbacher

관련 문제