Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Brauche Hilfe bei einer Gehanimation! (https://www.delphipraxis.net/160451-brauche-hilfe-bei-einer-gehanimation.html)

raysto 13. Mai 2011 15:09

Brauche Hilfe bei einer Gehanimation!
 
Alsooo, ich sitze da jetzt schon länger dran und ich komm mir langsam echt dumm vor xD Und zwar möchte ich ein Jump'n Run machen, aber das Problem ist, dass ich die Gehanimation nicht hinkrieg :x Es soll einmal alle Bilder abspielen, wenn man sich bewegt und zwar in einer Geschwindigkeit bei der man alle Bilder sehen kann. Und das soll sich so lange abspielen, so lange man rechtsbzw. links drückt. Aber Ich krieg das irgendwie einfach nicht hin -.- Habs auch schon mit nem Timer versucht, bin dann aber durcheinander gekommen -.-
Danke im vorraus :)

rainerg 13. Mai 2011 15:19

AW: Brauche Hilfe bei einer Gehanimation!
 
Wo liegt denn genau das Problem?
Dsa was Du schilderst ist recht allgemein beschrieben.

Hast Du Fehler?
Läuft die Animation falsch ab?
zu schnell/zu langsam?

Was genau klappt nicht?

raysto 13. Mai 2011 15:39

AW: Brauche Hilfe bei einer Gehanimation!
 
Wenn ich laufe, wechselt er sofort zum letzten bild (es spielt alle bilder zu schnell ab und deswegen sieht man nur das letze) anstatt alle bilder einzelnt durchzugehen. Und bei dem Bild bleibt er dann die ganze Zeit.

himitsu 13. Mai 2011 15:43

AW: Brauche Hilfe bei einer Gehanimation!
 
Ohne daß wir wissen wie du was machst, können wir dir nicht sagen was du falsch machst :zwinker:

s.h.a.r.k 13. Mai 2011 15:45

AW: Brauche Hilfe bei einer Gehanimation!
 
Zeig mal den Code, den du nutzt. Und die Geschwindigkeit des Timers wäre auch interessant zu wissen :)

nuclearping 13. Mai 2011 18:25

AW: Brauche Hilfe bei einer Gehanimation!
 
Würde dir empfehlen, mal die Andorra 2D Engine anzuschauen. Findest du hier im Forum auch massig Beiträge dazu, auch Hilfen, Beispiele, Demos, ... Und da ist auch ein Demo dabei, was genau dein Problem anspricht.

rainerg 13. Mai 2011 19:45

AW: Brauche Hilfe bei einer Gehanimation!
 
Aus wieviel Bilder besteht denn eine Bewegungssequenz?
Du musst ja für jeden einzelnen Schritt deines Männchens das Bewegungsbild ändern. Die Sequenz also schrittweise durchlaufen lassen und dann wieder von vorn beginnen.
So wie Du das erläuterst, klingt das fast wie ein animiertes GIF was du nutzt.

Sir Rufo 13. Mai 2011 22:21

AW: Brauche Hilfe bei einer Gehanimation!
 
Zitat:

Zitat von rainerg (Beitrag 1100688)
Aus wieviel Bilder besteht denn eine Bewegungssequenz?
Du musst ja für jeden einzelnen Schritt deines Männchens das Bewegungsbild ändern. Die Sequenz also schrittweise durchlaufen lassen und dann wieder von vorn beginnen.
So wie Du das erläuterst, klingt das fast wie ein animiertes GIF was du nutzt.

Ich denke mal das macht er wohl auch schon und deswegen funktioniert es nicht
Pseudocode
Code:
Routine Animieren
  Für jedes Bild
    Zeige Bild
Während der Routine wird aber die Anzeige nicht aktualisiert, darum sieht es so aus, als ob die Figur nicht animiert wird ;)

Eine Möglichkeit wäre die Animation über einen Timer gesteuert zu realisieren.
Code:
Routine AnimationsTimer
  Figur.EinenSchrittWeiter
  Figur.MaleBildZumSchritt
Wenn es vernünftig werden soll führt allerdings der Weg zu Andorra :)

raysto 14. Mai 2011 22:14

AW: Brauche Hilfe bei einer Gehanimation!
 
Also bisher sieht mein Code so aus (nicht wirklich viel :lol:)
Delphi-Quellcode:
var
   movex,movey : integer;

procedure TForm1.FormCreate(Sender: TObject); //Einstellungen und Koordinaten
begin
  form1.DoubleBuffered :=true;
  movex := 1;
  movey := 225;
end;

procedure TForm1.Gehen(Sender: TObject); //Gehen
begin
  Timer2.Enabled := true
end;



procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation1.ico');
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation2.ico');
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation3.ico');
end;

procedure Char;
begin
  Form1.Player.left := moveX;
  Form1.Player.top := moveY;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  I: Integer;
begin
  if (key = 40) then moveY := moveY+5;// runter
  if (key = 38) then movey := moveY-5;// hoch
  if (key = 37) then movex := moveX-5;// links
  if (key = 39) then movex := moveX+5;// rechts
  if (key = 39) then Timer2.Enabled := true;

  Char;

 end;


