Difference between revisions of "Developing with Graphics/pt"

From Lazarus wiki
Jump to navigationJump to search
Line 94: Line 94:
 
</code>
 
</code>
 
O código Lazarus desta página foi pego do projeto $LazarusPath/examples/lazintfimage/fadein1.lpi. Deste modo se você quiser começar bem com programação gráfica veja este exemplo.
 
O código Lazarus desta página foi pego do projeto $LazarusPath/examples/lazintfimage/fadein1.lpi. Deste modo se você quiser começar bem com programação gráfica veja este exemplo.
 +
 +
 +
==Gráficos em movimento - Como evitar a tremulação==
 +
Há várias opções para mudar rapidamente gráficos 2D. Para começar, você precisa escolher se vai usar alguma aceleração de hardware, como OpenGL, ou se prefere usar configuração de vídeo padrão. OpenGL tem a melhor velocidade em computadores novos, especialmente com boas placas de vídeo, mas terá uma perda significativa de velocidade em computadores mais antigos. Este tutorial focalizará como usar a configuração de vídeo padrão de tela. Se você deseja ajuda com OpenGL, dê uma olhada no exemplo que acompanha o Lazarus. Você também pode usar o A.J. Venter's gamepack, que provê um armazenamento temporário duplo da tela e um componente "sprite" .
 +
 +
Agora nós examinaremos as opções que  temos para desenhar a tela:
 +
