unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, LCLtype, StdCtrls, Math;
//Player record
type
TPlayer = record
Image: TImage;
Health: integer;
Damage: integer;
FireRate: integer;
Tag: integer;
end;
type
TArrow = record
Image: TImage;
Damage: integer;
Tag: integer;
end;
//Enemy1 record
type
TEnemy = record
Image: TImage;
Health: integer;
Damage: integer;
Tag: integer;
end;
type
{ TForm1 }
TForm1 = class(TForm)
Timer1: TTimer;
MoveArrow: TTimer;
ShootArrow: TTimer;
procedure MoveArrowTimer;
procedure FormActivate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ShootArrowTimer(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Upgrade1Click(Sender: TObject);
procedure Upgrade2Click(Sender: TObject);
procedure Upgrade3Click(Sender: TObject);
procedure ShowUpgrades;
private
public
end;
var
Form1 : TForm1;
Player : TPlayer;
MoveUp, MoveDown, MoveLeft, MoveRight : boolean;
ArrayEnemies : array of TEnemy;
//Legt fest, welcher Pfeil bewegt wird
PictureOfArrowToShoot : Timage;
//X und Y abstände zwischen Gegner und Gegner, der am nähesten ist
xDiff : integer;
yDiff : integer;
canShoot : boolean;
PlayerCollision : boolean;
const
//Anzahl an Gegnern im Level
AmountWilly = 5;
AmountKlaus = 5;
AmountFreddy = 5;
implementation
{$R *.lfm}
//Beliebiges Bild laden
procedure LoadImage(ImageToLoad: TImage; FileName: string);
begin
ImageToLoad.Picture.LoadFromFile(FileName);
end;
//Enemies Spawnen
procedure SpawnEnemies(const NumEnemies: Integer);
var
k: Integer;
begin
SetLength(ArrayEnemies, NumEnemies);
for k := 0 to NumEnemies - 1 do
begin
ArrayEnemies[k].Image := TImage.Create(nil);
ArrayEnemies[k].Image.Parent := Form1;
ArrayEnemies[k].Image.Left := 50 + (k*10);
ArrayEnemies[k].Image.Top := 50 +(k*10);
ArrayEnemies[k].Image.Width := 100;
ArrayEnemies[k].Image.Height := 100;
ArrayEnemies[k].Image.Stretch := true;
LoadImage(ArrayEnemies[k].Image, 'Bilder/BulletTest.jpg');
ArrayEnemies[k].Health := 100;
end;
end;
//Position eines Enemys ändern
procedure SetEnemyPosition(const EnemyIndex: Integer; NewLeft, NewTop: Integer);
begin
ArrayEnemies[EnemyIndex].Image.Left := NewLeft;
ArrayEnemies[EnemyIndex].Image.Top := NewTop;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
//Für Collision - weg machen
X, Y, i: Integer;
begin
//Bild des zu schießenden Pfeil muss vorher erstmal erschaffen werden und dient solange als Platzhalter
PictureOfArrowToShoot := TImage.Create(nil);
//Bild des Spieler Laden
Player.Image := TImage.Create(nil);
LoadImage(Player.Image, 'Bilder/UserTest.jpg');
Player.Image.Parent := Form1;
Player.Image.Left := 10;
Player.Image.Top := 10;
Player.Image.Width := 100;
Player.Image.Height := 100;
Player.Image.Stretch := true;
Player.FireRate := 1000;
//Position des Spielers zu Beginn festlegen
Player.Image.Left := (Self.ClientWidth - Player.Image.Width) div 2;
Player.Image.Top := ((Self.ClientHeight - Player.Image.Height) div 2) {+ 800};
//Startwerte Spieler festlegen
Player.Health := 50;
Player.Damage := 10;
//Enemies spawnen
SpawnEnemies(AmountWilly);
//Enemies platzieren
SetEnemyPosition(0, 10, 10);
SetEnemyPosition(1, 220, 10);
SetEnemyPosition(2, 430, 10);
SetEnemyPosition(3, 640, 10);
SetEnemyPosition(4, 850, 10);
//Upgrades zum test am anfang zeigen
ShowUpgrades;
//Auf collision testen
{
for X := 0 to Player.Image.Width - 1 do
begin
for Y := 0 to Player.Image.Height - 1 do
begin
if (Player.Image.Canvas.Pixels[X, Y] = ArrayEnemies[i].Canvas.Pixels[X + Player.Image.Left, Y + Player.Image.Top]) then
begin
PlayerCollision := True;
Break;
end;
end;
if PlayerCollision then Break;
end;
if PlayerCollision then Break;
end;
}
end;
//Nähesten Gegner ermittlen (welcher Gegner wird anvisiert)
function GetClosestEnemy(Image: TImage) : integer;
var
k: integer;
Distance, MinDistance: double;
DeltaX, DeltaY: integer;
ClosestEnemy: integer;
begin
ClosestEnemy := 0;
MinDistance := MaxInt; //sehr große Zahl
for k := 0 to 4 do //Später noch zu AmountWilly ändern
begin
DeltaX := ArrayEnemies[k].Image.Left + (ArrayEnemies[k].Image.Width div 2) - (Image.Left + (Image.Width div 2));
DeltaY := ArrayEnemies[k].Image.Top + (ArrayEnemies[k].Image.Height div 2) - (Image.Top + (Image.Height div 2));
Distance := Sqrt(DeltaX * DeltaX + DeltaY * DeltaY);
if Distance < MinDistance then
begin
MinDistance := Distance;
ClosestEnemy := k;
end;
end;
//Showmessage(Inttostr(ClosestEnemy) + '- Min k - ' + FloatToStr(MinDistance));
result := ClosestEnemy;
end;
//Pfeil bewegen
procedure TForm1.MoveArrowTimer;
begin
//Pfeil bewegt sich noch unterschiedlich schnell, je nachdem wie weit man vom gegner entfernt steht!!
//SpeedAdjuster := ClosestDistance;
PictureOfArrowToShoot.Top := PictureOfArrowToShoot.Top + Round(yDiff/100);
PictureOfArrowToShoot.Left := PictureOfArrowToShoot.Left + Round(xDiff/100);
end;
//Pfeil spawnen
procedure SpawnArrow;
var
Arrow: TArrow;
ArrowCenterX: integer;
ArrowCenterY: integer;
//Closest Enemy
z : integer;
begin
Arrow.Image := TImage.Create(nil);
Arrow.Image.Parent := Form1;
Arrow.Image.Width := 50;
Arrow.Image.Height := 50;
Arrow.Image.Stretch := true;
//Mitte des Pfeils ermitteln
ArrowCenterX := Arrow.Image.Width div 2;
ArrowCenterY := Arrow.Image.Height div 2;
//Pfeil in der Mitte des Spieler platzieren
Arrow.Image.Left := (Player.Image.Left - ArrowCenterX) + Player.Image.Width div 2;
Arrow.Image.Top := (Player.Image.Top - ArrowCenterY) + Player.Image.Height div 2;
LoadImage(Arrow.Image, 'Bilder/BulletTest.jpg');
PictureOfArrowToShoot := Arrow.Image;
//Abstand zwischen dem nähesten Gegner und Spieler berechnen
z := GetClosestEnemy(Player.Image);
xDiff := (ArrayEnemies[z].Image.Left + ArrayEnemies[z].Image.Width div 2) - (PictureOfArrowToShoot.Left + ArrayEnemies[z].Image.Width div 2);
yDiff := (ArrayEnemies[z].Image.Top + ArrayEnemies[z].Image.Height div 2) - (PictureOfArrowToShoot.Top + ArrayEnemies[z].Image.Height div 2);
//Showmessage('xDiff: ' + IntToStr(xDiff));
//Showmessage('yDiff: ' + IntToStr(yDiff));
end;
//Feuerrate
procedure TForm1.ShootArrowTimer(Sender: TObject);
begin
if canShoot = true then
begin
ShootArrow.Interval := Player.FireRate;
SpawnArrow;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Hoch
if MoveUp = true then
begin
Player.Image.Top := Player.Image.Top - 10;
canShoot := false;
end
//Runter
else If MoveDown = true then
begin
Player.Image.Top := Player.Image.Top + 10;
canShoot := false;
end
//Links
else if MoveLeft = true then
begin
Player.Image.Left:= Player.Image.Left - 10;
canShoot := false;
end
//Rechts
else if MoveRight = true then
begin
Player.Image.Left := Player.Image.Left + 10;
canShoot := false;
end
else
canShoot := true;
end;
//Erstes Upgrade geclickt
procedure TForm1.Upgrade1Click(Sender: TObject);
begin
Showmessage('Upgrade 1 clicked');
end;
//Zweites Upgrade geclick
procedure TForm1.Upgrade2Click(Sender: TObject);
begin
Showmessage('Upgrade 2 clicked');
end;
//drittes Upgrade geclickt
procedure TForm1.Upgrade3Click(Sender: TObject);
begin
Showmessage('Upgrade 3 clicked');
end;
//Upgrades
procedure TForm1.ShowUpgrades;
var
Upgrades : array[1..3] of TImage;
k : integer;
begin
//Showmessage('Ugrades werden angezeigt');
// Create TImage components
for k := 1 to 3 do
begin
Upgrades[k] := TImage.Create(nil);
Upgrades[k].Parent := Form1;
Upgrades[k].Height := 100;
Upgrades[k].Width :=100;
Upgrades[k].Stretch := true;
Upgrades[k].Top:= 500;
Upgrades[k].Left := 50 + (k*200);
end;
// Load images for each TImage component
Upgrades[1].Picture.LoadFromFile('Bilder/BulletTest.jpg');
Upgrades[2].Picture.LoadFromFile('Bilder/UserTest.jpg');
Upgrades[3].Picture.LoadFromFile('Bilder/BulletTest.jpg');
//OnClick Events für jedes Bild
Upgrades[1].OnClick:= @Upgrade1Click;
Upgrades[2].OnClick:= @Upgrade2Click;
Upgrades[3].OnClick:= @Upgrade3Click;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
);
begin
//Hoch
if key = VK_UP then
begin
MoveUp:= true;
end;
//Runter
if key = VK_DOWN then
begin
MoveDown := true;
end;
//Links
if key = VK_LEFT then
begin
MoveLeft:= true;
end;
//Rechts
if key = VK_RIGHT then
begin
MoveRight := true;
end;
//Upgrades zeigen
if key = VK_Space then
begin
ShowUpgrades;
end;
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//Hoch
if key = VK_UP then
begin
MoveUp := false;
end;
//Runter
if key = VK_DOWN then
begin
MoveDown := false;
end;
//Links
if key = VK_LEFT then
begin
MoveLeft:= false;
end;
//Rechts
if key = VK_RIGHT then
begin
MoveRight := false;
end;
end;
end.