Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 Uhr.
Seite 1 von 2  1 2      

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