necessarias ate conseguir compilar.Com estas alteracoes, preparamos o terreno para criar uma classe para nossos sprites.Vamos definir um sprite como sendo uma imagem que contem todos os frames de uma animacao perfeitamente alinhadas em sequencia de exibicao, formando uma grade regular indexada em 0, exatamente como um array. Observe a imagem abaixo e veja como esperamos que os quadros estejam distribuidos pela imagem.No exemplo, temos uma imagem de 160px de largura por uma altura H qualquer. Nela existem 6 frames de 32px cada, ja que 192/32 = 6, distribuidos em uma unica linha. Os numeros no lado superior esquerdo sao os indices dos frames dentroExemplo de sprite sheet contendo 6 frames alinhados em uma unica linhaEm nossa implementacao, a imagem estara armazenada em um TTexture e cada frame sera representado por um retangulo armazenado em um SDL_Rect. Alem disto, cada frame devera saber quanto tempo ficara visivel durante a execucao da animacao a qual pertence.TSpriteFrame = classpublic Rect : TSDL_Rect; TimeSpan : Cardinal; //em milisegundosend;TSpriteAnimationType = ( NoLoop, Circular);TSprite = classstrict privateconst DEFAULT_FRAME_DELAY = 500; //em milisegundosvar fTexture : TTexture; fFrames : array of TSpriteFrame; fFrameIndex : integer; fAnimationType : TSpriteAnimationType; fTimeSinceIndexChange : real; function GetCurrentFrame: TSpriteFrame; function GetFrameIndex: integer; function GetFrames(index: integer): TSpriteFrame; procedure FreeFrames; procedure AdvanceFrames(count: integer);public constructor Create; destructor Destroy; override; procedure InitFrames( const pRows, pColumns : integer ); procedure Update(const deltaTime : real); property Texture: TTexture read fTexture write fTexture; property FrameIndex: integer read GetFrameIndex; property Frames[index: integer] : TSpriteFrame read GetFrames; property CurrentFrame : TSpriteFrame read GetCurrentFrame; property AnimationType : TSpriteAnimationType read fAnimationType write fAnimationType;end;(...){ TSprite Implementation }function TSprite.GetFrames(index: integer): TSpriteFrame;begin if ( index > Length(fFrames)-1 ) or ( index <; 0 ) then raise IndexOutOfBoundsException.Create(IntToStr(index)); result := fFrames[ index ];end;function TSprite.GetFrameIndex: integer;begin result := fFrameIndex;end;function TSprite.GetCurrentFrame: TSpriteFrame;begin if ( (fFrameIndex < 0) or (fFrameIndex > High(fFrames)) ) then raise IndexOutOfBoundsException.Create('GetCurrentFrame'); result := fFrames[fFrameIndex];end;procedure TSprite.FreeFrames;var i: integer;begin for i:= 0 to Length(fFrames)-1 do fFrames[i].Free; SetLength(fFrames, 0);end;constructor TSprite.Create;begin fTexture := TTexture.Create; fFrameIndex := 0; fAnimationType := TSpriteAnimationType.Circular; fTimeSinceIndexChange := 0.0;end;destructor TSprite.Destroy;begin FreeFrames; fTexture.Free;end;// inicializa os frames da animacao, quebrando a textura em um padrao// de pRows x pColumns (linhas x colunas)procedure TSprite.InitFrames(const pRows, pColumns: integer);var lRow, lColumn, frameW, frameH, spriteCount, i : integer;begin spriteCount := pRows * pColumns; frameW := fTexture.W div pColumns; frameH := fTexture.H div pRows; FreeFrames; SetLength(fFrames, spriteCount); i:= 0; for lRow := 0 to pRows-1 do for lColumn :=0 to pColumns-1 do begin fFrames[ i ] := TSpriteFrame.Create; fFrames[ i ].TimeSpan := DEFAULT_FRAME_DELAY; fFrames[ i ].Rect.w := frameW; fFrames[ i ].Rect.h := frameH; fFrames[ i ].Rect.x := lColumn * frameW; fFrames[ i ].Rect.y := lRow * frameH; inc( i ); end; fFrameIndex := 0; inherited;end;//atualiza o estado da animacao de acordo com a variacao de tempo//desde a ultima chamadaprocedure TSprite.Update(const deltaTime: real);var frameCount : UInt32; elapsedMS : UInt32;begin elapsedMS := trunc(( fTimeSinceIndexChange + deltaTime ) * MSecsPerSec ); if ( elapsedMS >= fFrames[ fFrameIndex ].TimeSpan ) then begin frameCount := elapsedMS div fFrames[ fFrameIndex ].TimeSpan; AdvanceFrames( frameCount ); fTimeSinceIndexChange := 0; end else fTimeSinceIndexChange := fTimeSinceIndexChange + deltaTime;end;procedure TSprite.AdvanceFrames(count: integer);var framesLength : integer;begin framesLength