2016-12-26 4 views
0

Я новичок в SFML и C++ в целом. Я строю игру жизни Конвей для школьного проекта.SFML - Невозможно изменить объект в окне

В качестве базовых объектов для моей сетки у меня есть квадраты (которые являются sf::RectangleShape как для основания). Сетка представляет собой std::vector<std::vector<Square>> (вектор векторов квадратов).

То, что я пытаюсь сделать в данный момент, это изменить цвет квадрата, когда я наводил на него курсор. Мой способ сделать это (см код ниже):

  1. я получить позицию курсора при перемещении его
  2. я перебирать мою матрицу и проверить для каждого квадрата, если позиция курсора находится в границах на площади в.
  3. Когда квадрат под курсором найден, я хочу изменить его цвет (.setFillColor(...)).

Пункт 3 не работает Я не могу понять, почему. Это функция «mouseHover» в приведенном ниже коде. Вы видите, что не так?

int main() 
{ 
    int width; 
    int height; 
    int numberSquareWidth = 15; 
    int numberSquareHeight = 15; 
    int squareSize = 20; 
    int offset = 1; 
    initializeWindowGridValues(width, height, numberSquareWidth, numberSquareHeight, squareSize, offset); 

    sf::RenderWindow window(sf::VideoMode(width, height), "Stephan's Game Of Life!"); 
    std::vector<std::vector<Square>> matrix(numberSquareWidth, std::vector<Square>(numberSquareHeight)); 
    initiatlizeGrid(numberSquareWidth, numberSquareHeight, squareSize, offset, matrix); 

    sf::Vector2i cursorPos; 
    while (window.isOpen()) 
    { 
     sf::Event event; 
     while (window.pollEvent(event)) 
     { 
      if (event.type == sf::Event::Closed) 
       window.close(); 

      if (event.type == sf::Event::MouseMoved) 
      { 
       cursorPos = sf::Mouse::getPosition(window); 
      } 
     } 
     mouseHover(matrix, cursorPos, squareSize, offset); // Problem here 

     window.clear(sf::Color::Black); 
     drawGrid(window, matrix); 
     window.display(); 
    } 
    return 0; 
} 

void mouseHover(std::vector<std::vector<Square>> &matrix, const sf::Vector2i &cursorPos, const int &squareSize, const int &offset) 
{ 
    int rowIndex = floor((cursorPos.x - (offset * floor(cursorPos.x/squareSize)))/squareSize); 
    int colIndex = floor((cursorPos.y - (offset * floor(cursorPos.y/squareSize)))/squareSize); 
    matrix[rowIndex][colIndex].setFillColor(sf::Color::Blue); // This does not happen. 
} 

void drawGrid(sf::RenderWindow &window, const std::vector<std::vector<Square>> &matrix) 
{ 
    for (const auto &vector : matrix) 
    { 
     for (const auto &square : vector) 
     { 
      window.draw(square); 
     } 
    } 
} 

void initiatlizeGrid(const int &numberSquareWidth, const int &numberSquareHeight, const int &squareSize, const int &offset, std::vector<std::vector<Square>> &matrix) 
{ 
    int previousY = 0; 
    for (size_t row = 0; row < numberSquareWidth; row++) 
    { 
     int offsetv; 
     if (row == 0) 
     { 
      offsetv = 0; 
     } 
     else 
     { 
      offsetv = offset; 
     } 
     int previousX = 0; 
     for (size_t col = 0; col < numberSquareHeight; col++) 
     { 
      int offseth; 
      if (col == 0) 
      { 
       offseth = 0; 
      } 
      else 
      { 
       offseth = offset; 
      } 
      Square square(squareSize); 
      square.setPosition(previousX + offseth, previousY + offsetv); 
      matrix[row][col] = square; 
      previousX = previousX + squareSize + offseth; 
     } 
     previousY = previousY + squareSize + offsetv; 
    } 
} 

void initializeWindowGridValues(int &width, int &height, int &nuberSquareWidth, int &nuberSquareHeight, int &squareSize, const int &offset) 
{ 
    if (nuberSquareWidth * squareSize + offset * (nuberSquareWidth - 1) > 1800 || nuberSquareHeight * squareSize + offset * (nuberSquareHeight - 1) > 900) 
    { 
     nuberSquareWidth = floor(1600/squareSize); 
     nuberSquareHeight = floor(900/squareSize); 
     width = ceil(nuberSquareWidth * squareSize + offset * (nuberSquareWidth - 1)); 
     height = ceil(nuberSquareHeight * squareSize + offset * (nuberSquareHeight - 1)); 
    } 
    else if (nuberSquareWidth < 5 || nuberSquareHeight < 5) 
    { 
     nuberSquareWidth = 5; 
     nuberSquareHeight = 5; 
     width = ceil(nuberSquareWidth * squareSize + offset * (nuberSquareWidth - 1)); 
     height = ceil(nuberSquareHeight * squareSize + offset * (nuberSquareHeight - 1)); 
    } 
    else 
    { 
     width = ceil(nuberSquareWidth * squareSize + offset * (nuberSquareWidth - 1)); 
     height = ceil(nuberSquareHeight * squareSize + offset * (nuberSquareHeight - 1)); 
    } 
} 
+0

логика столкновения работает на меня, вы можете показать initializegrid() и initializeWindowGridValues ​​() –

+0

@LorenceHernandez Я добавил весь свой main(). Обратите внимание, что я изменяю реализацию 'mouseover()': я вычисляю индексы квадрата в матрице вместо итерации по векторам. 'initializeWindowGridValues ​​()' гарантирует, что окно будет достаточно большим, чтобы отображать всю сетку и устанавливает для него максимальный и минимальный размер в случае экстремальных значений. 'initializegrid()' заполняет мой вектор векторов квадратов квадратами с соответствующими значениями позиции. –

ответ

0

Проблема заключалась в том, что я и унаследовал RectangleShape (мой квадрат является RectangleShape) и сделал RectangleShape (квадрат) член MyClass. Когда я изменяю данные, я изменяю переменные-члены класса, но внутри метода draw рисую другой прямоугольник.

Я удалил члена класса RectangleShape и продолжил отсюда.