![]() |
Zufällige Bewegung eines Sprites
Delphi-Quellcode:
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?
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; |
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 |
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; |
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. |
Re: Zufällige Bewegung eines Sprites
Ach so, jetzt verstehe ich erst, was du genau wissen wolltest :oops:
|
Re: Zufällige Bewegung eines Sprites
Hallo
Im Prinzip nicht schwer. Du fängst so an: X & Y sind Gleitkommazahlen.
Delphi-Quellcode:
Und dann bei jedem Timer-Aufruf:
Randomize;
X:=Random(10)+10; Y:=Random(10)+10;
Delphi-Quellcode:
Sollte eigentlich gehen. (Habs aber nicht getestet)
X:=X-((Random(40)/10)-2);
Y:=Y-((Random(40)/10)-2); Gruß Onz |
Re: Zufällige Bewegung eines Sprites
Jetzt bewegen sie sich konsequent nur nach rechts. :?
|
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? |
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.
|
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:
lauten. Damit würde vy mit hoher Wahrscheinlich eher über 0 bleiben, während vx sich gleichmäßig nach links und rechts verändert.
vx := vx + Random(40/10)-2
vy := vy + Random(30/10)-1 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. |
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.
|
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) |
Re: Zufällige Bewegung eines Sprites
Hm, ich dachte, das wären nur andere Bezeichner, sorry. Wie komme ich jetzt zu den X Werten?
|
Re: Zufällige Bewegung eines Sprites
Hi!
Normalerweise rechne ich die neue X-Position durch
Delphi-Quellcode:
aus. Für y entsprechend!
X:=X+vx;
Ciao fkerber |
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 |
Re: Zufällige Bewegung eines Sprites
fkerber macht's genau richtig. Ich dachte mir nur, dass Luckie das aus meiner Zeile
Zitat:
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. |
Re: Zufällige Bewegung eines Sprites
Zitat:
Das ist geil, das ist geil, so geht es. :P |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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