Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Mehrere Bilder gleichzeitig bewegen (https://www.delphipraxis.net/42692-mehrere-bilder-gleichzeitig-bewegen.html)

hannibal007 22. Mär 2005 17:03


Mehrere Bilder gleichzeitig bewegen
 
Mein Code funzt leider nur für ein Bild, ich will aber dass mehrere Bilder gleichzeitig nach unten laufen. Das zweite Bild soll ca.1 sekunde nach dem ersten starten. Ich habs schon mit arrays und for Scheifen versucht, jedoch vergeblich. Was muss ich ändern damit auch mehrere Bilder gleichzeitig nach unten laufen können?

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key = vk_left then
  begin
    img1.Left:= img1.left -50; //Korb(img1) wird nach links verschoben.
    if img1.left < 0  then
      form1.img1.Left := 0;
  end;
  if key = vk_right then
  begin
    img1.Left:= img1.left +50; //Korb(img1) wird nach rechts verschoben.
    if img1.Left + img1.Width > form1.Width then
      img1.Left:= form1.Width - img1.Width;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  btn1.Visible := false;
  tm2.Enabled := true;
end;

procedure TForm1.tm1Timer(Sender: TObject);

begin
  bier1.top := bier1.Top + 20; //Geschwindigkeit des Bildes das nach unten läuft.
  if (bier1.Top + bier1.Height >= img1.Top) AND (bier1.Left <= img1.Left + img1.Width) AND (bier1.Left + bier1.Width >= img1.Left) then
  begin
    bier1.Visible := false;
    lblres.Caption := inttostr(strtoint(lblres.Caption)+50); //Wenn mein Korb(img1) eine herunterfallende Bierflasche(bier1) auffängt bekommt man 50 Punkte.
    tm2.Enabled := true;
    tm1.Enabled := false;
  end;
  if bier1.Top > form1.ClientHeight then
  begin
    bier1.Visible := false;
    tm2.Enabled := true;
    tm1.Enabled := false;
  end;
end;

procedure TForm1.tm2Timer(Sender: TObject);

begin
  bier1 := TImage.Create(Self);
  bier1.Parent:= Self;
  bier1.Picture.LoadFromFile('flasche'+inttostr(random(3)+1)+'.bmp');         //Ich habe 3 verschiedene Bilder(flasche1, flasche2, flasche3) Jedesmal wird durch random entschieden welches Bild genommen wird.
  bier1.AutoSize:=True;
  bier1.Left:= random(form1.ClientWidth-bier1.Width);
  bier1.Top:= -(bier1.Height);
  tm1.Enabled := true;
  tm2.Enabled := false;
end;

end.

Jarmen_Kell 22. Mär 2005 18:19

Re: Mehrere Bilder gleichzeitig bewegen
 
Bei dir kann immer erst ein neues "Bier" fallen, wenn das alte unten ist, und damit den "Neues-Bier-Timer" aktiviert. ( t2 )

Dieser wird schließlich erst durch

Delphi-Quellcode:
  begin
    bier1.Visible := false;
    lblres.Caption := inttostr(strtoint(lblres.Caption)+50); //Wenn mein Korb(img1) eine herunterfallende Bierflasche(bier1) auffängt bekommt man 50 Punkte.
    tm2.Enabled := true;    //  < ----- Das
    tm1.Enabled := false;
  end;
  if bier1.Top > form1.ClientHeight then
  begin
    bier1.Visible := false;
    tm2.Enabled := true;    //   <----- oder das aktiviert
    tm1.Enabled := false;
  end;

hannibal007 22. Mär 2005 20:41

Re: Mehrere Bilder gleichzeitig bewegen
 
Um die Anzahl der Bilder zu erhöhen habe ich eine for Schleife eingebaut, leider funzt es aber nicht richtig. Die Bilder werden zwar angezeigt, jedoch bewegen sie sich nicht nach unten. Es bewegt sich nur ein unsichtbares Bild unendlich weit nach unten.


Delphi-Quellcode:
procedure TForm1.tm1Timer(Sender: TObject);
type imgsammlung = Array[1 .. 3] of timage;
var biertest : imgsammlung;
    I : integer;
begin
  biertest[1] := bier1;
  biertest[2] := bier2;
  biertest[3] := bier3;
  for I := 1 to strtoint(lbl1.Caption) do
  biertest[I].top := biertest[I].Top + 20;
  begin
  if (biertest[I].Top + biertest[I].Height >= img1.Top) AND (biertest[I].Left <= img1.Left + img1.Width) AND (biertest[I].Left + biertest[I].Width >= img1.Left) then
  begin
    biertest[I].Visible := false;
    lblres.Caption := inttostr(strtoint(lblres.Caption)+50);
  end;
  if biertest[I].Top > form1.ClientHeight then
    biertest[I].Visible := false;
  end;
end;

procedure TForm1.tm2Timer(Sender: TObject);
type imgsammlung = Array[1 .. 3] of timage;
var biertest : imgsammlung;
    I, A : integer;
begin
  biertest[1] := bier1;
  biertest[2] := bier2;
  biertest[3] := bier3;
  A := random(3)+1;
  lbl1.Caption := inttostr(A);
  for I:= 1 to A do
  begin
    biertest[I] := TImage.Create(Self);
    biertest[I].Parent:= Self;
    biertest[I].Picture.LoadFromFile('flasche'+inttostr(random(3)+1)+'.bmp');
    biertest[I].AutoSize:=True;
    biertest[I].Left:= random(form1.ClientWidth-biertest[I].Width);
    biertest[I].Top:= (biertest[I].Height);
  end;
  tm1.Enabled := true;
end;

Khabarakh 23. Mär 2005 07:39

Re: Mehrere Bilder gleichzeitig bewegen
 
Zitat:

Zitat von hannibal007
Delphi-Quellcode:
    for I := 1 to strtoint(lbl1.Caption) do
  biertest[I].top := biertest[I].Top + 20;
  begin

Hast du das so in deinem Code stehen?

hannibal007 23. Mär 2005 10:26

Re: Mehrere Bilder gleichzeitig bewegen
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von hannibal007
Delphi-Quellcode:
    for I := 1 to strtoint(lbl1.Caption) do
  biertest[I].top := biertest[I].Top + 20;
  begin

Hast du das so in deinem Code stehen?

Ja.
Soll ich das Spiel auf meinen Webspace uploaden?

Jarmen_Kell 23. Mär 2005 11:01

Re: Mehrere Bilder gleichzeitig bewegen
 
Hmm gut, ich weiß jetzt nicht, was lbll.Caption ist,
aber zumindest bewegt sich das Ding jetzt nicht immer in gewissen Abständen nach unten, sondern auf Grund der Schleife im Prinzip sofort.
Das ganze muss schon über nen Timer laufen.

Ich hatte mal eine Art Moorhuhnjagd gebaut und das ist ja das selbe wie bei dir, nur in ner anderen Richtung etc.
Auszug:

Delphi-Quellcode:
procedure Tformmain.timertargetTimer(Sender: TObject);
begin
if timeleft<=0 then
  begin
  timertarget.Enabled:=False;
  timertimeleft.Enabled:=False;
  labeltimeleftamount.Caption:=inttostr(timeleft);
  end;
if target1.left<=-30 then
  begin
  target1.left:=850;
  target1.top:=random(470)+5;
  end
  else
  target1.left:=target1.left-2;
if target2.left<=-30 then
  begin
  target2.left:=850;
  target2.top:=random(470)+5;
  end
  else
  target2.left:=target2.left-2;
if target3.left<=-30 then
  begin
  target3.left:=850;
  target3.top:=random(470)+5;
  end
  else
  target3.left:=target3.left-2;
end;
die Targets und Richtungen etc. müsstest du natürlich ersetzen.

Und dann musste noch etwas einbauen, dass neue Objekte oben erstellt und die alten unten löscht.
Alternativ kannste auch die, die unten angekommen sind, nach oben bewegen und neu fallen lassen.

Edit: 'n Paar Rechtschreib- und Grammatikfehler behoben

hannibal007 23. Mär 2005 12:22

Re: Mehrere Bilder gleichzeitig bewegen
 
Zitat:

Zitat von Jarmen_Kell
Hmm gut, ich weiß jetzt nicht, was lbll.Caption ist

Bei tm2 wird die Anzahl der Bilder die gleichzeitig nach unten laufen sollen in einem Label(lbl1) angegeben. Bei tm1 wird der Wert aus lbl1 wieder in integer umgewandelt damit mein timer(tm2) weiss wieviele Bilder er gleichzeitig bewegen soll.

Khabarakh 23. Mär 2005 12:26

Re: Mehrere Bilder gleichzeitig bewegen
 
Zitat:

Zitat von hannibal007
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von hannibal007
Delphi-Quellcode:
    for I := 1 to strtoint(lbl1.Caption) do
  biertest[I].top := biertest[I].Top + 20;
  begin

Hast du das so in deinem Code stehen?

Ja.
Soll ich das Spiel auf meinen Webspace uploaden?

Sollte es nicht so heißen:
Delphi-Quellcode:
    for I := 1 to strtoint(lbl1.Caption) do
begin
  biertest[I].top := biertest[I].Top + 20;

hannibal007 23. Mär 2005 12:40

Re: Mehrere Bilder gleichzeitig bewegen
 
@Khabarakh
Du hast recht jedoch funzt es auch so nicht.
Die Bilder werden angezeigt jedoch bewegen sich nicht nach unten.

Jarmen_Kell 23. Mär 2005 13:58

Re: Mehrere Bilder gleichzeitig bewegen
 
Also ich würde dir raten, einfach eine Fixe Bilder-Anzahl zu nehmen mußt dann eben gucken, wie viele du maximal brauchst. Wenn die Zahl im Spiel Variabel sein soll, kannste das dann ja immernoch machen, dass z.B nur img1,img2,...,img5 fallen
Das ist mit if then else schnell gemacht
Und dann kannst du vom Prinzip meinen Ooben geposteten Source nehmen, nur eben die Richtungen etc ändern.

@Khabarakh:
Naja das mit dem "begin" geht schon, er schließsts ja auch später wieder. Das ganze macht er danach noch einmal, allerdings frage ich mich auch sehr nach dem Sinngehalt ;)

Gut, Optische Gliederung vllt. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.
Seite 1 von 2  1 2      

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