unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TTank = record
Speed, x, y, Povorot, Anim: Integer; // скорость, координаты, направление
Go, Fight, Vistrel, Visible: Boolean; // движемся или стоим?, стрельба, выстрелили ли мы уже?, видим или нет
Zaderhka_Visrela, Max_Vistrel: Integer; // таймер задержки выстрела, и сама задержка
poyehal: Boolean;
end;
type
TPulya = record
x, y, Speed, Povorot: Integer; // координаты, скорость, направление
visible: Boolean; // видна ли пуля?
end;
type
TFlag = record
x, y: integer;
Pic: TBitmap;
end;
var
Form1: TForm1;
Tanki: array[1..2, 1..4, 1..4] of TBitmap; // 1-2 - два вида танков, 1-4 - направление
// 1-2 движение гусениц фнимация и 3-4 - анимация с выстрелом
Textures: array[1..3, 1..3] of TBitmap; // Массив картинок карты (земля, вода, лес)(.. .. последнее зима)
Flag: array[1..2] of TFlag; // написано что характеристики и картинки флагов соперников на карте????
Map: array[0..10, 0..10] of Integer; // Массив клеток игровой карты
Tank: array[1..4] of TTank;
Puli: array[1..20] of TPulya;
Pulya: array[1..4] of TBitmap;
Buf: TBitmap; //Рисунок пули и буфер
path: string; // будет хранить путь к игре
qUp, qDown, qLeft, qRight: Boolean;
i, j, k: Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i, j: Integer;
begin
path := ExtractFileDir(Application.ExeName);
//загрузка картинок танков
for i := 1 to 4 do
for j := 1 to 4 do
begin
Tanki[1, j, i] := TBitmap.Create; // загружаем картинки для первого танка (нашего, основного)
Tanki[1, j, i].TransparentColor := clWhite;
Tanki[1, j, i].Transparent := True;
Tanki[1, j, i].LoadFromFile(path + '\img\' + 'т1' + IntToStr(j) + IntToStr(i) + '.bmp');
Tanki[2, j, i] := TBitmap.Create; // загружаем картинки для второго танка (противник)
Tanki[2, j, i].TransparentColor := clWhite; // картинки надо переделать
Tanki[2, j, i].Transparent := True;
Tanki[2, j, i].LoadFromFile(path + '\img\' + 'т2' + IntToStr(j) + IntToStr(i) + '.bmp');
end;
//загружаем текстуры
for i := 1 to 3 do
begin
Textures[1, i] := TBitmap.Create; // земля - полностью проходима
Textures[1, i].LoadFromFile(path + '\img\' + 'земля' + IntToStr(i) + '.bmp');
Textures[2, i] := TBitmap.Create; // вода - проходима только зимой (один раз, лёд ломается)
Textures[2, i].LoadFromFile(path + '\img\' + 'вода' + IntToStr(i) + '.bmp');
Textures[3, i] := TBitmap.Create; // лес - проходим, но скрывает танк,
// Textures[3, i].TransparentColor := Textures[3, i]
Textures[3, i].LoadFromFile(path + '\img\' + 'лес' + IntToStr(i) + '.bmp'); // надо установить прозрачность
end;
//загружаем рисунок пули в массив
for i := 1 to 4 do
begin
Pulya[i] := TBitmap.Create;
Pulya[i].TransparentColor := clWhite;
Pulya[i].Transparent := True;
Pulya[i].LoadFromFile(path + '\img\' + 'снаряд' + IntToStr(i) + '.bmp');
end;
Buf := TBitmap.Create; // буфер для визуальной карты
Buf.Width := 600;
Buf.Height := 600;
qLeft := False; //объект стоит и сообщаем что все кнопки отжаты
qUp := False;
qDown := False;
qRight := False;
Tank[1].Speed := 10;
Tank[1].x := 60;
Tank[1].y := 540;
Tank[1].Povorot := 1;
Tank[1].Go := False;
Tank[1].Anim := 1;
Tank[1].Fight := False;
Tank[1].Zaderhka_Visrela := 0;
Tank[1].Max_Vistrel := 10;
Tank[1].Vistrel := False;
Tank[1].Visible := True;
Tank[2].Speed := 7;
Tank[2].x := 480;
Tank[2].y := 0;
Tank[2].Povorot := 3;
Tank[2].Go := False;
Tank[2].Anim := 1;
Tank[2].Fight := False;
Tank[2].Zaderhka_Visrela := 0;
Tank[2].Max_Vistrel := 10;
Tank[2].Vistrel := False;
Tank[2].poyehal := False;
Tank[2].Visible := True;
Tank[3].Speed := 5;
Tank[3].x := 540;
Tank[3].y := 60;
Tank[3].Povorot := 3;
Tank[3].Go := False;
Tank[3].Anim := 1;
Tank[3].Fight := False;
Tank[3].Zaderhka_Visrela := 0;
Tank[3].Max_Vistrel := 5;
Tank[3].Vistrel := False;
Tank[3].poyehal := False;
Tank[3].Visible := True;
for i := 1 to 20 do
begin
Puli[i].x := 0;
Puli[i].y := 0;
Puli[i].Speed := 20;
Puli[i].Povorot := 0;
Puli[i].visible := False;
end;
Flag[1].x := 9;
Flag[1].y := 0;
Flag[2].x := 0;
Flag[2].y := 9;
Flag[1].Pic := TBitmap.Create;
// Flag[1].Pic.TransparentColor := clWhite;
Flag[1].Pic.Transparent := True;
Flag[2].Pic := TBitmap.Create;
Flag[2].Pic.Transparent := True;
Flag[1].Pic.LoadFromFile(path + '\img\флаг1.bmp');
Flag[2].Pic.LoadFromFile(path + '\img\флаг2.bmp');
//случайное генерирование карты
Randomize;
k := Random(3) + 1; //выбираем один из 3-х факторов, вроде зима, лето, осень...
for i := 0 to 9 do
for j:= 0 to 9 do
begin
Map[i, j] := Random(100) + 1;
if Map[i, j] <= 50 then Map[i, j] := 1;
if (Map[i, j] > 50) and (Map[i, j] <= 80) then Map[i, j] := 3;
if Map[i, j] > 80 then Map[i, j] := 2;
end;
Map[Trunc(Tank[1].x / 60), Trunc(Tank[1].y / 60)] := 1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i, j: Integer;
begin
// рисуем карту и танк на ней
for i := 0 to 9 do
for j := 0 to 9 do
Buf.Canvas.Draw(i * 60, j * 60, Textures[Map[i, j], k]);
if Tank[1].Go = True then
begin
if Tank[1].Anim = 1 then Tank[1].Anim := 2
else Tank[1].Anim := 1;
// UP
if (Tank[1].Povorot = 1) and (Map[Trunc(Tank[1].x / 60), Trunc((Tank[1].y - Tank[1].Speed) / 60)] = 1)
and (Map[Trunc((Tank[1].x + 59) / 60), Trunc((Tank[1].y - Tank[1].Speed) / 60)] = 1)
and (Tank[1].y - Tank[1].Speed >= 0) then Tank[1].y := Tank[1].y - Tank[1].Speed;
// расписываю. Если движение наверх и при этом выше левого угла танка нет препятствия и выше правого угла
// нет препятствия и при этом не находимся на самом верху карты, то продолжаем двигаться наверх.
//DOWN
if (Tank[1].Povorot = 3) and (Map[Trunc(Tank[1].x / 60), Trunc((Tank[1].y + Tank[1].Speed + 59) / 60)] = 1)
and (Map[Trunc((Tank[1].x + 59 )/ 60), Trunc((Tank[1].y + Tank[1].Speed + 59)/60)] = 1)
and (Tank[1].y + Tank[1].Speed <= 540) then Tank[1].y := Tank[1].y + Tank[1].Speed;
//RIGHT
if (Tank[1].Povorot = 2) and (Map[Trunc((Tank[1].x + Tank[1].Speed + 59) / 60), Trunc(Tank[1].y / 60)] = 1)
and (Map[Trunc((Tank[1].x + Tank[1].Speed + 59) / 60), Trunc((Tank[1].y + 59) / 60)] = 1)
and (Tank[1].x + Tank[1].Speed <= 540) then Tank[1].x := Tank[1].x + Tank[1].Speed;
//LEFT
if (Tank[1].Povorot = 4) then
if (Map[Trunc((Tank[1].x - Tank[1].Speed) / 60), Trunc(Tank[1].y / 60)] = 1)
and (Map[Trunc((Tank[1].x - Tank[1].Speed) / 60), Trunc((Tank[1].y + 59) / 60)] = 1)
and (Tank[1].x - Tank[1].Speed >= 0) then
// begin
Tank[1].x := Tank[1].x - Tank[1].Speed;
// Tank[1].
// end;
end;
Buf.Canvas.Draw(Tank[1].x, Tank[1].y, Tanki[1, Tank[1].Povorot, Tank[1].Anim]);
Form1.Canvas.Draw(0, 0, Buf);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 87 then
begin
qUp := True;
Tank[1].Go := True;
Tank[1].Povorot := 1;
end;
if Key = 65 then
begin
qLeft := True;
Tank[1].Go := True;
Tank[1].Povorot := 4;
end;
if Key = 83 then
begin
qDown := True;
Tank[1].Go := True;
Tank[1].Povorot := 3;
end;
if Key = 68 then
begin
qRight := True;
Tank[1].Go := True;
Tank[1].Povorot := 2;
end;
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = 87) then qUp := False;
if Key = 65 then qLeft := False;
if Key = 83 then qDown := False;
if Key = 68 then qRight := False;
if (qUp = False) and (qLeft = False) and (qRight = False) and (qDown = False) then Tank[1].Go := False;
end;
end.