end.
Und das mit Andorra versteh ich nicht. Wie benutze ich Andorra?

nuclearping 15. Mai 2011 10:39

AW: Brauche Hilfe bei einer Gehanimation!
 
Zitat:

Code:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation1.ico');
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation2.ico');
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation3.ico');
end;

Da brauchst du dich nicht wundern, dass er immer das letzte Bild der Animation anzeigt, wenn der Timer-Event innerhalb von ein paar Millisekunden (wenn überhaupt soviel) von oben nach unten durchrauscht ... ;)

Versuchs mal so:
Delphi-Quellcode:
var
   movex,movey,
   AniIndex : integer;

procedure TForm1.FormCreate(Sender: TObject); //Einstellungen und Koordinaten
begin
  form1.DoubleBuffered :=true;
  movex := 1;
  movey := 225;

  AniIndex := 0;
  Timer2.Interval := 125;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Timer2.Enabled := FALSE;
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation' + IntToStr(AniIndex + 1) + '.ico');

  Inc(AniIndex);
  if AniIndex > 2 then
    AniIndex := 0;
  Timer2.Enabled := TRUE;
end;
Zitat:

Und das mit Andorra versteh ich nicht. Wie benutze ich Andorra?
Schau dir mal die Tutorials an: http://www.delphipraxis.net/dp_searc...rums_string=36

himitsu 15. Mai 2011 11:45

AW: Brauche Hilfe bei einer Gehanimation!
 
Wenn, dann doch eher so?

Delphi-Quellcode:
// als Feld in die Klasse aufnehmen:
// GehAnimation: Integer;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  //Inc(GehAnimation);
  //if GehAnimation >= 3{Anzahl} then GehAnimation := 0;
  GehAnimation := (GehAnimation + 1) mod 3{Anzahl};
  case GehAnimation of
    0: Player.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Graphiken\Charanimation1.ico');
    1: Player.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Graphiken\Charanimation2.ico');
    2: Player.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Graphiken\Charanimation3.ico');
  end;
end;
Delphi-Quellcode:
// als Feld in die Klasse aufnehmen:
// GehAnimation: Integer;
// Verzeichnis: String;

// beim Programmstart initialisieren (z.B. in OnCreate):
// Verzeichnis := ExtractFileDir(Application.ExeName);

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if Gehen then begin
    GehAnimation := (GehAnimation + 1) mod 3{Anzahl};
    Player.Picture.LoadFromFile(Format('%sGraphiken\Charanimation%d.ico', [Verzeichnis, GehAnimation + 1]));
  end else begin
    if GehAnimation >= 0 then // braucht ja nur einmal geladen zu werden
      Player.Picture.LoadFromFile(Verzeichnis + 'Graphiken\CharanimationStehen.ico');
    GehAnimation := -1;
  end;
end;
Und ich empfehle dir dringens die relativen Pfade abzuschaffen.
Die Gründe werden häufig genug hier im Forum genannt (siehe SuFu).

PS: Statt LoadFromFile alle Bilder nur einmal, beim Programmstart laden und dann via Picture.Assign zuweisen.
Also z.B. je Bild ein TPicture in einer Liste (TObjektList) oder notfalls mehrere "unsichtbare" TPicture auf der Form ablegen.

rainerg 15. Mai 2011 11:51

AW: Brauche Hilfe bei einer Gehanimation!
 
Code:
.LoadFromfile
heißt doch, dass die Animation (oder besser der Animationsschritt) immer wieder von Platte geladen wird. Wäre es nicht besser, die Animationssequenz zu laden und aus dem Speicher heraus auszugeben?

himitsu 15. Mai 2011 12:10

AW: Brauche Hilfe bei einer Gehanimation!
 
Ja, wäre besser.

Nja, zum Glück läd Windows die Dateien erstmal in den Windows-File-Cache und läd sie so nicht wirklich immer wieder von der Platte (solange noch genug Platz im Cache ist).
Aber zusätzlich zum Laden wird ja noch viel mehr gemacht ... quasi wird das bild ja auch noch geparst und die Dateiinhalte entsprechend ausgewertet.

Sir Rufo 15. Mai 2011 12:13

AW: Brauche Hilfe bei einer Gehanimation!
 
Zitat:

Zitat von rainerg (Beitrag 1100902)
Code:
.LoadFromfile
heißt doch, dass die Animation (oder besser der Animationsschritt) immer wieder von Platte geladen wird. Wäre es nicht besser, die Animationssequenz zu laden und aus dem Speicher heraus auszugeben?

Jein, Windows wird die Dateien bei der häufigen Benutzung im Cache haben und dann ist das kaum merkbar (vor allem bei dieser Art der Umsetzung ;) )
Grundsätzlich würde ich solche Sequenzen aber auch in eine Klasse laden und dann von der FigurKlasse die SequenzKlasse ansprechen und das passende Bild zurückgeliefert bekommen.
Dann wird das viel mehr OOP und vor allem flexibler.

