Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zufalls-Bewegung (https://www.delphipraxis.net/55346-zufalls-bewegung.html)

Aria 19. Okt 2005 22:00


Zufalls-Bewegung
 
Hallo nochmal,
ich habe noch eine Frage :roll:

Also, in meinem Delphi-Game, bewegen sich Vögel-Bilder durch den Bildschirm.
Diese Bewegung habe ich mit einem Timer gemacht:

Delphi-Quellcode:
image2.Top:=image2.Top+10;
image2.Left:=image2.left+10;
Der Timer wird aktiviert (enabled) wenn ich einen Button drücke.
Ich möchte aber, dass die Bilder zufällig die richtung wechseln, während sie durch den Bildschirm fliegen, ist das möglich, wenn ja wie würde dass dann lauten?

xaromz 19. Okt 2005 22:05

Re: Zufalls-Bewegung
 
Hallo,

klar ist das möglich.

Definiere einfach zwei Variablen als Integer (z. B. RichtungX und RichtungY). Die setzt Du am Anfang auf +1 und rufst Randomize auf. In Deinem Timer schreibst Du dann einfach
Delphi-Quellcode:
 if Random(100) = 0 then
  RichtungX := -RichtungX;
if Random(100) = 0 then
  RichtungY := -RichtungY;
image2.Top:=image2.Top+10 * RichtungY;
image2.Left:=image2.left+10 * RichtungX;
Durch die Multiplikation mit -1 drehst Du einfach das Vorzeichen um. Den Wert bei Random kannst Du beliebig wählen, je größer, desto seltener die Wechsel.

Gruß
xaromz

Nikolas 19. Okt 2005 22:06

Re: Zufalls-Bewegung
 
Etwa so:

Delphi-Quellcode:
Randomize;

// OnTimer:
delta := randomrange(-10,10); // in unit Math;

Vogel.left := Vogel.Left+Delta;
Randomrange gibt ein zufällige Zahl zwischen den beiden übergebenen zurück.

Natürlich noch Überprüfungen, ob der Vogel aus dem Bild fliegt usw.

Aria 19. Okt 2005 22:11

Re: Zufalls-Bewegung
 
Also, ich muss nun

Delphi-Quellcode:
 if Random(100) = 0 then
  RichtungX := -RichtungX;
if Random(100) = 0 then
  RichtungY := -RichtungY;
image2.Top:=image2.Top+10 * RichtungY;
image2.Left:=image2.left+10 * RichtungX;
in den Timer angeben, und dann? Weiter habe ich nicht mehr verstanden!

Nikolas 19. Okt 2005 22:20

Re: Zufalls-Bewegung
 
Sein Code funktioniert so, dass der Vogel sich bei jedem Timerevent um 10 Pixel bewegt.
Mit dem Random(100)=0 will er erreichen, dass sich die Bewegungsrichtung des Vogels ändert.
Da es sich bei RichtungX aber wahrscheinlich um eine lokale Variable handelt, wird der Code so nicht laufen.
Anderer Vorschlag:
Delphi-Quellcode:
if random(100)=0 then x:=1 else x:=-1;
Vogel.left:= Vogel.left+x*random(20);
Damit verschiebt sich dein Vogel jedesmal um 0-19 Pixel und änder etwa alle hundert Events die Rchtung.

Aria 19. Okt 2005 22:23

Re: Zufalls-Bewegung
 
Dass habe ich jetzt unter

Delphi-Quellcode:
image2.Top:=image3.Top+27;
image2.Left:=image3.left+17;
eingefügt, nun wird mir aber gesagt, dass "x" kein deklarierter befehl oder so ist!

xaromz 19. Okt 2005 22:23

Re: Zufalls-Bewegung
 
Hallo,

durch die Random-Befehle wird (so der Zufall will) bei dem Variablen das Vorzeichen gewechselt (RichtungX := -RichtungX). Durch die anschließende Multiplikation mit eben dieser Variable (sprich: dem Vorzeichen) wird entweder 10 addiert oder eben (10 * -1 = -10) subtrahiert.

In Dein Form.Create schreibst Du noch
Delphi-Quellcode:
Randomize;
RichtungX := 1;
RichtungY := 1;
Damit initialisierst Du den Zufallszahlengenerator und Deine beiden Vorzeichen.

Zitat:

Zitat von Toxman
Damit verschiebt sich dein Vogel jedesmal um 0-19 Pixel und änder etwa alle hundert Events die Rchtung.

Nein, damit wird alls 100 Events einmal die Richtung geändert, die restlichen 99 Events nicht.

Gruß
xaromz

Aria 19. Okt 2005 22:31

Re: Zufalls-Bewegung
 
Sorry, dass ihr mir alles so genau erklähren müsst, aber wo genau muss das jetzt rein:

Zitat:

Randomize;
RichtungX := 1;
RichtungY := 1;

xaromz 19. Okt 2005 22:35

Re: Zufalls-Bewegung
 
Hallo,

das Zeug muss in Deine Create-Methode (Ereigniss FormCreate im OI). Dann wird das Ganze beim Fenster-Erzeugen am Anfang aufgerufen.
Außerdem musst Du die beiden Variablen RichtungX und RichtungY noch im private-Bereich Deiner Form deklarieren.

Gruß
xaromz

glkgereon 19. Okt 2005 22:36

Re: Zufalls-Bewegung
 
pass auf...

du sagst in jedem ontimer nicht
Delphi-Quellcode:
image2.Top:=image2.Top+10;
image2.Left:=image2.left+10;
sondern

Delphi-Quellcode:
image2.Top:=image2.Top+(Random(3)-1)*10;
image2.Left:=image2.left+(Random(3)-1)*10;
Random(2) gibt 0, 1 oder 2 zurück...Random(2)-1 also -1,0 oder 1
also bewegt sich das Image nicht mehr nur nach unten, sondern nach unten, nach oben oder gar nicht
für rechts/links ist es analog.

im OnCreate der Form rufst du dann noch Randomize; auf um den Zufallgenerator zu initialisieren.
Fertig!


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