2019-08-15 23:54:13 +03:00
|
|
|
|
uses WPFObjects,Timers;
|
|
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
|
BulletWPF = class(CircleWPF) end;
|
|
|
|
|
|
MonsterWPF = class(SquareWPF) end;
|
2019-08-18 00:16:39 +03:00
|
|
|
|
PlayerWPF = class(EllipseWPF) end;
|
2019-08-15 23:54:13 +03:00
|
|
|
|
|
|
|
|
|
|
begin
|
2019-08-18 00:16:39 +03:00
|
|
|
|
var Player := new PlayerWPF(GraphWindow.Center, 30, 50, RandomColor);
|
|
|
|
|
|
Player.Velocity := 100;
|
|
|
|
|
|
Player.Number := 0;
|
2019-08-15 23:54:13 +03:00
|
|
|
|
|
|
|
|
|
|
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);
|
2019-08-15 23:54:13 +03:00
|
|
|
|
|
|
|
|
|
|
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);
|
2019-08-15 23:54:13 +03:00
|
|
|
|
cc.Velocity := 300;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
var kl,kr,ku,kd: boolean;
|
|
|
|
|
|
|
2020-08-09 18:15:34 +03:00
|
|
|
|
OnDrawFrame := dt -> begin
|
2019-08-15 23:54:13 +03:00
|
|
|
|
Window.Title := 'Количество объектов: '+Objects.Count;
|
2019-08-18 00:16:39 +03:00
|
|
|
|
// Перемещение игрока
|
2019-08-15 23:54:13 +03:00
|
|
|
|
if kr then
|
2019-08-18 00:16:39 +03:00
|
|
|
|
Player.Dx := 1
|
2019-08-15 23:54:13 +03:00
|
|
|
|
else if kl then
|
2019-08-18 00:16:39 +03:00
|
|
|
|
Player.Dx := -1
|
|
|
|
|
|
else Player.Dx := 0;
|
2019-08-15 23:54:13 +03:00
|
|
|
|
if ku then
|
2019-08-18 00:16:39 +03:00
|
|
|
|
Player.Dy := -1
|
2019-08-15 23:54:13 +03:00
|
|
|
|
else if kd then
|
2019-08-18 00:16:39 +03:00
|
|
|
|
Player.Dy := 1
|
|
|
|
|
|
else Player.Dy := 0;
|
2019-08-15 23:54:13 +03:00
|
|
|
|
|
|
|
|
|
|
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;
|
2020-08-09 18:15:34 +03:00
|
|
|
|
end;
|
2019-08-15 23:54:13 +03:00
|
|
|
|
|
2019-08-18 00:16:39 +03:00
|
|
|
|
CreateTimerAndStart(100,procedure -> // Таймер убивания монстров и умирания объектов за пределами экрана
|
2019-08-15 23:54:13 +03:00
|
|
|
|
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;
|
2019-08-15 23:54:13 +03:00
|
|
|
|
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;
|
2019-08-15 23:54:13 +03:00
|
|
|
|
break;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end);
|
|
|
|
|
|
|
2019-08-18 00:16:39 +03:00
|
|
|
|
CreateTimerAndStart(1000,procedure -> // Таймер рождения монстров
|
2019-08-15 23:54:13 +03:00
|
|
|
|
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);
|
2019-08-15 23:54:13 +03:00
|
|
|
|
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.
|