Skip to content

Commit

Permalink
Доопрацювання
Browse files Browse the repository at this point in the history
  • Loading branch information
iso4free committed Apr 7, 2023
1 parent c51a154 commit 5fe826f
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 56 deletions.
45 changes: 29 additions & 16 deletions demo07/demo07.ppr
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,40 @@ type
TPlayer = class(TGOBaseObject)
private
FFrame: integer;
StartTime,
EndTime : Integer;
FDirectionX,
FDirectionY: ShortInt; //-1 рухаємось вліво, +1 рухаємось вправо
constructor Create(x, y, Width, Height: Integer; Id: String);
published
property Frame : integer read FFrame default 0;
procedure Update; override;
procedure Clear; override;
end;
var
i: Integer;

{ TPlayer }

constructor TPlayer.Create(x, y, Width, Height: Integer; Id: String);
begin
FDirectionX:=5;
FDirectiony:=5;
inherited Create(x, y, Width, Height, Id);
end;

procedure TPlayer.Update;
begin
//тут буде прораховуватись ігрова логіка
//спочатку змінюємо координати
if FX>(GoEngine.Width-FW) then FDirectionX:=-5
else if FX <=0 then FDirectionX:=5;
if FY>=(GoEngine.Height-FH) then FDirectionY:=-5
else if FY <=0 then FDirectionY:=5;
FX:=FX+FDirectionX;
FY:=FY+FDirectionY;
if (FDirectionx>0) then
if (FDirectionY>0) then FFlip:=GO_FLIP_NONE
else FFlip:=GO_FLIP_V
else if (FDirectionY>0) then FFlip:=GO_FLIP_D
else FFlip:=GO_FLIP_H;
if FCol >=7 then begin
FCol :=0;
Inc(FRow);
Expand All @@ -37,26 +58,18 @@ begin
end else Inc(FCol);
end;

procedure TPlayer.Clear;
begin
inherited Clear;
end;


var Player : TPlayer;
Enemy : TPlayer;

begin
Randomize;
if GoEngine<>nil then begin
GoEngine.Caption:='демо 07';
GoEngine.Width:=640;
GoEngine.Height:=480;
GoEngine.TextureManager.Load('assets'+DirectorySeparator+'tux.png','Tux');
GoEngine.TextureManager.Load('assets'+DirectorySeparator+'tuxfire.png','Tux Fire');
Player:=TPlayer.Create(50,50,32,32,'Tux');
Enemy:=TPlayer.Create(150,150,32,32,'Tux Fire');
GoEngine.GameObjects.Add(Player);
GoEngine.GameObjects.Add(Enemy);
for i :=0 to 4000 do begin
GoEngine.GameObjects.Add(TPlayer.Create(Random(GoEngine.Width),Random(GoEngine.Height),32,32,'Tux'));
GoEngine.GameObjects.Add(TPlayer.Create(Random(GoEngine.Width),Random(GoEngine.Height),32,32,'Tux Fire'));
end;
GoEngine.Run;
end;
end.
108 changes: 68 additions & 40 deletions demo07/ugoengine.pas
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ interface
const
GO_MAX_FPS = 120;

//константи для віддзеркалення зображень
GO_FLIP_NONE = SDL_FLIP_NONE;
GO_FLIP_H = SDL_FLIP_HORIZONTAL;
GO_FLIP_V = SDL_FLIP_VERTICAL;
GO_FLIP_D = SDL_FLIP_HORIZONTAL OR SDL_FLIP_VERTICAL;

type

{ TSDLTextureWrapper }
Expand Down Expand Up @@ -37,7 +43,26 @@ TGOTextureManager = class
procedure DrawFrame(aID: String; x, y, w, h, r, c: Integer; Flip: Integer = SDL_FLIP_NONE); //намалювати кадр зображення в потрібній позиції
end;

PGOBaseObject = ^TGOBaseObject;
{ TGOObjLoader }

TGOObjLoader = class
protected
FX, FY: Integer; //позиція об'єкта
FW, FH: Integer; //розміри об'єкта
FCol, FRow: Integer; //стовбець і рядок фрагмента зображення
FFlip: Integer; //ознака віддзеркалення для малювання
FId: String;
public
constructor Create(x, y, Width, Height: Integer; Id: String);
property X : Integer read FX write FX default 0;
property Y : Integer read FY write FY default 0;
property Width : Integer read FW write FW default 0;
property Height : Integer read FH write FH default 0;
property Column : Integer read FCol write FCol default 1;
property Row : Integer read FRow write FRow default 1;
property Id : String read FId write FId;
property Flip : Integer read FFlip write FFlip default GO_FLIP_NONE;
end;

{ TGOBaseObject }

Expand All @@ -46,16 +71,16 @@ TGOBaseObject = class
FX, FY: Integer; //позиція об'єкта
FW, FH: Integer; //розміри об'єкта
FCol, FRow: Integer; //стовбець і рядок фрагмента зображення
FFlip: Integer; //ознака віддзеркалення для малювання
FId: String;
public
constructor Create(x, y, Width, Height: Integer; Id: String);
destructor Destroy; override;
constructor Create(const ObjLoader : TGOObjLoader);
procedure Draw();
procedure Update(); virtual;
procedure Clear(); virtual;
procedure Update(); virtual; abstract;
procedure Clear(); virtual; abstract;
end;

