Quote Originally Posted by PJP Dev
Instances:
[pascal]
var
Sprite1, Sprite2: TSprite;
...
[/pascal]
I think this is where it goes wrong. You should make array in TSpriteEngine and keep Sprite instances only there.

[pascal]TSpriteEngine = class
private
...
public
Sprite: array of TSprite;
Count: integer;
...
procedure AddSprite(newSprite: TSprite);
destructor Destroy; override;
...
end;

TPlayerSprite = class(TSprite)
.. // You can add something custom to player here
end;

procedure TSpriteEngine.AddSprite(newSprite: TSprite);
var i,j: integer; temp: TSprite;
begin
inc(Count);
setlength(Sprite,Count);
Sprite[Count-1]:=newSprite;

// Z-Sort (is possible to optimize this...)
for i:=0 to Count-2 do
for j:=i+1 to Count-1 do
if sprite[i].Z>Sprite[j].Z then begin // Change places
temp:=sprite[i];
sprite[i]:=sprite[j];
sprite[j]:=temp;
end;
end;

destructor TSpriteEngine.Destroy;
var i: integer;
begin
for i:=0 to Count-1 do
sprite[i].Free;
setlength(sprite,0);
inherited;
end;
[/pascal]

[pascal]var newSprite: TPlayerSprite;
begin
..
newSprite:=TPlayerSprite.Create;
SpriteEngine.Add(newSprite);
newSprite.Z:=10;
..
end;

procedure TSpriteEngine.DrawAll();
var i: integer;
begin
// Here all the instances of TSprite should be drawn...
for i:=0 to Count-1 do
Sprite[i].Draw;
end;[/pascal]

Hope it helps