Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bewegung (https://www.delphipraxis.net/66628-bewegung.html)

Z32 1. Apr 2006 17:03


Bewegung
 
Hallo,

Ich glaube, das diese Frage bestimmt schon oft vorgekommen ist, aber die Antworten waren meistens so komplex, das ich sie als Anfänger nicht verstanden habe.

Deshalb wollte ich mich da nochmal genauer erkundigen.

Wie schaffe ich es, dass wenn ich auf einen Botton klicke ein Ball, oder halt eine Figur sich von dem Punkt z.b X zum Punk z.b Y bewegt, nicht springt. Also einfach nur eine kleine kurze Bewegung wenn man auf einen Button klickt.

inherited 1. Apr 2006 17:13

Re: Bewegung
 
zum beispiel mit einer doppelten whileschleife:

Delphi-Quellcode:
While (Objekt.Left <> NewPos.X) and (Objekt.Top <> NewPos.y) do
begin
  if Objekt.Left < NewPos.X then Inc(Objekt.Left)
  else if Objekt.Left > NewPos.X then Dec(Objekt.Left);

  if Objekt.Top < NewPos.Y then Inc(Objekt.Top)
  else if Objekt.Top > NewPos.Y then Dec(Objekt.Top);
end;
Hat den Vorteil das es eine "sanfte" gleichmäßige Bewegung von Oben und Links gibt

Z32 1. Apr 2006 17:34

Re: Bewegung
 
mhhhh

Also erhlich gesagt übersteigt das meine Kentnisse.

Wie benutze ich diese Schleife den jetzt, und was ist mit "objekt" gemeint. Und was muss der gegenstand der bewegt werden soll den genau sein. Ein Bild vielleicht, oder ein Botton ??

Es wäre sehr nett, wenn das nochmal einer erläutern würde.

TheAn00bis 1. Apr 2006 17:37

Re: Bewegung
 
Ich formulier es mal praktischer. ;)

Wenn du beispielsweise ein TImage
bewegen möchtestkannst du folgender-
maßen vorgehen:

Du erstellst einen Timer, aktivierst
ihn ("enabled:=true") und erhöhst
im OnTimer-Ereignis die Eigenschaft
"left" des TImage um 10.

Außerdem solltest du mittels if-
Abfragen überprüfen, ob das TImage
nicht die Grenzen des Formulars über-
schreitet.
Ist dies der Fall, dann erhöhst du
die Eigenschaft "left" einfach nicht
mehr, sondern veringerst sie um 10.

Wenn du zusätzlich Abbremsung oder
Beschleunigung haben möchtest,
könntest du die 1 mit einem
Abbrems- (<1)oder Beschleunigungs-
(>1) Faktor multiplizieren.
Da Die Positionen der Delphi-
Komponenten aber immer ganz-
zahlig sein müssten, würdest
du die Werte jetzt noch runden
müssen.

Edit: Der Faktor muss natürlich größer
oder kleiner 1 und nicht, wie ich ge-
schrieben hatte größer oder kleiner 0
sein.

inherited 1. Apr 2006 19:05

Re: Bewegung
 
Zitat:

Zitat von Z32
mhhhh

Also erhlich gesagt übersteigt das meine Kentnisse.

Wie benutze ich diese Schleife den jetzt, und was ist mit "objekt" gemeint. Und was muss der gegenstand der bewegt werden soll den genau sein. Ein Bild vielleicht, oder ein Botton ??

Es wäre sehr nett, wenn das nochmal einer erläutern würde.

Anstelle von "Objekt" musst du den namen des Image-Objects eintragen und NewPos.x bzw y muss dann die neue position sein (kannst auch direkt eine zahl schreiben)

s.h.a.r.k 1. Apr 2006 19:29

Re: Bewegung
 
Also am sinnvollsten wäre für einen Anfänger sicherlich der Timer! Der führt dir nämlich jede Sekunde - oder die von dir voreingestellte Zeit - einen Code aus, d.h. du brauchst dir nicht selbst eine Schleife zu basteln! Das ganze kann dann so aussehen:
Delphi-Quellcode:
procedure TForm1.Timer1(Sender: TObject);
var
  f : Integer;