TGOObjectsVector = specialize TFPGObjectList<TGOBaseObject>;
TGOObjectsList = specialize TFPGObjectList<TGOBaseObject>;

{ TGOEngine }

Expand All @@ -67,7 +92,7 @@ TGOEngine = class

FHeight: Integer;
FTextureManager: TGOTextureManager;
FGameObjects: TGOObjectsVector;
FGameObjects: TGOObjectsList;
FWidth: Integer;
FWindow: PSDL_Window;
FRenderer: PSDL_Renderer;
Expand Down Expand Up @@ -113,7 +138,7 @@ TGOEngine = class
property FPSLimit: Integer read FFPSLimit write SetFPSLimit default 60; //обмеження частоти кадрів

property TextureManager: TGOTextureManager read FTextureManager; //менеджер текстур
property GameObjects: TGOObjectsVector read FGameObjects; //список об'єктів
property GameObjects: TGOObjectsList read FGameObjects; //список об'єктів

end;

Expand All @@ -128,6 +153,20 @@ implementation
var
CountInstances: Byte;

{ TGOObjLoader }

constructor TGOObjLoader.Create(x, y, Width, Height: Integer; Id: String);
begin
FX := x;
FY := y;
FW := Width;
FH := Height;
FId := Id;
FRow := 1;
FCol := 1;
FFlip := SDL_FLIP_NONE;
end;

{ TSDLTextureWrapper }

constructor TSDLTextureWrapper.Create(aTexture: PSDL_Texture);
Expand All @@ -143,34 +182,23 @@ destructor TSDLTextureWrapper.Destroy;

{ TGOBaseObject }

constructor TGOBaseObject.Create(x, y, Width, Height: Integer; Id: String);
constructor TGOBaseObject.Create(const ObjLoader: TGOObjLoader);
begin
FX := x;
FY := y;
with ObjLoader do begin
FX := X;
FY := Y;
FW := Width;
FH := Height;
FId := Id;
FRow := 1;
FCol := 1;
end;

destructor TGOBaseObject.Destroy;
begin
inherited Destroy;
FRow := Row;
FCol := Column;
FFlip := Flip;
end;
end;

procedure TGOBaseObject.Draw;
begin
GoEngine.TextureManager.DrawFrame(FId, Fx, Fy, Fw, Fh, FRow, FCol);
end;

procedure TGOBaseObject.Update;
begin
end;

procedure TGOBaseObject.Clear;
begin

GoEngine.TextureManager.DrawFrame(FId, Fx, Fy, Fw, Fh, FRow, FCol, FFlip);
end;

{ TGOBaseObject }
Expand Down Expand Up @@ -259,8 +287,7 @@ constructor TGOEngine.Create(Afile: Tfilename; Asection: String);
FWindowFlags := SDL_WINDOW_SHOWN;
if Ffullscreen then FWindowFlags := FWindowFlags or SDL_WINDOW_FULLSCREEN;
//успішна ініціалізація - створюємо вікно
FWindow := SDL_CreateWindow('', SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, FWidth,
FHeight, FWindowFlags);
FWindow := SDL_CreateWindow('', SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, FWidth, FHeight, FWindowFlags);
//якщо вікно створене, створюємо візуалізатор
if FWindow <> nil then
begin
Expand All @@ -276,7 +303,7 @@ constructor TGOEngine.Create(Afile: Tfilename; Asection: String);
else
begin
FTextureManager := TGOTextureManager.Create;
FGameObjects := TGOObjectsVector.Create;
FGameObjects := TGOObjectsList.Create;
end;
//виділення пам'яті для структури обробки подій
New(FEvent);
Expand All @@ -293,7 +320,6 @@ constructor TGOEngine.Create(Afile: Tfilename; Asection: String);

procedure TGOEngine.SetCaption(AValue: String);
begin
// if FCaption=AValue then Exit;
FCaption := AValue;
SDL_SetWindowTitle(FWindow, PChar(Utf8string(FCaption)));
end;
Expand Down Expand Up @@ -425,27 +451,29 @@ procedure TGOEngine.DoEvents;

procedure TGOEngine.Update;
var
i: Integer;
gobj: TGOBaseObject;
begin
for i := 0 to FGameObjects.Count - 1 do
//якщо список об'єктів порожній, виходимо з метода
if FGameObjects.Count = 0 then Exit;
for gobj in FGameObjects do
begin
FGameObjects.Items[i].Update();
//SDL_Delay(100);
gobj.Update();
end;

SDL_Delay(100);
end;

procedure TGOEngine.Draw;
var
i: Integer;
gobj: TGOBaseObject;
begin
//встановимо колір вікна в голубий
SDL_SetRenderDrawColor(FRenderer, 0, 128, 255, 255);
//очистити вікно
SDL_RenderClear(FRenderer);

//вивести потрібні об'єкти
for i := 0 to FGameObjects.Count - 1 do FGameObjects.Items[i].Draw();
//вивести потрібні об'єкти, якщо список не порожній
if FGameObjects.Count <> 0 then
for gobj in FGameObjects do gobj.Draw();

//показати вікно на екран
SDL_RenderPresent(FRenderer);
Expand Down

0 comments on commit 5fe826f

Please sign in to comment.