Also einfach das ganze Gedöns nur mit Sprites, richtig ja?
...
Dein Beispiel ist doch schon ein guter Anfang dafür
Jetzt ersetzt du den simplen Timer einfach durch den DXTimer, setz das Intervall auf 20, dann trägst du eine Spriteklasse ein (was du mit deinem PlayerSprite wahrscheinlich eh schon hast @breakdancer).
Ich nehme jetzt auch mal an das du die SpriteEngine von DelphiX verwendest. Wenn dem so sein sollte, dann ist es recht simpel:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| {$R *.DFM}
type TSpielerSprite = class(TImageSprite) protected procedure DoMove(MoveCount: Integer); override; public constructor Create(AParent: TSprite); override; end;
constructor TPlayerSprite.Create(AParent: TSprite); begin inherited Create(AParent); Image := MainForm.ImageList.Items.Find('Player1.bmp'); Width := Image.Width; Height := Image.Height;
X := MapSize; Y := MapSize; Z := 2; end;
procedure TPlayerSprite.DoMove(MoveCount: Integer); begin inherited DoMove(MoveCount);
if isUp in Form1.DXInput.States then Y := Y - (250/1000)*MoveCount; if isLeft in Form1.DXInput.States then X := X - (250/1000)*MoveCount; if isRight in Form1.DXInput.States then X := X + (250/1000)*MoveCount; end; |
Und anstelle von dem angegebenen isUp verwendest du jetzt einfach den wirklich guten Quellcode von Umpani, animierst es noch schön und dann müsste es eigentlich klappen. In der DXImageList musst du vor dem Animieren aber noch die Größe jedes Sprites einstellen, so wie Umpani es gemacht hat, also die PatternHeight und PatternWidth. Die Animation spielst du aber am besten nicht komplett ab, sondern nur inwieweit man sich bewegt, danach setzt du den animation-start auf den aktuellen Frame des Sprites... und mach das looped aus!
Ach ja und stopf die beiden Richtungen in einen Sprite rein.
Tjoa, und ansonsten so: Mach das DXDraw.Flip nur am Ende des DXTimers einmal hin, das genügt vollkommen.
Greetz,
Knuddelbaer