我正在C ++ Builder中进行俄罗斯方块游戏。我想在TDrawGrid上绘制我的作品,但找不到任何可以访问应该在其中绘制的特定单元格的东西。我的意思是,我想在(例如)列x = 2和行y = 2中绘制; 我只找到DrawGrid-> CellRect(int,int)。但这不好,因为我想将列和行作为参数发送(分隔)在不同的函数中,例如MoveThePiece()和DrawThePiece();
请帮助:)
答案 0 :(得分:2)
TDrawGrid
是所有者绘制的组件。它不会跟踪任何每个单元格的数据,这就是为什么您找不到与之相关的任何信息的原因(不同于TStringGrid
,它会在其每个单元格的基础上为您跟踪字符串和对象指针Cells
属性)。
您将必须根据需要在自己的代码中跟踪自己的每单元状态数据。使用OnDrawCell
事件,根据其当前状态绘制每个单元格。不要尝试从该事件之外将任何东西绘制到网格上。
例如,您可以分配一个二维数组来保存单元格数据,其中每个元素跟踪一个单元格是否为空还是保存(一个)图块。然后,在OnDrawCell
事件内部,使用提供的Row
和Col
参数索引数组以获取单元格的当前状态,然后根据需要绘制该单元格。
或者,如果您保留活动图块的列表,则可以存储每个图块的行/列信息。然后在OnDrawCell
事件内部,您可以找到覆盖指定Row
/ Col
的图块,如果找到,则在该单元格中绘制该图块(的一部分),否则绘制(部分)作为背景。
无论哪种方式,每当您“移动”图块时,都需要根据需要更新适当的数组/列表元素,然后Invalidate()
整个网格(或至少InvalidateCell()
受影响的单元格)来触发重涂。
话虽如此,您可以考虑使用TPaintBox
而不是TDrawGrid
。使用其OnPaint
事件,您可以随时随地绘制任何内容。保留活动图块及其当前x / y坐标的列表,然后在触发OnPaint
时简单地绘制所有活动图块,使事情变得更易于管理,而不必担心处理单个对象的粒度细胞。