Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zufällige Bewegung eines Sprites (https://www.delphipraxis.net/14027-zufaellige-bewegung-eines-sprites.html)

Luckie 31. Dez 2003 11:16


Zufällige Bewegung eines Sprites
 
Delphi-Quellcode:
procedure TEnemy.DoMove(MoveCount: Integer);
var
  Direction: Cardinal; // 0: left 1: right;
begin
  inherited DoMove(MoveCount);
  Direction := Random(5);
  if (Direction mod 2 = 0) then
    X := X - 10
  else
    X := X + 7;
  Y := Y + 5;

  if (Y = Form1.DXDraw1.Height) or ((X < 0) or (X > Form1.DXDraw1.Width)) then
    Dead;
end;
Das ist meine Routine, um einen Sprit zufällig von oben nach unten zu bewegen. Allerdings zappelt der eigentlich mehr hin und her. Wie bekomme ich es jetzt hin, dass er "fließend" bewegt. Also auch mal ein paar mehr Eimheitem nach links und rechts macht?

fkerber 31. Dez 2003 11:21

Re: Zufällige Bewegung eines Sprites
 
Hi!

Kann es sein, dass diese Funktion zu oft aufgerufen wird, er also alle zehntel-Sekunde oder so ne neue Position erhält und deswegen so zappelt?
Das könnte man über ein Flag lösen!

Ciao fkerber

Dagon 31. Dez 2003 11:22

Re: Zufällige Bewegung eines Sprites
 
Damit er ein paar Einheiten mehr nach links/rechts geht, musst du für das rot Markierte Zufallswerte erzeugen lassen:

if (Direction mod 2 = 0) then
X := X - 10
else
X := X + 7;

Luckie 31. Dez 2003 11:43

Re: Zufällige Bewegung eines Sprites
 
@fkerber: Das kann sein.

@bthe_master: das wollte ich eigetnlich nicht, denn dann springt er ja noch mehr wenn er in einem Intervall nach unten geht nach links und rechts.

Dagon 31. Dez 2003 11:48

Re: Zufällige Bewegung eines Sprites
 
Ach so, jetzt verstehe ich erst, was du genau wissen wolltest :oops:

moritz 31. Dez 2003 11:51

Re: Zufällige Bewegung eines Sprites
 
Hallo

Im Prinzip nicht schwer. Du fängst so an:

X & Y sind Gleitkommazahlen.
Delphi-Quellcode:
Randomize;
X:=Random(10)+10;
Y:=Random(10)+10;
Und dann bei jedem Timer-Aufruf:
Delphi-Quellcode:
X:=X-((Random(40)/10)-2);
Y:=Y-((Random(40)/10)-2);
Sollte eigentlich gehen. (Habs aber nicht getestet)

Gruß

Onz

Luckie 31. Dez 2003 12:21

Re: Zufällige Bewegung eines Sprites
 
Jetzt bewegen sie sich konsequent nur nach rechts. :?

OregonGhost 31. Dez 2003 12:41

Re: Zufällige Bewegung eines Sprites
 
Das Problem ist, dass du letztendlich deinem Sprite immer nur eine neue Position gibst. Du musst deinem Sprite eine Geschwindigkeit zuweisen, und die musst du dann zufällig verändern. Dadurch wird sich die Position nicht so zappelnd, sondern etwas gleichmäßiger ändern. Zusätzlich könntest du auch noch eine Beschleunigung hinzufügen und nur die zufällig ändern, könnte noch etwas "realistischer" werden.
Oh, ich überlas noch, dass sich das Sprite von oben nach unten bewegen soll. Auch das kein Problem, denn die Y-Komponente der Geschwindigkeit muss halt immer positiv sein. Die X-Komponente kann sich ja weiterhin so verändern wie oben beschrieben.

Soll das sowas wie ein Schneeflöckchen werden?

Luckie 31. Dez 2003 12:42

Re: Zufällige Bewegung eines Sprites
 
Klingt gut. Nur fange ichgerade erst mit DX an und kann mit "Beschleunigung mitgeben" und "Geschwindigkeit mitgeben" nicht allzuviel anfangen im Moment.

OregonGhost 31. Dez 2003 12:51

Re: Zufällige Bewegung eines Sprites
 
Das lustige an dieser Physik ist, dass sie sehr einfach umzusetzen ist und im Übrigen nichts mit DX zu tun hat ;C)
Geschwindigkeit vx und vy musst du zufällig verändern. Dabei achtest du darauf, dass vy immer größer als 0 bleibt. Das Sprite bewegst du jetzt, indem du
X um vx erhöhst und
Y um vy erhöhst.
Jedenfalls prinzipiell geht das so. Deine Zufallsberechnung sollte also zum Beispiel
Code:
vx := vx + Random(40/10)-2
vy := vy + Random(30/10)-1
lauten. Damit würde vy mit hoher Wahrscheinlich eher über 0 bleiben, während vx sich gleichmäßig nach links und rechts verändert.

