Z Index Demo lazarus / 39-Graphics ---------------------------------------------------------------------- Gigatron · 2025-05-17 00:04 Hi, Right now i don't know if i can make z index another way with lazarus. So let me share another nice Red sector Amegas crack fx to change position of image if this one reach top or bottom. Have Fun Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i unit Unit1; {$mode objfpc}{$H+} interface uses  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Menus,  BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes, Math; const  reach_TOP = 80;  rach_BOT = 250;  speed = 2;  copper_ww = 800;  copper_hh = 64;  col_change_time = 250; type  { TForm1 }  TForm1 = class(TForm)    BGRAVirtualScreen1: TBGRAVirtualScreen;    MainMenu1: TMainMenu;    Timer1: TTimer;    procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);    procedure FormCreate(Sender: TObject);    procedure FormDestroy(Sender: TObject);    procedure Timer1Timer(Sender: TObject);  private    pause_count: Integer;    BaseR, BaseG, BaseB: Byte; // rgb base  public    LogoDir, LogoYPos1, LogoYPos2, LogoXPos: Integer;    gtr, laz, Galaxy, Copper: TBGRABitmap;     procedure UpdateCopperBar;  end; var  Form1: TForm1; implementation{$R *.lfm} procedure TForm1.UpdateCopperBar;var  i: Integer;  r, g, b: Byte;  y1, y2: Integer;begin   // up colors  for i := 0 to 15 do  begin    r := Min(BaseR * i div 15, 255);    g := Min(BaseG * i div 15, 255);    b := Min(BaseB * i div 15, 255);    y1 := i * 2;    y2 := y1 + 4;    Copper.FillRect(0, y1, copper_ww, y2, BGRA(r, g, b, 255), dmSet);  end;  // down  for i := 0 to 15 do  begin    r := Max(BaseR - (BaseR * i div 15), 0);    g := Max(BaseG - (BaseG * i div 15), 0);  b := Max(BaseB - (BaseB * i div 15), 0);    y1 := 34 + i * 2;    y2 := y1 + 2;    Copper.FillRect(0, y1, copper_ww, y2, BGRA(r, g, b, 255), dmSet);  end;end; procedure TForm1.FormCreate(Sender: TObject);begin  Randomize; // Une seule fois au démarrage   try    gtr := TBGRABitmap.Create('gtr.png');    laz := TBGRABitmap.Create('laz.png');    Copper := TBGRABitmap.Create(copper_ww, copper_hh);  except    on E: Exception do      ShowMessage('load images error !! ' + E.Message);  end;   LogoDir := 1;  LogoXPos := 80;  LogoYPos1 := reach_TOP;  LogoYPos2 := rach_BOT;   BaseR := 55;  BaseG := 55;  BaseB := 55;   pause_count := 0;   UpdateCopperBar;end; procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);begin  // back image / galaxy // Bitmap.PutImage(0, 0, Galaxy, dmSet);   LogoYPos1 := LogoYPos1 + speed * LogoDir;  LogoYPos2 := LogoYPos2 - speed * LogoDir;   if (LogoYPos1 > rach_BOT) then    LogoDir := -1  else if (LogoYPos1 < reach_TOP) then    LogoDir := 1;  // swap position order Z-index de M.rde !!  if (LogoDir = 1) then  begin    Bitmap.PutImage(0, 180-128, Copper, dmSet);    Bitmap.PutImage(LogoXPos, LogoYPos1, gtr, dmDrawWithTransparency);    Bitmap.PutImage(0, 180, Copper, dmSet);    Bitmap.PutImage(LogoXPos, LogoYPos2, laz, dmDrawWithTransparency);    Bitmap.PutImage(0, 180+128, Copper, dmSet);  end  else  begin    Bitmap.PutImage(0, 180-128, Copper, dmSet);    Bitmap.PutImage(LogoXPos, LogoYPos2, laz, dmDrawWithTransparency);    Bitmap.PutImage(0, 180, Copper, dmSet);  Bitmap.PutImage(LogoXPos, LogoYPos1, gtr, dmDrawWithTransparency);     Bitmap.PutImage(0, 180+128, Copper, dmSet);  end;end; procedure TForm1.Timer1Timer(Sender: TObject);begin  Inc(pause_count, 2);  if (pause_count mod col_change_time = 0) then  begin    BaseR := 55 + Random(200);    BaseG := 55 + Random(200);    BaseB := 55 + Random(200);    pause_count := 0;    UpdateCopperBar;  end;   BGRAVirtualScreen1.RedrawBitmap;end;procedure TForm1.FormDestroy(Sender: TObject);begin  gtr.Free;  laz.Free; // Galaxy.Free;  Copper.Free;end;end.