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.