![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поле игры [Delphi, Windows]
Анатолий © (2003-10-01 03:39:00)Вообщем вопрос такой: как нарисовать поле игры типа как в морском бое или сапере чтобы потом к каждой клетке(ячейке) можно было обращаться и делать с ней все что угодно...
Попробовал нарисовать на имадже,получилось неудобно
procedure TForm1.FormCreate(Sender: TObject);
var i,j:byte;
begin
KLETKA:=TBitMap.Create;
KLETKA.LoadFromResourceName(HInstance,'KLETKA');
for i:=0 to 9 do
for j:=0 to 9 do
Form1.Image1.Canvas.Draw(i*16,j*16,KLETKA);
End;
Подскажите плз как по другому сообразить?
Думкин (2003-10-02 05:56:00) [1]Мои клетки вообще графическими ресурсами не владеют, все это на откуп дальнейшему хозяину. Их задача только предоставить нужную информацию, как и есть в TStringGrid, но ничто не мешает реализовать свое. Тем более игру делаешь - что дальше понадобится, покрыто мраком.
Rem (2003-10-01 19:35:00) [2]Лучше всего прочитать еще раз:
MBo © (01.10.03 07:28) [2]
Mihey (2003-10-01 18:38:00) [3]> Создаешь новый класс на базе tPicture, которому присваиваешь дополнительные свойства
А вот это растрата ресурсов. Слишком уж сложен и ёмок этот класс для клекти, кораблика или чего-то ещё. Раз уж взникла сложность, то проще воспользоваться спрайтовым движком. Так в Graphic32 есть слои, принадлежащие изображению, который могут, например, реагировать на нажатия мышью.
Temp (2003-10-01 16:01:00) [4]Вот тебе мой пример. Квадрат 16х16, нажатие на клетку обрабатываешь через Tag.
Const
OColor: array [1..10] of TColor=(clRed,clBlue,clWhite,clYellow,clGreen,clPurple,clAqua,cl3dLight,clGrayText,clOlive);
var
Form1: TForm1;
Field: array [1..16, 1..16] of TPanel;
procedure TForm1.FormShow(Sender: TObject);
var t,i,j,FT,FL:integer;
begin
Score:=0;
Randomize;
FT:=25; FL:=15;
For i:=1 to 16 do
Begin
For j:=1 to 16 do
begin
Field[i,j]:=TPanel.Create(Form1);
Field[i,j].Parent:=Form1;
Field[i,j].Visible:=True;
Field[i,j].Top:=FT;
Field[i,j].Left:=FL;
Field[i,j].Color:=clBlack;
Field[i,j].Width:=25;
Field[i,j].Height:=25;
FL:=FL+25;
end;
FT:=FT+25;
FL:=15;
end;
Darthman (2003-10-01 14:38:00) [5]А чем свой класс с двумерным массивом не катит?
nexxiss (2003-10-01 13:18:00) [6]Вложенным циклом создаешь клетки и каждой в поле Tag присваиваешь порядковый номер и обработчик события OnClick:=MyClick, в котором по полю Tag выясняешь номер нажатой клетки. Вот пожалуй и все.
<Falcon> (2003-10-01 12:08:00) [7]Попробуй KOLmdvXLGrid.Там есть пльзовательская отрисовка ячеек, возможность встраивать обьекты в ячейки. Опять-таки с координатами проблем нет.
Николай (2003-10-01 09:31:00) [8]Я дедал проще. Например, поле будет состоять из картинок (с рамкой или без). Создаешь новый класс на базе tPicture, которому присваиваешь дополнительные свойства (типа "координата Х", "координата У", "номер корабля", "корабль или пусто" и т.д.). Т.е. у тебя получается массив элементов, которым ты можешь задать свойства при отрисовке (не создаёшь заранее), которым ты можешь присвоить любое имя, и т.п.
И в дальнейшем рисуешь поле из динамически создаваемых элементов.
Получается массив, с которым ты потом и работаешь.
MBo (2003-10-01 07:28:00) [9]Судя по приведенному коду, вполне подойдет TStringGrid (или TDrawGrid)
Думкин (2003-10-01 06:19:00) [10]Механизм может быть разным.
Создаешь массив(список...) клеток.
Клетка - некая структура, содержащая всю нужную информацию, например содержащая координаты прямоугольника в поле и т.д. К ней нужные свойства и методы.
Массив клеток в тип поле. Там тоже свойства и методы.
При прорисовке поля - в цикле вызываешь прорисовки клеток. Потом с нарисованным полем делаешь, то что тебе надо.
Если клеток много, то лучше всего, если все внешние события будут обрабатываться полем, а потом уже идти к нужным клеткам. Ну и т.д.