Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Animation mit TImage! (https://www.delphipraxis.net/5437-animation-mit-timage.html)

Ag3nt 5. Jun 2003 23:52


Animation mit TImage!
 
Hallo,

ich hoffe Ihr könnt mir weiterhelfen:

Ich möchte gerne einen Tamagotchi für meine Freundin programmieren, da es interesannter ist wenn sich das Tamagotchi wie im echten leben halt bewegt komm ich auch zu meiner ersten Frage wie kann ich eine Animation OHNE DelphiX oder DirectX oder OpenGL oder oder oder erstellen ich möchte keinen Schnickschnack mit einbinden sonder nur mit den Standartkomponennten von Delphi 6 dieses Problem lösen nur fehlt mir im momment noch das nötige Wissen dazu bin absoluter Delphi Beginner.

Nunja vielleicht könnt ihr mir weiterhelfen bislang hab ich es so versucht:

Delphi-Quellcode:
 

procedure TForm1.FormCreate(Sender: TObject);
var temp: integer;
begin
 
  for temp:=0 to 3 then
  Image1.Picture.LoadFromFile('pics/1_'+FloatToStr(temp)+'.bmp');
 
end;
Das dumme ist ja das so auch gleichzeitig eine ENDLOSschleife realisiert wurde was wieder nicht meinen Wünschen entsprach. Ich würde gerne diese Animation von den drei Bilder im Hintergrund laufen lassen.
Was noch ein Problem ist wie ich es hinkriegen soll das die FOR Schleife nachdem er auf 3 gezählt hat nochmal von vorn beginnen soll mit GOTO könnte das klappen nur soll man ja nicht umbedingt auf diesen Befehl zurückgreifen so kenn ich das aufjedenfall auf C++ und C Zeiten :)

Mat 5. Jun 2003 23:58

wenn temp nen integer ist, wieso nimmst du dann nicht 'IntToStr'?

wenn du einfach
Delphi-Quellcode:
if temp = 3 then temp:= 0
vor das end schreibst, dann sollte es wieder von vorne los gehen

haettest aber wieder ne endlos-schleife


Mat

City Light 5. Jun 2003 23:59

Hallo also es gibt zwei arten wie du eine Animation in dein Programm ein bauen kannst mit Bitmaps oder GIF Bilder ,für gif Animationen brauchst du eine Komponete. Such mal hier im Forum ein bisschen da nach ...denn das Thema hatten wir glaub ich schon zu genüge

Mat 6. Jun 2003 00:06

meinen tip kannst du getrost vergessen, das klappt so nicht under delphi... :(


wenn er nach 3 wieder bei 0 anfangen soll, muesstest du noch ne schleife 'drumrum bauen'.
Delphi-Quellcode:
  while 1 = 1 do
  begin
    for temp:=0 to 3 Do
    begin
      ..
    end;
  end;

Mat

Ag3nt 6. Jun 2003 00:08

Zitat:

Zitat von City Light
Hallo also es gibt zwei arten wie du eine Animation in dein Programm ein bauen kannst mit Bitmaps oder GIF Bilder ,für gif Animationen brauchst du eine Komponete. Such mal hier im Forum ein bisschen da nach ...denn das Thema hatten wir glaub ich schon zu genüge

Jo stimmt aber ich wollte kein GIF nutzen :)

Zitat:

Zitat von Mat
wenn temp nen integer ist, wieso nimmst du dann nicht 'IntToStr'?

wenn du einfach
Source:

if temp = 3 then temp:= 0



vor das end schreibst, dann sollte es wieder von vorne los gehen

haettest aber wieder ne endlos-schleife
Mat

Also die Idee kam mir auch schon aber das Hauptproblem wie du sehen kannst ist diese "doofe" Schleife aus der man einfach nicht rauskommt. Bin grad so am Testen hab folgendes gewerkelt bislang:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var temp: integer;
begin



        for temp:=1 to 3 do begin
        Image1.Picture.LoadFromFile('pics/1_'+FloatToStr(temp)+'.bmp');
        end;
        if temp = 3 then
        temp:= 0;