raysto 15. Mai 2011 20:23

AW: Brauche Hilfe bei einer Gehanimation!
 
Zitat:

Zitat von nuclearping (Beitrag 1100887)
Zitat:

Code:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation1.ico');
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation2.ico');
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation3.ico');
end;

Da brauchst du dich nicht wundern, dass er immer das letzte Bild der Animation anzeigt, wenn der Timer-Event innerhalb von ein paar Millisekunden (wenn überhaupt soviel) von oben nach unten durchrauscht ... ;)

Versuchs mal so:
Delphi-Quellcode:
var
   movex,movey,
   AniIndex : integer;

procedure TForm1.FormCreate(Sender: TObject); //Einstellungen und Koordinaten
begin
  form1.DoubleBuffered :=true;
  movex := 1;
  movey := 225;

  AniIndex := 0;
  Timer2.Interval := 125;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Timer2.Enabled := FALSE;
  Player.Picture.LoadFromFile('.\Graphiken\Charanimation' + IntToStr(AniIndex + 1) + '.ico');

  Inc(AniIndex);
  if AniIndex > 2 then
    AniIndex := 0;
  Timer2.Enabled := TRUE;
end;
Zitat:

Und das mit Andorra versteh ich nicht. Wie benutze ich Andorra?
Schau dir mal die Tutorials an: http://www.delphipraxis.net/dp_searc...rums_string=36

Danke für die ganze Hilfe, aber da ich noch nicht so fortgeschritten bin, hbae ich mir einfach mal das oben genommen :D es läuft auch perfekt, ausser dass mein männchen weiterläuft (also die animation) wenn ich nichts mehr drücke xD Kann ich das noch irgendwie beheben?

Sir Rufo 15. Mai 2011 21:10

AW: Brauche Hilfe bei einer Gehanimation!
 
Was machst, damit die Figur geht, und vor allem wann?

Mache das Gegenteil zum Stehenbleiben ;)

himitsu 15. Mai 2011 22:46

AW: Brauche Hilfe bei einer Gehanimation!
 
Wobei ich das stehen-gehen-Problem in einem meiner Beispiele auch behandelt hatte. :roll:
Und das mit den bösen relativen Pfaden war och nur ein gutgemeinter Rat.

nuclearping 16. Mai 2011 08:43

AW: Brauche Hilfe bei einer Gehanimation!
 
Zitat:

Zitat von raysto (Beitrag 1100990)
Danke für die ganze Hilfe, aber da ich noch nicht so fortgeschritten bin, hbae ich mir einfach mal das oben genommen :D es läuft auch perfekt, ausser dass mein männchen weiterläuft (also die animation) wenn ich nichts mehr drücke xD Kann ich das noch irgendwie beheben?

Den Timer2.Enabled immer auf FALSE lassen. Ausser:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    40:
      moveY := moveY+5;// runter
    38:
      movey := moveY-5;// hoch
    37:
      movex := moveX-5;// links
    39:
      movex := moveX+5;// rechts
  end;

  if (Key >= 37) and (Key <= 40) then
    Timer2.Enabled := TRUE;

  Char;
end;
Dazu machst du noch ein OnKeyUp-Event:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key >= 37) and (Key <= 40) then
    begin
      Timer2.Enabled := FALSE;
      Player.Picture.LoadFromFile('.\Graphiken\Charanimation0.ico');
    end;
end;
Nun wird die Gehanimation nur solange ausgeführt, wie eine der Richtungstasten gedrückt wird. Andernfalls wird der Timer2 deaktiviert und die Charanimation0.ico geladen.

rollstuhlfahrer 16. Mai 2011 10:13

AW: Brauche Hilfe bei einer Gehanimation!
 
Noch ein Wort von mir: Die Werte 37 bis 40 kannst du durch dienentsprechenden Konstanten VK_DOWN, VK_UP, VK_RIGHT und VK_LEFT ersetzen. Somit wäre sogar der CASE-Zweig lesbar (auch ohne die Kommentare).

Bernhrd

raysto 17. Mai 2011 14:51

AW: Brauche Hilfe bei einer Gehanimation!
 
Nur noch eine Frage: was heißt "Inc" im code den ich bekommen habe? Was macht das? Wenn ichd as nicht weiß, ist es ein wenig scheiße wenn ich meinem Lehrer dann gegenüberstehe und kein wort rausbringe :-D

DeddyH 17. Mai 2011 14:53

AW: Brauche Hilfe bei einer Gehanimation!
 
Ist Deine Hilfe kaputt? Delphi-Referenz durchsuchenSystem.Inc

raysto 17. Mai 2011 15:05

AW: Brauche Hilfe bei einer Gehanimation!
 
Sorry ich vergess es immer wieder :/

nuclearping 17. Mai 2011 19:58

AW: Brauche Hilfe bei einer Gehanimation!
 
Inc = Increment = Erhöhen.

Dafür gibts aber auch die Hilfe. Cursor in das Wort setzen und F1 drücken. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz