Pascal游戏开发入门(三):游戏对象管理

Pascal游戏开发入门(三):游戏对象管理

游戏中有很多类对象,例如:角色,敌人,NPC,陷阱,子弹,门等等.跟踪并处理它们之间的交互是一个有难度的事情。为了尽可能简化并使之容易维护,本节将尝试使用OOP(抽象继承多态等)来管理组织游戏对象

抽象与继承

首先定义一个公共的基类TGameObject

type TGameObject = class
protected
    x, y: integer;
    w, h: integer;
    currentFrame, currentRow: integer;
    textureId: string;
public
	procedure Load(x,y,w,h:integer;textureId:string);
	procedure Draw(pr:PSDL_Renderer);
	procedure Update();
	procedure Clean;
end;

然后游戏中出现的对象都可以继承TGameObject
根据需要可以覆盖对应的方法

TPlayer = class(TGameObject)
end;

TEnemy = class(TGameObject)

end;

多态

接下来在Game中定义对象的列表,由于定义的是TGameObjectList,利用继承的特性就可以存储所有子类对象

type Game = class
private
objects:TGameObjectList;
end;

利用OOP的多态 修改Update,Render,这样就实现职责分离(每个对象负责自己的Draw,Update,Clean)

procedure TGame.Update();
var
  i: integer;
begin
  for i := 0 to objects.Count - 1 do
  begin
    objects[i].Update();
  end;
end; 


procedure TGame.Render();
var
  i: integer;
begin
  SDL_RenderClear(pr);
  for i := 0 to objects.Count - 1 do
  begin
    objects[i].Draw(pr);
  end;

  SDL_RenderPresent(pr);
end;     

对象的初始化也需要对应修改一下

procedure TGame.Init(title: string; x, y, h, w, flags: integer);     
  b := (TTextureManager.Instance()).Load('assets/platform/arc2.png', 'animate', pr);

  go := TGameObject.Create;
  go.Load(0, 0, 40, 40, 'animate');
  objects.Add(go);

  player := TPlayer.Create;
  player.Load(50, 50, 40, 40, 'animate');
  objects.Add(player); 

end;

完整代码 https://gitee.com/tom-cat/sdl-hello/tree/v3.0/

你可能感兴趣的:(pascal,游戏,游戏开发,pascal,sdl,lazarus)