* [[#Draw to a TImage|Draw to a TImage]]
 +
* [[#Draw on the OnPaint event|Draw on the OnPaint event of the form, a TPaintBox or another control]]
 +
* [[#Create a custom control which draws itself|Create a custom control which draws itself]]
 +
* [[#Using A.J. Venter's gamepack|Using A.J. Venter's gamepack]]
 +
 +
===Desenhar com o TImage===
 +
Nunca use o evento OnPaint para desenhar na TImage. O TImage é armazenado temporariamente , e assim tudo que você precisa fazer é desenhar em qualquer lugar e e a mudança será para sempre. Todavia, se você está constantemente redesenhando, a imagem tremulará. Neste caso pode tentar outras opções. Desenhar com o TImage é considerado lento comparado a outras aproximações.
 +
 +
<code>
 +
procedure TForm1.BitBtn1Click(Sender: TObject);
 +
var
 +
  x, y: Integer;
 +
begin
 +
  // Draws the backgroung
 +
  Image.Canvas.Pen.Color := clWhite;
 +
  Image.Canvas.Rectangle(0, 0, Image.Width, Image.Height);
 +
 
 +
  // Draws squares
 +
  Bitmap.Canvas.Pen.Color := clBlack;
 +
  for x := 1 to 8 do
 +
    for y := 1 to 8 do
 +
    Image.Canvas.Rectangle(Round((x - 1) * Image.Width / 8), Round((y - 1) * Image.Height / 8),
 +
        Round(x * Image.Width / 8), Round(y * Image.Height / 8));
 +
end;
 +
</code>
 +
 +
===Desenhar com o evento OnPaint===
 +
Neste caso todo o desenho tem que ser feito no evento OnPaint. Não permanece no armazenamento temporário, como no evento TImage.

Revision as of 23:13, 27 November 2005

Deutsch (de) English (en) español (es) français (fr) italiano (it) 日本語 (ja) 한국어 (ko) Nederlands (nl) português (pt) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

Visão Geral

Esta página foi iniciada para tutoriais com respeito para manipulação de Bitmaps e outros graficos no seu programa. Como eu não sou um programador gráfico, eu convido todos os outros que são, para participar desta especialidade. Nesse momento adicione um link para a próxima seção, adicione uma página e crie seu próprio artigo Wiki. Nesta página alguma informação geral será dada.

Outros Tutoriais Gráficos

Trabalhando com TBitmap

A primeira idéia para lembrar é que Lazarus tem em vista ser para plataforma independente, deste modo alguns métodos usando a API do windows estão fora de questão. Deste modo um método como ScanLine não é suportado por Lazarus porque ele é planejado para Dispositivo de Bitmap Independente e usa uma função da [biblioteca] GDI32.dll Isso já da uma boa pergunta ao FAQ: Porque não há ScanLine no Lazarus?

Um definhado/fading exemplo

Fala do que você precisa para criar uma "Fading Picture". No Delphi você pode fazer algo como:

type
  PRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = array[0..32767] of TRGBTriple;

procedure TForm1.FadeIn(aBitMap: TBitMap);
var
  Bitmap, BaseBitmap: TBitmap;
  Row, BaseRow: PRGBTripleArray;
  x, y, step: integer;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.PixelFormat := pf32bit;  //  ou pf24bit
    Bitmap.Assign(aBitMap);
    BaseBitmap := TBitmap.Create;
    try
      BaseBitmap.PixelFormat := pf32bit;
      BaseBitmap.Assign(Bitmap);
      for step := 0 to 32 do begin
        for y := 0 to (Bitmap.Height - 1) do begin
          BaseRow := BaseBitmap.Scanline[y];
          Row := Bitmap.Scanline[y];
          for x := 0 to (Bitmap.Width - 1) do begin
            Row[x].rgbtRed := (step * BaseRow[x].rgbtRed) shr 5;
            Row[x].rgbtGreen := (step * BaseRow[x].rgbtGreen) shr 5; // Fading
            Row[x].rgbtBlue := (step * BaseRow[x].rgbtBlue) shr 5;
          end;
        end;
        Form1.Canvas.Draw(0, 0, Bitmap);
        InvalidateRect(Form1.Handle, nil, False);
        RedrawWindow(Form1.Handle, nil, 0, RDW_UPDATENOW);
      end;
    finally
      BaseBitmap.Free;
    end;
  finally
    Bitmap.Free;
  end;
end;

Esta função no Lazarus pode ser implementada como:

procedure TForm1.FadeIn(ABitMap: TBitMap);
var
  SrcIntfImg, TempIntfImg: TLazIntfImage;
  ImgHandle,ImgMaskHandle: HBitmap;
  FadeStep: Integer;
  px, py: Integer;
  CurColor: TFPColor;
  TempBitmap: TBitmap;
begin
  SrcIntfImg:=TLazIntfImage.Create(0,0);
  SrcIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);
  TempIntfImg:=TLazIntfImage.Create(0,0);
  TempIntfImg.LoadFromBitmap(ABitmap.Handle,ABitmap.MaskHandle);
  TempBitmap:=TBitmap.Create;
  for FadeStep:=1 to 32 do begin
    for py:=0 to SrcIntfImg.Height-1 do begin
      for px:=0 to SrcIntfImg.Width-1 do begin
        CurColor:=SrcIntfImg.Colors[px,py];
        CurColor.Red:=(CurColor.Red*FadeStep) shr 5;
        CurColor.Green:=(CurColor.Green*FadeStep) shr 5;
        CurColor.Blue:=(CurColor.Blue*FadeStep) shr 5;
        TempIntfImg.Colors[px,py]:=CurColor;
      end;
    end;
    TempIntfImg.CreateBitmap(ImgHandle,ImgMaskHandle,false);
    TempBitmap.Handle:=ImgHandle;
    TempBitmap.MaskHandle:=ImgMaskHandle;
    Canvas.Draw(0,0,TempBitmap);
  end;
  SrcIntfImg.Free;
  TempIntfImg.Free;
  TempBitmap.Free;
end;

O código Lazarus desta página foi pego do projeto $LazarusPath/examples/lazintfimage/fadein1.lpi. Deste modo se você quiser começar bem com programação gráfica veja este exemplo.


Gráficos em movimento - Como evitar a tremulação

Há várias opções para mudar rapidamente gráficos 2D. Para começar, você precisa escolher se vai usar alguma aceleração de hardware, como OpenGL, ou se prefere usar configuração de vídeo padrão. OpenGL tem a melhor velocidade em computadores novos, especialmente com boas placas de vídeo, mas terá uma perda significativa de velocidade em computadores mais antigos. Este tutorial focalizará como usar a configuração de vídeo padrão de tela. Se você deseja ajuda com OpenGL, dê uma olhada no exemplo que acompanha o Lazarus. Você também pode usar o A.J. Venter's gamepack, que provê um armazenamento temporário duplo da tela e um componente "sprite" .

Agora nós examinaremos as opções que temos para desenhar a tela:

Desenhar com o TImage

Nunca use o evento OnPaint para desenhar na TImage. O TImage é armazenado temporariamente , e assim tudo que você precisa fazer é desenhar em qualquer lugar e e a mudança será para sempre. Todavia, se você está constantemente redesenhando, a imagem tremulará. Neste caso pode tentar outras opções. Desenhar com o TImage é considerado lento comparado a outras aproximações.

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  x, y: Integer;
begin
  // Draws the backgroung
  Image.Canvas.Pen.Color := clWhite;
  Image.Canvas.Rectangle(0, 0, Image.Width, Image.Height);
  
  // Draws squares
  Bitmap.Canvas.Pen.Color := clBlack;
  for x := 1 to 8 do
   for y := 1 to 8 do
    Image.Canvas.Rectangle(Round((x - 1) * Image.Width / 8), Round((y - 1) * Image.Height / 8),
       Round(x * Image.Width / 8), Round(y * Image.Height / 8));
end;

Desenhar com o evento OnPaint

Neste caso todo o desenho tem que ser feito no evento OnPaint. Não permanece no armazenamento temporário, como no evento TImage.