pascalabcnet/InstallerSamples/Graphics/WPFObjects/Shooter.pas

105 lines
2.8 KiB
ObjectPascal
Raw Permalink Normal View History

uses WPFObjects,Timers;
type
BulletWPF = class(CircleWPF) end;
MonsterWPF = class(SquareWPF) end;
2019-08-18 00:16:39 +03:00
PlayerWPF = class(EllipseWPF) end;
begin
2019-08-18 00:16:39 +03:00
var Player := new PlayerWPF(GraphWindow.Center, 30, 50, RandomColor);
Player.Velocity := 100;
Player.Number := 0;
loop 5 do
begin
var m := new MonsterWPF(750,Random(10,550),30,RandomColor);
m.Velocity := 50;
end;
2019-08-18 00:16:39 +03:00
OnMouseMove := (x,y,mb) -> Player.RotateToPoint(x,y);
OnMouseDown := (x,y,mb) -> begin
2019-08-18 00:16:39 +03:00
var cc := new BulletWPF(Player.CenterTop,5,Colors.Red);
cc.Direction := (x-Player.Center.X,y-Player.Center.Y);
cc.Velocity := 300;
end;
var kl,kr,ku,kd: boolean;
OnDrawFrame := dt -> begin
Window.Title := 'Количество объектов: '+Objects.Count;
2019-08-18 00:16:39 +03:00
// Перемещение игрока
if kr then
2019-08-18 00:16:39 +03:00
Player.Dx := 1
else if kl then
2019-08-18 00:16:39 +03:00
Player.Dx := -1
else Player.Dx := 0;
if ku then
2019-08-18 00:16:39 +03:00
Player.Dy := -1
else if kd then
2019-08-18 00:16:39 +03:00
Player.Dy := 1
else Player.Dy := 0;
for var i:=Objects.Count-1 downto 0 do // все перемещаются в своём направлении со своей скоростью
begin
var o := Objects[i];
if o is MonsterWPF then
2019-08-18 00:16:39 +03:00
o.Direction := (Player.Center.X - o.Center.X,Player.Center.Y-o.Center.Y);
o.MoveTime(dt);
end;
if Player.IntersectionList.Any(o -> o is MonsterWPF) then
begin
// Конец игры
end;
end;
2019-08-18 00:16:39 +03:00
CreateTimerAndStart(100,procedure -> // Таймер убивания монстров и умирания объектов за пределами экрана
begin
for var i:=Objects.Count-1 downto 0 do
begin
var o := Objects[i];
if (o.Center.X < 0) or (o.Center.X > Window.Width) or
(o.Center.Y < 0) or (o.Center.Y > Window.Height) then
2019-08-18 00:16:39 +03:00
if not (o is PlayerWPF) then
o.Destroy;
if o is BulletWPF then
foreach var x in o.IntersectionList do
if x is MonsterWPF then
begin
x.Destroy;
o.Destroy;
2019-08-18 00:16:39 +03:00
Player.Number += 1;
break;
end;
end;
end);
2019-08-18 00:16:39 +03:00
CreateTimerAndStart(1000,procedure -> // Таймер рождения монстров
begin
2019-08-18 00:16:39 +03:00
var x := Random(2)=0 ? 750 : 50;
var m := new MonsterWPF(x,Random(10,550),30,RandomColor);
m.Velocity := 50;
end);
OnKeyDown := k ->
begin
case k of
Key.w,Key.Up: begin ku := true; kd := false; end;
Key.s,Key.Down: begin kd := true; ku := false; end;
Key.a,Key.Left: begin kl := true; kr := false; end;
Key.d,Key.Right: begin kr := true; kl := false end;
end;
end;
OnKeyUp := k ->
begin
case k of
Key.w,Key.Up: ku := false;
Key.s,Key.Down: kd := false;
Key.a,Key.Left: kl := false;
Key.d,Key.Right: kr := false;
end;
end;
end.