end;
Nur wie gesagt ich will auch den Intervall vielleicht etwas drosselt weil der FOR Zähler ist so schnell habs mal getestet und die Zahl die grad "temp" ist in die Caption der Titelleiste gelegt oh meine Güte geht das schnell und so schnell wie sieht das den aus, und was ist das für eine Animation mit über 24 Bilder die ein Mensch als FLÜSSIG bezeichnen kann meine liegt min. bei 90-gar500 Bildern :(

Ag3nt 6. Jun 2003 00:11

Zitat:

Zitat von Mat
meinen tip kannst du getrost vergessen, das klappt so nicht under delphi... :(


wenn er nach 3 wieder bei 0 anfangen soll, muesstest du noch ne schleife 'drumrum bauen'.
Delphi-Quellcode:
  while 1 = 1 do
  begin
    for temp:=0 to 3 Do
    begin
      ..
    end;
  end;

Mat

Leider lößt auch diese Schleife nicht das Problem :( Theoretisch kannste da auch ne While und danach ne Repeat und until 0 = 3 usw schreiben aber bringt nichts :) :firejump:





Danke nochmals Mat und City Light für die Einträge.

Ag3nt 6. Jun 2003 00:33

THEMA CLOSEN :)
 
So ich habs doch noch hingekriegt :)

Hier der Code nochmals danke für eure Hilfe :)

Delphi-Quellcode:
var
  Form1: TForm1;
        Image1: TImage;
        temp: Integer;



implementation

{$R *.dfm}



procedure TForm1.Timer1Timer(Sender: TObject);
begin


        if temp = 1 then begin
        Image1.Picture.LoadFromFile('pics/1_'+IntToStr(temp)+'.bmp');
        Form1.Caption:=IntToStr(temp);
        temp:= 2;
        end
        else if temp = 2 then begin
        Image1.Picture.LoadFromFile('pics/1_'+IntToStr(temp)+'.bmp');
        Form1.Caption:=IntToStr(temp);
        temp:= 3;
        end
        else if temp = 3 then begin
        Image1.Picture.LoadFromFile('pics/1_'+IntToStr(temp)+'.bmp');
        Form1.Caption:=IntToStr(temp);
        temp:= 1;
        end;




end;

procedure TForm1.FormCreate(Sender: TObject);
begin
temp:= 1;
end;

end.

Mat 6. Jun 2003 00:35

hehe.. auf die idee mit nem timer bin ich auf grad gekommen :)

allerdings ist mein timer kuerzer :)

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin

  Image1.Picture.LoadFromFile('Image'+IntToStr(temp)+'.bmp');

  temp := temp + 1;

  if temp = 4 then
    temp := 0


end;


Mat

Christian Seehase 6. Jun 2003 00:41

Moin Zusammen,

und je nachdem, wie lang das Timer Interval eingestellt ist wäre es sinnvoll zu Beginn der OnTimer Routine den Timer ab- (enabled := false), und am Ende wieder einzuschalten, ansonsten kann es passieren, dass OnTimer erneut aufgerufen wird, wärend noch das Bild vom vorherigen Aufruf geladen wird.

LoadFromFile kann ja dauern (je nach Bildgrösse)

Dabei fällt mir ein:
Man könnte die Bilder, falls sie denn nicht zu gross sind, auch als Resource mit in das Programm einbinden. Das spart dann zusätzliche externe Dateien.

Ag3nt 6. Jun 2003 00:51

Zitat:

Zitat von Mat
hehe.. auf die idee mit nem timer bin ich auf grad gekommen :)

Hehe habs auch kürzer geschrieben mitlerweile wäre ja unsinnig viel Quellcode :) Thanks nochmals :) :hello:

Delphi-Quellcode:
       
procedure TForm1.Timer1Timer(Sender: TObject);
begin


        Image1.Picture.LoadFromFile('pics/1_'+IntToStr(temp)+'.bmp');
        inc(temp);
        if temp = 4 then temp := 1;



end;

procedure TForm1.FormCreate(Sender: TObject);
begin
temp:= 1;
end;
PS: Aber nun kommt ein neues Problem drauf zu hehe sorry :) Also wie krieg ich es hin das das Bild nicht FLAKERT ??? :freak:

Man muß doch die Images davor irgendwie precatchen sprich zwischenspeichern können ... hab mal was von Blitblt oder so ähnlich gelesen hab aber noch null Ahnung wie das geht :) :coder:

City Light 6. Jun 2003 00:55

Versuch mal im FormCreate mit
Delphi-Quellcode:
 
Form1.DoubleBuffered := True;