begin
  f := 1; // Pixel um wie viel das Image verschoben wird
  if ((Image1.Left + f) < Form1.ClientWidth) then // Abfrage ob Image1 nach der Verschiebung
    Image1.Left:= Image1Left + f;                // noch auf der Form sichtbar ist,
                                                  // wenn ja, dann wird das Image verschoben

  if ((Image1.Top + f) < Form1.ClientHeight) then // Abfrage ob Image1 nach der Verschiebung
    Image1.Top := Image1.Top + f;                // noch auf der Form sichtbar ist,
                                                  // wenn ja, dann wird das Image verschoben
end;
Wenn du das ganze ohne Timer machst und die Schleife wie oben erwähnt heranziehst, dann siehst du den Verschiebungseffekt nicht wirklich, denn die heutigen PCs sind so schnell im Berechnung, dass du die Verschiebung gar nicht mitbekommst! Dort wäre dann ein Application.ProcessMessages angebracht, um eine gewisse Verzögerung zu erzeugen...

mfg shark

Z32 2. Apr 2006 15:32

Re: Bewegung
 
aha, ich glaube so langsam dämmerst mir, wie das zu machen ist.

Auf jeden Fall erst mal danke. Ich probiere das mal aus.

Z32 4. Apr 2006 19:34

Re: Bewegung
 
Also ich glaube bald habe ich es, ich habe mich am anfang nur von dem Schleifenwirwar verunsichern lassen.


Ich zähle nochmal auf was mal alles brauch:

Also als erstes ein Objekt, das verschoben werden soll
Dann kann man mit Objekt.left fragen ob das Bild rechts oder links aus dem Bildschirm läuft
Dann kann man mit Objekt.top fragen ob das Bild oben oder unten aus dem Bildschirm läuft
Und mit NewPos.x kann man die neue Position auf der X-Achse festlegen
Und mit NewPos.Y kann man die neue Position auf der Y-Achse festlegen


Aber ich habe jetzt noch eine kleine Frage:

Was ist inc(Objekt.left) ?
Und was ist dec(Objekt.top) ?

Mavarik 4. Apr 2006 19:40

Re: Bewegung
 
Zitat:

Zitat von Z32
Was ist inc(Objekt.left) ?
Und was ist dec(Objekt.top) ?

Inc(Objekt.left) => Objekt.left := Objekt.left + 1;
dec(Objekt.left) => Objekt.left := Objekt.left - 1;

Frank :coder:

PS.: RTFM

Z32 5. Apr 2006 17:53

Re: Bewegung
 
Ist das so gemint ???

inc(Objekt.left) = heißt also ojekt 1 nach links
dec(objekt.left) = heißt also objekt 1 nach rechts

s.h.a.r.k 5. Apr 2006 18:01

Re: Bewegung
 
Hey.

Der Code hier geht nicht:
Delphi-Quellcode:
inc(Object.Left);
Allgemein zu den Prozeduren (keine Funktionen!) inc und dec:
inc: steht für increment - zu deutsch: erhöhen

z.B.
Delphi-Quellcode:
var i: Integer;
i := 0;
inc(i); // hier wird i um 1 erhöht;
inc(i, 10) // hier wird i um 10 erhöht,
           // d.h. dass 10 ein optionaler
           // Paramter ist
dec: steht für decrement - zu detusch: erniedrigen oder auch verringern (nach ausdrücklichem Wunsch :wink: )

Hier gilt das selbe Beispiel wie oben genannt...

Khabarakh 5. Apr 2006 18:03

Re: Bewegung
 
Zitat:

Zitat von s.h.a.r.k
Allgemein zu den Methoden (keine Funktionen!)

"Methode" ist ja noch falscher ( :stupid: ) als "Funktion".

Nicodius 5. Apr 2006 18:03

Re: Bewegung
 
Zitat:

erniedrigen

ist wohl eine etwas ärgere auslegung :mrgreen: - ich würd verringern sagen ;)

inherited 5. Apr 2006 18:40

Re: Bewegung
 
ooouuups, jetzt wo dus sagst... stimmt
naja dann halt
Delphi-Quellcode:
Objekt.Left:=Objekt.Left+1;

