156 lines
5.0 KiB
ObjectPascal
156 lines
5.0 KiB
ObjectPascal
unit utestbgragame;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, Forms, Controls, LCLType, ExtCtrls, BGRAVirtualScreen, BGRABitmap,
|
|
BGRABitmapTypes, Dialogs, bgragame;
|
|
|
|
type
|
|
|
|
{ TForm1 }
|
|
|
|
TForm1 = class(TForm)
|
|
BGRAVirtualScreen1: TBGRAVirtualScreen;
|
|
Timer2: TTimer;
|
|
procedure BGRAVirtualScreen1MouseDown(Sender: TObject;
|
|
Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: integer);
|
|
procedure BGRAVirtualScreen1MouseMove(Sender: TObject; Shift: TShiftState;
|
|
X, Y: integer);
|
|
procedure BGRAVirtualScreen1MouseUp(Sender: TObject; Button: TMouseButton;
|
|
{%H-}Shift: TShiftState; X, Y: Integer);
|
|
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormKeyDown(Sender: TObject; var Key: word; {%H-}Shift: TShiftState);
|
|
procedure FormKeyUp(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);
|
|
procedure FormResize(Sender: TObject);
|
|
procedure Timer2Timer(Sender: TObject);
|
|
private
|
|
{ private declarations }
|
|
procedure UpdateVirtualScreen;
|
|
public
|
|
{ public declarations }
|
|
level1: TGameMap;
|
|
size: TRect;
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
{ TForm1 }
|
|
|
|
procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
|
|
begin
|
|
DrawMap(level1, bitmap, True);
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
begin
|
|
Size := Rect(0, 0, 640, 480);
|
|
ToggleFullScreen(Self, Size);
|
|
|
|
level1.mapWidth := 20;
|
|
level1.mapHeight := 20;
|
|
level1.mapGraphics :=
|
|
'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000X000000000000000000000000000000000000000000000000000000000000000000000000000000';
|
|
level1.mapProperty :=
|
|
'2222222222222222222220002020220200022022212022000020020000022020202022002202202220200000200202020002200202200020000220222200220022002020200220200020202220020022202022002002020002022200200000200022000220020200220020002022202220202002202000222000000020200020220222220222002020200002202020200200220220222200002020220000002220202020020222220002202020022000020002022000220000020002000222222222222222222222';
|
|
level1.mapSolve :=
|
|
'2222222222222222222220002020220200022022202022000020020000022020202022002202202220200000200202020002200202200020000220222200220022002020200220200020202220020022202022002002020002022200200000200022000220020200220020002022202220202002202000222000000020200020220222220222002020200002202020200200220220222200002020220000002221202020020222220002202020022000020002022000220000020002000222222222222222222222';
|
|
level1.mapKeyChar := '1'; // Player
|
|
level1.mapSolidChar := '2'; // Wall
|
|
level1.ballPositionDefined := false;
|
|
//see FormResize
|
|
|
|
Timer2.Interval:= 16;
|
|
end;
|
|
|
|
procedure TForm1.FormDestroy(Sender: TObject);
|
|
begin
|
|
level1.background.Free;
|
|
level1.ballSphereMap.free;
|
|
end;
|
|
|
|
procedure TForm1.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
|
|
begin
|
|
if (Key = VK_ESCAPE) then
|
|
Application.Terminate;
|
|
|
|
if (Key = VK_F11) then
|
|
ToggleFullScreen(Self, Size);
|
|
|
|
KeyDownMap(level1, Key);
|
|
end;
|
|
|
|
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
begin
|
|
KeyUpMap(level1, Key);
|
|
end;
|
|
|
|
procedure TForm1.FormResize(Sender: TObject);
|
|
begin
|
|
Size := Rect(0, 0, Width, Height);
|
|
ScaleAspectRatio(BGRAVirtualScreen1, Size.Right, Size.Bottom, True, True, True);
|
|
|
|
// this has scaling
|
|
level1.blockWidth := BGRAVirtualScreen1.Width div level1.mapWidth;
|
|
level1.blockHeight := BGRAVirtualScreen1.Height div level1.mapHeight;
|
|
|
|
// this has scaling
|
|
level1.background.Free;
|
|
level1.background := TBGRABitmap.Create('background.jpg');
|
|
BGRAReplace(level1.background, level1.background.Resample(BGRAVirtualScreen1.Width, BGRAVirtualScreen1.Height));
|
|
end;
|
|
|
|
procedure TForm1.Timer2Timer(Sender: TObject);
|
|
begin
|
|
Timer2.Enabled:= false;
|
|
UpdateVirtualScreen;
|
|
if IsMapSolved(level1) then
|
|
begin
|
|
Timer2.Enabled := False;
|
|
ShowMessage('Win!');
|
|
Application.Terminate;
|
|
end;
|
|
Timer2.Enabled:= true;
|
|
end;
|
|
|
|
procedure TForm1.UpdateVirtualScreen;
|
|
begin
|
|
if Assigned(BGRAVirtualScreen1.Bitmap) then
|
|
begin
|
|
DrawMap(level1, BGRAVirtualScreen1.bitmap, false);
|
|
BGRAVirtualScreen1.Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.BGRAVirtualScreen1MouseDown(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: integer);
|
|
begin
|
|
if Button = mbLeft then
|
|
MouseDownMap(level1, Point(x, y));
|
|
end;
|
|
|
|
procedure TForm1.BGRAVirtualScreen1MouseMove(Sender: TObject;
|
|
Shift: TShiftState; X, Y: integer);
|
|
begin
|
|
if ssLeft in shift then
|
|
MouseDownMap(level1, Point(x, y));
|
|
end;
|
|
|
|
procedure TForm1.BGRAVirtualScreen1MouseUp(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if Button = mbLeft then
|
|
MouseUpMap(level1, Point(x, y));
|
|
end;
|
|
|
|
end.
|