Ag3nt 6. Jun 2003 00:57

Zitat:

Zitat von City Light
Versuch mal im FormCreate mit
Delphi-Quellcode:
 
Form1.DoubleBuffered := True;

funzt leider nicht ruckelt noch immer :(

Mat 6. Jun 2003 00:57

mit dem flackern weiss ich nicht, aber evtl. hilft es, wenn du
die Bilder auf Variablen packst

Delphi-Quellcode:
    Image1 := TPicture.Create;
    Image1.LoadFromFile('image1.bmp');
    Image2 := TPicture.Create;
    Image2.LoadFromFile('image2.bmp');

Mat

City Light 6. Jun 2003 01:00

mehr weiß ich leider auch nicht wie man das abstellen könnte. Vielleicht wenn du mit den Timmer Inteval rumspielst...?

Ag3nt 6. Jun 2003 01:00

Zitat:

Zitat von Mat
mit dem flackern weiss ich nicht, aber evtl. hilft es, wenn du
die Bilder auf Variablen packst

Delphi-Quellcode:
    Image1 := TPicture.Create;
    Image1.LoadFromFile('image1.bmp');
    Image2 := TPicture.Create;
    Image2.LoadFromFile('image2.bmp');

Mat

meinste wirklich das klappt?

Ag3nt 6. Jun 2003 01:02

Also hier hab ich mal einen Code der einen Käfer FLACKERFREI über einen Hintergrund laufen läßt. Kannst du mir bei dem Code bischen Helfen?

Delphi-Quellcode:
procedure TForm1.Kaeferanimation;
var
    Temp: TBitmap;
    KaeferArray, NegativArray : array [1..4] of TBitmap;
    xmirror, ymirror : shortint;
    x, y, idx : integer;
begin
    xmirror := 1;
    ymirror := 1;
    y := 1;
    idx := 1;
    Temp   := TBitmap.create;
    Temp.Width := 42;
    Temp.Height := 42;
    For x := 1 to 4 do
    begin
      KaeferArray[x] := TBitmap.create;
      NegativArray[x] := TBitMap.create;
      KaeferArray[x].Width  := 40;
      NegativArray[x].width := 40;
      KaeferArray[x].Height := 40;
      NegativArray[x].Height := 40;
    end;
    x := 1;
     
    Kaeferarray[1].LoadFromFile('Bilder\ru.bmp');
    Kaeferarray[2].LoadFromFile('Bilder\ro.bmp');
    Kaeferarray[3].LoadFromFile('Bilder\lo.bmp');
    Kaeferarray[4].LoadFromFile('Bilder\lu.bmp');
    NegativArray[1].LoadFromFile('Bilder\nru.bmp');
    NegativArray[2].LoadFromFile('Bilder\nro.bmp');
    NegativArray[3].LoadFromFile('Bilder\nlo.bmp');
    NegativArray[4].LoadFromFile('Bilder\nlu.bmp');
 
    try

    While isrunning do begin
        sleep(Scrollbar1.Position);
        x := x + 1 * (xmirror);
        y := y + 1 * (ymirror);
       
        BitBlt(Temp.Canvas.Handle, 0, 0, 42, 42, bg.Canvas.Handle, x, y, SRCCOPY);
        BitBlt(Temp.Canvas.Handle, 1, 1, 40, 40, Negativarray[idx].Canvas.Handle, 0, 0, SRCAND);
        BitBlt(Temp.Canvas.Handle, 1, 1, 40, 40, Kaeferarray[idx].Canvas.Handle, 0, 0, SRCINVERT);
        BitBlt(Paintbox1.Canvas.Handle, x, y, 42, 42, Temp.Canvas.Handle, 0, 0, SRCCOPY);

        If (y + 40 > Paintbox1.Height) or (y <= PaintBox1.Top) then
        begin
          ymirror := ymirror * (-1);
          if (xmirror = 1) and (ymirror = 1) then
           idx := 1
          else
          if (xmirror = 1) and (ymirror = -1) then
           idx := 2
          else
          if (xmirror = -1) and (ymirror = -1) then
           idx := 3
          else
          if (xmirror = -1) and (ymirror = 1) then
           idx := 4
        end
        else

        If (x + 40 > PaintBox1.Width) or (x <= PaintBox1.Left) then
        begin
          xmirror := xmirror * (-1);
          if (xmirror = 1) and (ymirror = 1) then
           idx := 1
          else
          if (xmirror = 1) and (ymirror = -1) then
           idx := 2
          else
          if (xmirror = -1) and (ymirror = -1) then
           idx := 3
          else
          if (xmirror = -1) and (ymirror = 1) then
           idx := 4;
        end;
        Application.ProcessMessages;
    end;
   finally
     Temp.Free;
     For x := 1 to 4 do
     begin
       KaeferArray[x].Free;
       NegativArray[x].Free;
     end;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
Jpg:TjpegImage;
begin
 Bg := TBitmap.Create;
 Jpg := TJpegImage.Create;
 try
   jpg.LoadFromFile('Bilder\Background.jpg');
   Bg.Assign(Jpg);
 finally
   Jpg.Free;
 end;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 BitBlt(Paintbox1.Canvas.Handle, 0, 0, 360, 245, Bg.Canvas.Handle, 0, 0, SRCCOPY);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 isrunning := not isrunning;
 If isrunning then SpeedButton1.Caption := 'Stop'
  else
 SpeedButton1.Caption := 'Start';
 BitBlt(Paintbox1.Canvas.Handle, 0, 0, 360, 245, Bg.Canvas.Handle, 0, 0, SRCCOPY);
 Kaeferanimation;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Bg.free;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  isrunning := not CanClose;
end;

end.
Wie kann ich ihn bei meiner simplen Animation verwenden?

Mat 6. Jun 2003 01:03

k.A. :)


