-
Постов
44 -
Зарегистрирован
-
Посещение
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
Достижения denprox
-
Astghik отреагировал на ответ на вопрос: Эффект тумана
-
Алмаз Амангельды отреагировал на ответ на вопрос: TPath - нарисовать путь для объекта
-
Мне кажется идея с регионами, звучит попроще. К примеру, если использовать такую функцию: function BitmapToRgn(Image: TBitmap): HRGN; var TmpRgn: HRGN; x, y: integer; ConsecutivePixels: integer; CurrentPixel: TColor; CreatedRgns: integer; CurrentColor: TColor; tmpImage:TBitmapData; begin Image.Map(TMapAccess.ReadWrite, tmpImage); CreatedRgns := 0; Result := CreateRectRgn(0, 0, Image.Width, Image.Height); inc(CreatedRgns); if (Image.Width = 0) or (Image.Height = 0) then exit; for y := 0 to Image.Height - 1 do begin CurrentColor := tmpImage.GetPixel(0,y); ConsecutivePixels := 1; for x := 0 to Image.Width - 1 do begin CurrentColor := tmpImage.GetPixel(x,y); if CurrentColor = CurrentPixel then inc(ConsecutivePixels) else begin // Входим в новую зону if CurrentColor = TColorRec.White then begin TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1); CombineRgn(Result, Result, TmpRgn, RGN_DIFF); inc(CreatedRgns); DeleteObject(TmpRgn); end; CurrentColor := CurrentPixel; ConsecutivePixels := 1; end; end; if (CurrentColor = TColorRec.White) and (ConsecutivePixels > 0) then begin TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1); CombineRgn(Result, Result, TmpRgn, RGN_DIFF); inc(CreatedRgns); DeleteObject(TmpRgn); end; end; end; Только мне пока не ясно, как применить регион к Bitmap'у или, как писал dnekrasov сопоставить Битмап и регион
-
denprox отреагировал на ответ на вопрос: Стрелковый тир (игра)
-
Mars M Отличный пример! Единственный момент есть, Мишени и укрытия заранее не известны. Т.е. нужно будет еще автоматически определять границы.
-
Ingalime отреагировал на ответ на вопрос: Стрелковый тир (игра)
-
krapotkin Предполагается, что пользователь сам должен создать свой "тренировочный полигон", установить фон, выбрать мишени и укрытия. Для упрощения предлагается нарисовать в Paint мишени/укрытия, как на картинках ниже. По большому большой роли не играет Image это или Bitmap. Для Укрытия красный цвет означает стену, белый (или отсутствие цвета, если это png с альфа каналом) - соответственно окно. Для мишени, у маски несколько цветов, каждый из которых отвечает за определенный балл. dnekrasov На счет регионов, думаю этот вариант подошел бы как нельзя кстати. Но как я уже писал ранее, к примеру для функции SetWindowRgn - нужен хэндл окна (объекта). В VCL к примеру без проблем можно для TPanel применить эту функцию.
-
Евгений Корепов отреагировал на вопрос: Окно программы по заданному Bitmap'у
-
Доброго времени суток! Пытаюсь сделать небольшое приложение в виде игры на тему "Стрелковый тир". Столкнулся с основной проблемой, решение которой обеспечит решение всей задачи, а именно Определение объекта попадания. Проблема в том, что кроме мишеней, могут присутствовать еще укрытия, а в укрытиях могут быть окна. Визуально мы видим как мишень появляется в "окне" и стреляем в нее, но по скольку программно это TImage один за другим, то событие ОнКлик срабатывает для Укрытия (TImage на переднем плане). Были такие идеи: 1. Воспользоваться функционалом, который используют для придания окну программы произвольной формы (функция SetWindowRgn() ), но для этого нужно знать Handle объекта 2. При клике определять позицию курсора, определять какие объекты в этой позиции находятся, и послойно определять точку попадания для каждого объекта по маске. - но боюсь, что этот метод будет не очень быстро работать. Буду признателен, если предложите свои идеи, как можно решить такую задачу. Если есть примеры - еще лучше!
-
Пардон) допустим не Image а TPanel ? В VCL можно было написать просто Panel1.handle, а как в FMX это реализуется?
-
Доброго времени суток! Пытаюсь сделать форму программы произвольной формы. Нагуглил такой пример: function BitmapToRgn(Image: TBitmap): HRGN; var TmpRgn: HRGN; x, y: integer; ConsecutivePixels: integer; CurrentPixel: TColor; CreatedRgns: integer; CurrentColor: TColor; tmpImage:TBitmapData; //добавлено мной begin Image.Map(TMapAccess.ReadWrite, tmpImage); //Добавлено мой для совместимости CreatedRgns := 0; Result := CreateRectRgn(0, 0, Image.Width, Image.Height); inc(CreatedRgns); if (Image.Width = 0) or (Image.Height = 0) then exit; for y := 0 to Image.Height - 1 do begin //CurrentColor := Image.Canvas.Pixels[0,y]; -- было CurrentColor := tmpImage.GetPixel(0,y); //стало ConsecutivePixels := 1; for x := 0 to Image.Width - 1 do begin //CurrentPixel := Image.Canvas.Pixels[x, y]; -- было CurrentColor := tmpImage.GetPixel(x,y); //стало if CurrentColor = CurrentPixel then inc(ConsecutivePixels) else begin // Входим в новую зону if CurrentColor = TColorRec.White then begin TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1); CombineRgn(Result, Result, TmpRgn, RGN_DIFF); inc(CreatedRgns); DeleteObject(TmpRgn); end; CurrentColor := CurrentPixel; ConsecutivePixels := 1; end; end; if (CurrentColor = TColorRec.White) and (ConsecutivePixels > 0) then begin TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1); CombineRgn(Result, Result, TmpRgn, RGN_DIFF); inc(CreatedRgns); DeleteObject(TmpRgn); end; end; end; По скольку пример был для VCL, немного изменил/добавил код Затем по нажатию кнопки применяем: procedure TForm1.Button1Click(Sender: TObject); var MaskBmp: TBitmap; begin MaskBmp := TBitmap.Create; try MaskBmp.LoadFromFile(ExtractFileDir(ParamStr(0))+ '\rgn.png'); Height := MaskBmp.Height; Width := MaskBmp.Width; // ОС владеет регионом, после вызова SetWindowRgn SetWindowRgn(FmxHandleToHWND(Handle), BitmapToRgn(MaskBmp), True); finally MaskBmp.Free; end; end; В результате окно программы остается такое же прямоугольное, только высота и ширина становятся по размеру картинки. В чем может быть проблема ?? p.s. Если использовать не Bitmap а к примеру: var Rgn : HRGN; begin Rgn := CreateEllipticRgn(0, 0, 200, 200); SetWindowRgn(FmxHandleToHWND(Self.Handle), Rgn, TRUE); end; То окно программы становится круглым, как и задумано.
-
Всем привет! Возник такой вопрос, как можно получить список всех контролов под курсором ? К примеру несколько TImage лежат друг над другом, при нажатии на самый "верхний", необходимо узнать какие контролы есть под этим TImage.
-
Доброго времени суток! Подскажите, как получить хендл (HWND) контрола, например TImage расположенного на форме ?
-
Спасибо, подумаю над этим.
-
Вот примерно так это могло бы выглядеть.
-
Доброго времени суток! Столкнулся с такой задачей: допустим на форме лежит кнопка (или любой другой объект), поверх него лежит Image, у которого есть определенная маска (Альфа). Необходимо, чтобы в местах где прозрачность, была возможность нажать на объект, который под Image находится. При этом Image так же должен быть кликабелен.
-
Mars M отреагировал на ответ на вопрос: Глобальные и локальные координаты позиции курсора
-
Спасибо! То что нужно! Вот рабочий пример: procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var AbsoluteMousePos: TPointF; LocalMousePos: TPointF; begin Label1.Text := 'X: '+FloatToStr(X); //Координаты в пределах объекта Label2.Text := 'Y: '+FloatToStr(Y); LocalMousePos := TPointF.Create(X, Y); AbsoluteMousePos := Panel1.LocalToAbsolute(LocalMousePos); Label3.Text := 'gX: '+ FloatToStr(AbsoluteMousePos.X); //Координаты относительно формы Label4.Text := 'gY: '+ FloatToStr(AbsoluteMousePos.Y);
-
denprox отреагировал на ответ на вопрос: Глобальные и локальные координаты позиции курсора
-
Доброго времени суток! Подскажите, каким образом можно узнать глобальные координаты курсора в момент нажатия по TImage (например). К примеру на форме лежит TImage, при нажатии (OnMouseDown) можно узнать координаты X,Y в пределах этого Image (локальные), а как узнать X,Y относительно главной формы ?
-
Про Position объекта как то не подумал ... спасибо за наводку ))