Airblader 5. Apr 2006 20:00

Re: Bewegung
 
Zitat:

Zitat von Z32
Ist das so gemint ???

inc(Objekt.left) = heißt also ojekt 1 nach links
dec(objekt.left) = heißt also objekt 1 nach rechts

Nein.
Wird Objekt.Left erhöht, heißt das, dass es nach Rechts wandert.
"Left" gibt nämlich den Abstand zum linken Rand d. übergeordneten Controls (in diesem Fall wohl die Form) an ;)
Wird dieser größer wandert es logischerweise nach rechts.

air

Z32 7. Apr 2006 17:10

Re: Bewegung
 
Also erst mal vielen Dank für die Antworten, habe mir jetzt nen kleines Programm geschrieben wo ein Bild immer nach rechts fährt. Dann habe ich mir gedacht, lass das Bild doch einfach nach links fahren, wenn es rechts an den Rand stößt. Da habe ich jetzt ein Problem, das Bild rollt nach rechts und bleibt dort am Rand hängen.

Ich habe denn folgenden Code in einem On-Timer Ereignis.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var f: integer;
begin
f:= 10 ;

if image1.left + f < form1.ClientWidth then
image1.left := image1.Left +f

else image1.Left := image1.Left -f;
end;
Weiß vielleicht einer was ich falsch gemacht habe ???

Ratte 7. Apr 2006 17:57

Re: Bewegung
 
Ist doch klar: du prüfst ob das Bild am Fensterrand ist. wenn es dass ist lässt du es in die gegenrichtung laufen. Dann ist es aber nichtmehr am fensterrand-->es läuft wieder in richtung Fensterrand. Du müsstest f global deklarieren und wenn es am Fensterrand ist einfach f:=-f; sagen. Dann ändert es die Richtung dauerhaft.

Z32 7. Apr 2006 18:06

Re: Bewegung
 
Zitat:

Zitat von Ratte
Ist doch klar: du prüfst ob das Bild am Fensterrand ist. wenn es dass ist lässt du es in die gegenrichtung laufen. Dann ist es aber nichtmehr am fensterrand-->es läuft wieder in richtung Fensterrand. Du müsstest f global deklarieren und wenn es am Fensterrand ist einfach f:=-f; sagen. Dann ändert es die Richtung dauerhaft.

Also das habe ich jetzt leider nicht verstanden, was ist falsch und muss geändert werden ???

xZise 7. Apr 2006 19:17

Re: Bewegung
 
Delphi-Quellcode:
private
  f : Integer;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  f := 10;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Image1.left + f > Form1.ClientWidth - Image1.Width then
    f := -10;
  else if Image1.left - f < 0 then
    f := 10

  image1.Left := image1.Left + f;
end;
Erklärung: Das Bild wandert 1x nach links! Dann ist es wieder weg von Rand und d.h. das Bild kommt wieder nach rechts

inherited 9. Apr 2006 09:56

Re: Bewegung
 
Sorry bin im verbesserungswahn
So ist es flexibler

Delphi-Quellcode:
private
  f : Integer;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  f := 10;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (Image1.left + f > ClientWidth - Image1.Width) or (Image1.left - f < 0) then f := -f;
  image1.Left := image1.Left + f;
end;

Johnny14 9. Apr 2006 21:21

Re: Bewegung
 
ich bin ein ANFÄNGER!!
Diese Frage wurde schon oft gestellt, aber ich war anscheinend zu DOOF die Antworten zu kapieren!!
Ich möchte ein Bild(MeineFigur) mit denn Pfeiltasten über denn Bildschirm laufen lassen.Aber wie geht das?? :cry:
Bitte hilft mir! Und erklärt auch alles. :-D
Gruß Johnny

inherited 10. Apr 2006 13:12

Re: Bewegung
 
Auch auf die gefahr hin das du es als zu schwehr ansiehst: Nimm DelphiX
Ein DXDraw, ein DXInput, Eine DXImageList und eine DXSpriteEngine mehr brauchst du nicht für die kompliziertere (und bessere) version.
lies dir dazu am besten Bei Google suchenDelphiX Tutorials durch.


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