Nachtrag: Die Beschleunigung funktioniert genauso. Du hast also ax und ay, und erhöhst vx und vy jeweils um diese.
Du musst die Zufallsroutine natürlich noch etwas tunen, zum Beispiel zufällige Grundgeschwindigkeit mitgeben und die Änderungen kleiner ausfallen lassen als diese etc.

Luckie 31. Dez 2003 12:53

Re: Zufällige Bewegung eines Sprites
 
Das ist genau das, was Onz schon gepostet hat. :wink: Es ist schon besser, das stimmt. Muss wohl noch was mit den Werten rumspielen.

OregonGhost 31. Dez 2003 12:58

Re: Zufällige Bewegung eines Sprites
 
Ich habe nur das Random von Onz übernommen, das andere ist etwas völlig anderes, nämlich wie gesagt das Miteinbeziehen von Geschwindigkeit. Das ist ein deutlicher Unterschied :roll:

Verwechsle in meinem Beitrag nicht vx mit X oder vy mit Y ;c)

Luckie 31. Dez 2003 13:00

Re: Zufällige Bewegung eines Sprites
 
Hm, ich dachte, das wären nur andere Bezeichner, sorry. Wie komme ich jetzt zu den X Werten?

fkerber 31. Dez 2003 13:06

Re: Zufällige Bewegung eines Sprites
 
Hi!

Normalerweise rechne ich die neue X-Position durch

Delphi-Quellcode:
X:=X+vx;
aus. Für y entsprechend!

Ciao fkerber

moritz 31. Dez 2003 13:16

Re: Zufällige Bewegung eines Sprites
 
Oah, ich hatte übersehen dass es sich um eine Form und nicht um ein Koordiantensystem handelt, dass den Nullpunkt in der Mitte hat :)
Aber wenn das jetzt gelöst ist ist es auch gut (Ich hatte auch überlesen dass es von Oben nach Unten gehen sollte :) )

Gruß

Onz

OregonGhost 31. Dez 2003 14:05

Re: Zufällige Bewegung eines Sprites
 
fkerber macht's genau richtig. Ich dachte mir nur, dass Luckie das aus meiner Zeile
Zitat:

Zitat von Meiner einer
[...] indem du X um vx erhöhst

rekonstruieren würde ;C)

Korrekterweise musst du allerdings die verstrichene Zeit miteinbeziehen:

X := X + vx * t

unter der Voraussetzung, dass vx die X-Geschwindigkeit in zum Beispiel Pixel pro Sekunde und t die Zeit in Sekunden angibt.
Wenn du nicht gerade eine Framelimitierung hast, würde das sonst mit unterschiedlichen Geschwindigkeiten laufen. Selbst bei konstanten Frames kann es so einfacher sein, weil du halt mit "vorstellbaren" Einheiten wie Sekunde anstelle von 1/25 Sekunde oder so rechnen kannst.

Luckie 31. Dez 2003 16:29

Re: Zufällige Bewegung eines Sprites
 
Zitat:

Zitat von OregonGhost
fkerber macht's genau richtig. Ich dachte mir nur, dass Luckie das aus meiner Zeile
Zitat:

Zitat von Meiner einer
[...] indem du X um vx erhöhst

rekonstruieren würde ;C

:oops: Jungs, ich bin frisch verliebt, es ist der letzte Tag im Jahr, da hat sich mein Hirn wohl schon etwas verabschiedet. bzw. ist schon am feiern.

Das ist geil, das ist geil, so geht es. :P


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