einfach mal ausprobieren..


Mat :D

Ag3nt 6. Jun 2003 01:03

Schau mal auf den letzten Post von mir MAT please :)

City Light 6. Jun 2003 01:08

Anderer Vorschlag nihm eine Gif Animation oder ein Bild! Und versuch mal dieses hier...fühge für Label einfach Image ein..
Delphi-Quellcode:
//Laufschrift von Rechts nach Links

var
  h : integer;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  with Label1 do
  begin
    Left := Left -1;
if Left =(0 -Left){oder 0- Width} then
    Left := h;
  end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  h := Form1.ClientWidth -32;
  Label1.Left := h;
end;

Ag3nt 6. Jun 2003 01:13

Bist du ein bischen Durcheinander?

Ich glaube das war der Falsche Quelltext den du hier oben gepostet hast *g* ist ja auch schon früh :) :coder:

Ag3nt 6. Jun 2003 01:25

So Problem auch gelöst!

Delphi ist ja EaSY :)
gefällt mir :)

Also hier der Code fürs rukelfreie :)

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin


        Image1.Picture.LoadFromFile ('pics/1_'+IntToStr(temp)+'.bmp');
        Paintbox1.Canvas.Draw(0,0,Image1.Picture.Graphic);
        inc(temp);
        if temp = 4 then temp := 1;



end;

procedure TForm1.FormCreate(Sender: TObject);
begin
temp:= 1;
end;

end.
Man muß einfach das Pic in einem Image laden und dann in eine Paintbox kopieren uns schon gehts :)

Ag3nt 6. Jun 2003 01:27

Wichtig dabei ist das dann das Image auf Visiab... auf False ist sonst sieht man es doppelt :)

Mat 6. Jun 2003 02:29

wenn dein problem geloest ist, brauch ich mich ja nich durch die kaefer-animation fummeln.. *puh* hab ja auch noch nich soviel delphi ahnung



Mat

Ag3nt 6. Jun 2003 10:33

Zitat:

Zitat von Mat
wenn dein problem geloest ist, brauch ich mich ja nich durch die kaefer-animation fummeln.. *puh* hab ja auch noch nich soviel delphi ahnung



Mat

ich erlich gesagt auch noch nicht :)

Danke nochmals :firejump:

Ag3nt 6. Jun 2003 10:35

Hier für Tamagotchi Fans ein JavaScript Tamagotchi sieht nur doof aus :)

http://www.engsoc.carleton.ca/~derid...i/newtama.html

Spoon 12. Jun 2003 13:27

Eine ganz andere variante:

Wenn du Flash beherrschst kannst du einfach kleine Flash animationen nehmen und in einer WebBrowser Kompo anzeigen... wie gesagt falls du flash beherrschst ;)

Die sind dann alle flackerfrei und leicht zu erstellen :bounce1:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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