Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2010, 17:14   #1
kaseg
 
Регистрация: 06.06.2010
Сообщений: 5
По умолчанию Работа с картинками

Прошу помочь найти оптимальный вариант решения след. задачи:
нужно разместить мебель в комнате. Будет достаточно сделать хотябы схематично блоками (типа как в тетрисе).

Какой-нибудь компонент для отображения свободного пространства комнаты и далее компоненты (диваны, кресла, в виде клеточек хотяб (ну диван 3 клетки дапустим линия, крекло 1 клетка)) на первом компоненте.
Как подойти к этой задаче даже не знаю ещё.
Идеи с размерами и т.п. я сам реализую, главное как сделать чтоб расстановка блоков этих происходила?
kaseg вне форума Ответить с цитированием
Старый 06.06.2010, 18:05   #2
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Используй Canvas для вывода графики.
Вадим Буренков вне форума Ответить с цитированием
Старый 06.06.2010, 18:41   #3
kaseg
 
Регистрация: 06.06.2010
Сообщений: 5
По умолчанию

Цитата:
Используй Canvas для вывода графики.
окей, сама комната будет канвас, а мебель?
kaseg вне форума Ответить с цитированием
Старый 06.06.2010, 18:56   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

канвас отображает все, так что надо вам рисовать то что надо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.06.2010, 20:47   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
а мебель?
А мебель графическими примитивами.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.06.2010, 20:57   #6
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Попробуйте сделать следующее:

Код:
const
  {ширина и высота клетки}
  W = 30;
  H = 30;

var
  Field: array[0..9, 0..9] of integer; // комната

procedure ShowField_(Canvas: TCanvas);

  procedure Ht(Row, Col: Integer); // рисуем клетку
  begin
     if Field[col, row] = 0 then
     begin // рисуем пол
        Canvas.brush.color := clMaroon;
        Canvas.Rechtangle(Col*W, Row*H, W, H);
     end
     else
     begin // рисуем мебель
        Canvas.brush.color := clBlue;
        Canvas.Rechtangle(Col*W, Row*H, W, H);
     end;
  end;

var
  row,col :  integer;

begin
    for row :=0 to 9 do
       for col :=0 to 9 do
          Ht(Row, Col);
end;

procedure TForm1.Form1Create(Sender: TObject);
var
  row,col :  integer;
begin
    for row :=0 to 9 do
       for col :=0 to 9 do
          Field[col,row]  := 0;
    
end;

procedure TForm1.Form1Show(Sender: TObject);
begin
  ShowField_(Canvas); 
end;

procedure TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
  row, col : integer;

begin
  col := trunc(X/W);
  row := trunc(Y/H);
  if Fiald[col, row] = 0 theh
    Fiald[col, row] := 1 // если пусто то ставим мебель
  else
     Fiald[col, row] := 0; // иначе удаляем
   ShowField_(Canvas); 
end;
вот вроде так.
Miha85193 вне форума Ответить с цитированием
Старый 10.06.2010, 23:40   #7
kaseg
 
Регистрация: 06.06.2010
Сообщений: 5
По умолчанию

спасибо большое за помощь, но выводит коряво... сетка вначале вабще не видна, щёлкаешь мышью - появляется. И выглядит не совсем как сетка. Красиво квадратик ставится только в единственную ячейку - квадратик (слева вверху). А больше клеток по сути и нет. Поразбираюсь посижу.
з.ы. канваса нету в делфи 7 неудобно слегка
kaseg вне форума Ответить с цитированием
Старый 11.06.2010, 01:48   #8
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Тогда попробуйте вот так:

Код:
const
  {ширина и высота клетки}
  W = 30;
  H = 30;

var
  Field: array[0..9, 0..9] of integer; // комната

procedure ShowField_(Canvas: TCanvas);

  procedure Ht(Row, Col: Integer); // рисуем клетку
  begin
     if Field[col, row] = 0 then
     begin // рисуем пол
        Canvas.brush.color := clMaroon;
        Canvas.Rectangle(Col*W, Row*H, Col*W+W+1, Row*H+H+1);
     end
     else
     begin // рисуем мебель
        Canvas.brush.color := clBlue;
        Canvas.Rectangle(Col*W, Row*H, Col*W+W+1, Row*H+H+1);
     end;
  end;

var
  row,col :  integer;

begin
  for row :=0 to 9 do
    for col :=0 to 9 do
      Ht(Row, Col);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  row,col :  integer;
begin
  for row :=0 to 9 do
    for col :=0 to 9 do
      Field[col,row] := 0;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  row, col : integer;

begin
  col := trunc(X/W);
  row := trunc(Y/H);
  if Field[col, row] = 0 then
    Field[col, row] := 1 // если пусто то ставим мебель
  else
     Field[col, row] := 0; // иначе удаляем
   ShowField_(Canvas);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  ShowField_(Canvas);
end;
Дело в том, что я писас этот код по памяти и даже поленился проверить ошибки и откомпилировать его в своей Делфи. Вот теперь все ошибки исправлены.
Miha85193 вне форума Ответить с цитированием
Старый 12.06.2010, 14:31   #9
kaseg
 
Регистрация: 06.06.2010
Сообщений: 5
По умолчанию

Miha85193
спасибо большое. А как к примеру поставить состоящий из двух блоков элемент?
kaseg вне форума Ответить с цитированием
Старый 14.06.2010, 22:49   #10
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Тогда пишем в TForm1.FormMouseDown следующее:

Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  row, col : integer;

begin
  col := trunc(X/W);
  row := trunc(Y/H);
  if Field[col, row] = 0 then
  begin
    Field[col, row] := 1;// если пусто то ставим мебель

    if Field[col, row+1] <= 9 then
      Field[col, row+1] := 1;// второй блок

    { или же
    if Field[col, row-1] >= 0 then
      Field[col, row-1] := 1;
    или
    if Field[col+1, row] <= 9 then
      Field[col+1, row] := 1;
    или
    if Field[col-1, row] >= 0 then
      Field[col-1, row] := 1;
    в зависимости от того, где будет второй блок}
  end
  else
  begin
     Field[col, row] := 0; // иначе удаляем
  end; 
   ShowField_(Canvas);
end;

Последний раз редактировалось Miha85193; 14.06.2010 в 22:54.
Miha85193 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с картинками... Добавление фона.. p1r2o3 Общие вопросы Delphi 1 13.04.2010 19:52
Работа с динамическими картинками krikaved Общие вопросы Delphi 3 17.03.2010 23:48
проблема с картинками sava28 HTML и CSS 3 05.08.2008 16:23
бд с картинками TaTT DoGG БД в Delphi 3 28.04.2008 08:21
Работа с картинками в Delphi Alar Общие вопросы Delphi 0 29.10.2006 21:21