Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Andorra 2D Figur von A nach B bewegen (https://www.delphipraxis.net/135573-andorra-2d-figur-von-nach-b-bewegen.html)

sabbert 13. Jun 2009 14:00


Andorra 2D Figur von A nach B bewegen
 
Hi,

ich arbeite seit kurzem etwas mit Andorra 2d und hab schon die ersten tutorials dafür durchgearbeitet.

Das tutorial mit der Sprite Engine mit dem Bild mit dem jungen der durch das Bild läuft habe ich gerade fertiggestellt.

Jetzt kommt mir die Frage auf , wie ich das schaffe, dass Die Figur sich von A nach B bewegen kann.

Bis jetzt läuft die ja nur waagerechet, also es wird nur X verändert und bekommt am Ende des Bildschirmrandes eine neue Y

Position.

Jetzt soll sie aber z.B. zur Koordinate(x|y) laufen und dort stehenbleiben.

Daraufhin sich dann erst bei einer neuen Anweisung bewegen.

Jemand eine Idee?

Link zum tutorial:
http://andorra.sourceforge.net/index.php?bb=tutot3ger

Bitte um Antworten

mfg

Die Muhkuh 13. Jun 2009 15:06

Re: Andorra 2D Figur von A nach B bewegen
 
Die Logik, die hinter der X-Position steht, musst Du jetzt noch auf die Y-Position übertragen.

Entweder Du läufst immer ein Stück auf der X-Achse, danach auf der Y-Achse, würde halt stottern. Um das Stottern wegzubekommen, brauchst Du etwas Mathematik und den lieben Pythagoras.

sabbert 13. Jun 2009 16:57

Re: Andorra 2D Figur von A nach B bewegen
 
ok ist schon etwas ;-)

Also habe schon mal ausprobiert das beides zu verbinden aber dann läuft er nur schräg weg, also nicht der gewünschte Effekt :D
Wie soll das mit Phytagoras funktionieren, kannst du mir das nochmal etwas nähern erklären?

Nochmal etwas genauer was ich will:
Also stellt euch einfach ein Fläche vor die eben ist und ohne Hindernisse, auf der sagen wir ein paar Punkte A,B,C,D...
eingezeichnet sind. Die Figur an Punkt A soll dann gerade zu Punkt B laufen...danach zu Punkt C usw...

Die Bewegungen sind geradlinieg und nicht schräg.

Edit:
Noch eine etwas andere Fragen,
gibt es noch mehrere Seiten auf denen ich mich mehr übre Andorra 2D informieren kann, z.B. Tutorials, ein Forum usw.

jfheins 13. Jun 2009 17:07

Re: Andorra 2D Figur von A nach B bewegen
 
Dann würde ich sowas vorschlagen:
Delphi-Quellcode:
// Pos läuft von 0 bis n (n=Anzahl der Punkte)
// Points enthält alle Punkte die auf dem weg liegen sollen
function GetPos(pos: Single; Points: Array of TPoint):TPoint;
var
  a, b: Integer;
  x: Single;
begin
  a := Trunc(pos);
  b := Min(Ceil(pos), high(Points))

  x := frac(pos);

  Result := Points[a] * (1-x) + Points[b] * x;
end;
Das Addieren und multiplizieren von TPoint geht so nicht, aber du weist was ich meine :stupid:

Das läuft aber umso schneller, je weiter die Punkte entfernt sind ...

sabbert 13. Jun 2009 17:42

Re: Andorra 2D Figur von A nach B bewegen
 
Wie funktioniert genau, was bewirkt genau, deine function?
berechnet es die Positionen zwischen den Punkten oder was?
Hab ich noch nicht ganz verstanden was diese bezwecken soll.


Hier die jetzige procedure die für das bewegen zuständig ist:

Delphi-Quellcode:
procedure TFigur.DoMove(TimeGap: double);
begin
  inherited;

  X := X + XSpeed*TimeGap;
  if ((X > Engine.SurfaceRect.Right) and (XSpeed > 0)) or
     ((X < -96) and (XSpeed < 0)) then
  begin
    SetLine;
  end;
end;
Dies ist nur auf das x bezogen.
Für x könnte man ja theoretisch auch Y nehmen.

Sagen wir mal die Figur ist auf Pos(100|100) und soll sich zu Pos(Pos.x|Pos.Y) bewegen.
Das die Figur bewegt klappt ja theoretisch schon nur die Richtung und das Ziel, wo sie stehen bleibt bzw. hingehen soll fehlt.

Jakob Ullmann 13. Jun 2009 20:10

Re: Andorra 2D Figur von A nach B bewegen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal versucht, das mit dem Pythagoras verständlich zu machen, siehe Anhang. Ich nehme an, daran scheitert es? Oder liegt es daran, eine if-Abfrage zu machen, ob das Ziel überschritten wurde? Evtl. noch mit Verfeinerung, dass nach den Schritt-Berechnungen kontrolliert wird, ob der Schritt nicht zu groß ist, und so entsprechend verkleinert wird.

Das Prinzip ist 1:1 für einen Timer übertragbar, wenn du dagegen eine Dauerschleife benutzt (wonach dein Code aussieht), musst du noch ein wenig anpassen, sollte aber mit einer einfachen Multiplikation / Division gut machbar sein (indem du zum Beispiel / 100 * TimeGap teilst, 100 ggf. anpassen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 Uhr.

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