C ++ builder Как получить доступ к определенной ячейке в DrawGrid - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю над игрой в тетрис в C ++ Builder.Я хочу нарисовать свои фигуры в TDrawGrid и не могу найти ничего, что позволило бы мне получить доступ к определенной ячейке, в которую я должен рисовать.Я хочу нарисовать (например) в столбце x = 2 и строке y = 2;Я нашел только DrawGrid-> CellRect (int, int).Но это не очень хорошо, потому что я хочу отправить (разделить) столбец и строку в качестве параметров в разные функции, такие как MoveThePiece () и DrawThePiece ();

Пожалуйста, помогите:)

1 Ответ

0 голосов
/ 14 декабря 2018

TDrawGrid - это нарисованный владельцем компонент.Он не отслеживает какие-либо данные на ячейку, поэтому вы не можете найти ничего, связанного с этим (в отличие от TStringGrid, который отслеживает строки и указатели объектов для вас на ячейку в пределах его * 1003).* property).

При необходимости вам придется отслеживать ваши собственные данные о состоянии каждой ячейки в вашем собственном коде.Используя событие OnDrawCell, нарисуйте каждую ячейку в соответствии с ее текущим состоянием.Не пытайтесь рисовать что-либо на сетке вне этого события.

Например, вы можете выделить 2-мерный массив для хранения данных вашей ячейки, где каждый элемент отслеживает, является ли ячейка пустой или содержит(кусок) плитки.Затем, внутри события OnDrawCell, используйте предоставленные параметры Row и Col для индексации в массиве, чтобы получить текущее состояние ячейки, а затем нарисуйте ячейку по мере необходимости.

В качестве альтернативы, если вывместо этого сохраните список активных плиток, вы можете хранить информацию о строках / столбцах для каждой плитки.Затем внутри события OnDrawCell вы можете найти плитку, которая покрывает указанную Row / Col, и, если она найдена, нарисуйте эту (часть) плитки внутри ячейки, в противном случае нарисуйте (эту часть) фон вместо.

В любом случае, всякий раз, когда вы «перемещаете» плитку, обновляйте соответствующие элементы массива / списка по мере необходимости, а затем Invalidate() всю сетку (или, по крайней мере, InvalidateCell() затронутых ячеек) для запускаперекрас.

При этом вы могли бы рассмотреть возможность использования TPaintBox вместо TDrawGrid.Используя событие OnPaint, вы можете рисовать все, что захотите, где угодно.Ведение списка активных плиток и их текущих координат x / y, а затем просто отрисовка всех активных плиток при срабатывании OnPaint упрощает управление, не беспокоясь о гранулярности работы с отдельными ячейками.

...