Перейти к содержанию
Fire Monkey от А до Я

denprox

Пользователи
  • Постов

    44
  • Зарегистрирован

  • Посещение

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Мне кажется идея с регионами, звучит попроще. К примеру, если использовать такую функцию: 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 сопоставить Битмап и регион
  2. Mars M Отличный пример! Единственный момент есть, Мишени и укрытия заранее не известны. Т.е. нужно будет еще автоматически определять границы.
  3. krapotkin Предполагается, что пользователь сам должен создать свой "тренировочный полигон", установить фон, выбрать мишени и укрытия. Для упрощения предлагается нарисовать в Paint мишени/укрытия, как на картинках ниже. По большому большой роли не играет Image это или Bitmap. Для Укрытия красный цвет означает стену, белый (или отсутствие цвета, если это png с альфа каналом) - соответственно окно. Для мишени, у маски несколько цветов, каждый из которых отвечает за определенный балл. dnekrasov На счет регионов, думаю этот вариант подошел бы как нельзя кстати. Но как я уже писал ранее, к примеру для функции SetWindowRgn - нужен хэндл окна (объекта). В VCL к примеру без проблем можно для TPanel применить эту функцию.
  4. denprox

    Стрелковый тир (игра)

    Доброго времени суток! Пытаюсь сделать небольшое приложение в виде игры на тему "Стрелковый тир". Столкнулся с основной проблемой, решение которой обеспечит решение всей задачи, а именно Определение объекта попадания. Проблема в том, что кроме мишеней, могут присутствовать еще укрытия, а в укрытиях могут быть окна. Визуально мы видим как мишень появляется в "окне" и стреляем в нее, но по скольку программно это TImage один за другим, то событие ОнКлик срабатывает для Укрытия (TImage на переднем плане). Были такие идеи: 1. Воспользоваться функционалом, который используют для придания окну программы произвольной формы (функция SetWindowRgn() ), но для этого нужно знать Handle объекта 2. При клике определять позицию курсора, определять какие объекты в этой позиции находятся, и послойно определять точку попадания для каждого объекта по маске. - но боюсь, что этот метод будет не очень быстро работать. Буду признателен, если предложите свои идеи, как можно решить такую задачу. Если есть примеры - еще лучше!
  5. Пардон) допустим не Image а TPanel ? В VCL можно было написать просто Panel1.handle, а как в FMX это реализуется?
  6. Доброго времени суток! Пытаюсь сделать форму программы произвольной формы. Нагуглил такой пример: 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; То окно программы становится круглым, как и задумано.
  7. Всем привет! Возник такой вопрос, как можно получить список всех контролов под курсором ? К примеру несколько TImage лежат друг над другом, при нажатии на самый "верхний", необходимо узнать какие контролы есть под этим TImage.
  8. Доброго времени суток! Подскажите, как получить хендл (HWND) контрола, например TImage расположенного на форме ?
  9. Спасибо, подумаю над этим.
  10. Вот примерно так это могло бы выглядеть.
  11. Доброго времени суток! Столкнулся с такой задачей: допустим на форме лежит кнопка (или любой другой объект), поверх него лежит Image, у которого есть определенная маска (Альфа). Необходимо, чтобы в местах где прозрачность, была возможность нажать на объект, который под Image находится. При этом Image так же должен быть кликабелен.
  12. Спасибо! То что нужно! Вот рабочий пример: 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);
  13. Доброго времени суток! Подскажите, каким образом можно узнать глобальные координаты курсора в момент нажатия по TImage (например). К примеру на форме лежит TImage, при нажатии (OnMouseDown) можно узнать координаты X,Y в пределах этого Image (локальные), а как узнать X,Y относительно главной формы ?
  14. Про Position объекта как то не подумал ... спасибо за наводку ))
×
×
  • Создать...