Autor |
Beitrag |
beastofchaos
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Fr 24.12.10 12:31
Hallo Leute,
ich arbeite mit meinem Freund an einem Minigolfspiel, geschrieben mit Delphi. Wird werden es für ein wichtiges Referat in der Schule brauchen ( haben noch ein halbes jahr Zeit ). Hab da aber so einige Fragen, da mit Delphi es immer wieder Probleme gibt.
Vorweg: Ein gutes Vorbild ( nicht mit Delphi geschrieben ) ist dieses Spiel, das doch sehr Spaß macht und einwandfrei funktioniert:
de.playforia.com/spielen/minigolf/
Meine erste Frage:
Kann man den Timer.Interval irgendwie niedriger als 1 setzen, da sich die Kugel sonst zu langsam bewegt ( Im timer soll dich die Left-/Top-Position immer um 1 bewegen)
Wenn das nicht kleiner geht, dann hab ich das Problem, dass ich im Timer sonst die Kugel für hohe Geschwindigkeiten 2 oder 3 Positionen auf einmal weiterspringen lassen muss. Dabei kann er aber über meine Hindernisse eventuell springen (if Kugel.Left = Hindernis.Left then *Winkel berechnen und Laufbahn der Kugel spiegeln*), weil ich ja nur bestimmte Positionen als Hindernis definiere :/
Kann euch ja mal meine bisherige Arbeit zeigen, wenn es auf diese Frage ne Lösung gibt. Hab da tausende Problem mit Winkelberechnug, Linie zur Maus ziehen, etc.
Freue mich auf Antwort
MfG Thomas
Moderiert von Narses: Binaries aus den Anhängen entfernt.
Zuletzt bearbeitet von beastofchaos am So 27.03.11 00:39, insgesamt 3-mal bearbeitet
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 24.12.10 12:37
Hallo und  in der Entwickler-Ecke,
Timer-Intervall kleiner als 1 geht nicht. Genau genommen geht auch ein Timerintervall kleiner als ungefähr 25 nicht, da Windows bei weniger nicht mehr mitmacht.
Außerdem: Für die Anzeige wären das dann 1000 Frames pro Sekunde - das ist doch viel zu viel.
Für die Kollisionsabfrage mit den Hindernissen musst du dir dann was anderes überlegen - ein erster Anfang wäre eine Überprüfung per "<=" oder ">=" anstelle von "=". 
_________________ We are, we were and will not be.
Für diesen Beitrag haben gedankt: beastofchaos
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Fr 24.12.10 12:40
Kleiner 1? Das wäre dann ja über 1000 Schritte/ Pixel pro Sekunde?!?
Mach bitte nicht den Fehler, beim Auslösen des Timers immer eine feste Schrittweite zu nehmen. Anstatt dessen solltet ihr besser ein paar Formeln zu Herzen nehmen, die ihr im Physikunterricht gelernt haben solltet. Arbeitet besser mit einer Geschwindigkeit, die ihr euch merkt und rechnet pro Timerintervall aus, wo der Ball sein müsste und zeichnet ihn dort. Weg = Strecke mal Zeit, so als erster Ansatz 
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Fr 24.12.10 12:44
Hey,
@Gausi: das kann bei schnellen Geschwindigkeiten und hohen Intervallen zu Fehlergebnisen führen.
Ich würde es so machen:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| -neue Position berechnen -mit der neuen Position auf Hindernise prüfen -wenn die Position hinter einem Hindernis ist, dann: -bestimmt den Punkt an dem der Ball das Hindernis berührt -berechnen den zurückgelegten Weg -lass den Ball am Hinderniss abprallen (Richtungsänderung) -lasse den Ball soweit weiter rollen, bis die gewünschte entfernung für diesen Schritt erreicht ist |
Ich hab mal sowas ähnliches gemacht, un das hat 1a funktioniert. Hat auch mit sehr hohen Geschwindigkeiten und Intervallen die richtigen Ergebnise geliefert.
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
Für diesen Beitrag haben gedankt: beastofchaos
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 24.12.10 12:50
_________________ We are, we were and will not be.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 24.12.10 13:12
Ich verweise immer sehr gerne hierauf: wiki.delphigl.com/in...p/Timebased_Movement
Damit sollte das Problem mit dem Timer erledigt sein. Falls es noch Probleme mit der Berechnung von Bewegungen/Kollisionen geben sollte, kann ich dieses Tutorial hier empfehlen: wiki.delphigl.com/in...rial_Lineare_Algebra
Für diesen Beitrag haben gedankt: beastofchaos
|
|
beastofchaos 
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Fr 24.12.10 17:59
Bergmann89 hat folgendes geschrieben : | Hey,
Ich würde es so machen:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| -neue Position berechnen -mit der neuen Position auf Hindernise prüfen -wenn die Position hinter einem Hindernis ist, dann: -bestimmt den Punkt an dem der Ball das Hindernis berührt -berechnen den zurückgelegten Weg -lass den Ball am Hinderniss abprallen (Richtungsänderung) -lasse den Ball soweit weiter rollen, bis die gewünschte entfernung für diesen Schritt erreicht ist |
|
So ähnlich dachte ich mir das auch, aber wie stellst du im Quelltext dann fest, dass zwischen der ersten und zweiten Position ein hindernis ist?
Ich beginne währenddessen schon einmal mit der zweiten Frage(die später auch zur dritten führen wird  ):
Hier mal ein Bilder des Delphi-x/y-"Gitters" (jpg, 158.49 KB)
Es zeigt an, dass eine Linie zur Maus erzeugt wird und ich habe mal graue Kugeln gezeichnet, die die zu zeichnenden Positionen dar stellen sollen mit abnehmender Geschwindigkeit, wenn die procedure "Maus.Click" aktiviert wird.
Zur Schussrichtung und der Stärke benutze ich wie in meinem Vorbild eine Linie, die bis zur Mausposition erzeugt wird.
Dabei müssen die Positionen der Kugel später so genau bestimmt werden, dass es realistisch wird. Leider gibt es keine Kommazahlen in dem Gitter,
weshalb ich trunc() benutzen muss. Meint ihr, man wird die minimale Positionenverschiebung sehen können?
Nebenbei hab ich noch ne kleine Frage zur Mausposition: Wenn ich Cursor.Pos.X/Y auslese liest er die Position auf dem Bildschirm und nicht in dem Form. Deswegen muss ich die Formel "X:=Cursor.Pos.X - Form1.Left". Selbst dann ist die Position nicht genau wegen der größe des Bildschimrs und ich muss 3 bis 20 nochmal dazu abziehen.
Gibt es keinen Befehl wie "X:=Form1.Cursor.Pos.X"?
MfG Thomas
PS: Danke schonmal für die viiielen Antworten auf das Thema
Moderiert von Narses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von beastofchaos am Fr 24.12.10 18:43, insgesamt 2-mal bearbeitet
|
|
glotzer
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Fr 24.12.10 18:08
soo wegen dem komma problem: einfach intern mit extended rechnen und erst beim zeichnen runden
|
|
beastofchaos 
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Fr 24.12.10 18:15
Zuletzt bearbeitet von beastofchaos am Fr 24.12.10 18:16, insgesamt 1-mal bearbeitet
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Fr 24.12.10 18:16
Und bitte für jede Frage ein eigenes Topic aufmachen, sonst verlieren wir hier alle die Übersicht, Danke
P.S.:
1) Dein 'Standard' real ist aber kein Standard für Delphi mehr. Daher bitte aktuelle Datentypen verwenden.
2) Trunc() -> Round()
3) Betrag -> Abs()
... wo wir wieder beim Thema wären, dass alle Fragen/Antworten gemischt werden 
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Für diesen Beitrag haben gedankt: beastofchaos
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 24.12.10 18:26
Wegen der Datei bei Rapidshare:
Häng die bitte einfach an. Das macht den Download einfacher, außerdem ist die Datei dann auch später noch da, falls jemand den Thread findet und sich die Sachen anschauen möchte. 
Für diesen Beitrag haben gedankt: beastofchaos
|
|
beastofchaos 
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Fr 24.12.10 18:42
Ok, im Anhang sind beide Dateien. Lösche die beiden Links.
Schonmal vielen Dank für die Antworten, ich werde jetzt zu jeder wichtigen Frage ein Topic erstellen.
Bis zum nächster Thema
Moderiert von Narses: Anhänge in den ersten Beitrag verschoben.
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Fr 24.12.10 23:24
Hey,
nochmal zur kollisionsabfrage. Betrachte das Hinternis, sowie den Vektor vom aktuellen Punkt zum neuen Punkt als Linie. Jetzt berechnest du den Schnittpunkt der beiden Linien. Jetzt musst du nur noch gucken, ob der Punkt auf der Linie in den Richtigen Grenzen liegt: linke bzw. rechte Grenze des Hindernissen und Abstand zum aktuellen Punkt. Wenn der Punkt zwischen den Endpunkten des Hindernises liegt, und der Abstand zum aktuellen Punkt kleiner als die Länge des Vektors ist, dann Musst du eine Kollision berechnen.
Nochwas zur Bestimmung der Maus-Koordinaten. Einfach auf deiner Zeichenebene das OnMouseMove-Ereignis benutzten, da werden die Koordinaten in Anhängigkeit zum Objekt übergeben.
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
Für diesen Beitrag haben gedankt: beastofchaos
|
|
beastofchaos 
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Sa 25.12.10 02:57
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ich hab das schon in einem anderen Forum gefunden. Und zwar arbeite ich nicht mit einzelnen Intergerwerten, sondern TPoint.
"Maus=TPoint;
.
.
.
Maus:=ScreenToClient(Mouse.CursorPos);
.
.
."
Habs das ganze erst in einem Timer gebunden, aber dan narbeitet das Programm die ganez Zeit. Deswegen ist ein MousEMov deutlich besser. Hab zur Hidnernis berechnung schon eine Lösung gefunden, aber kommt ja eig nicht hierein. WENN ich da noc hFragen hab erstell ich ein neues Topic dazu. Vll schaff ichs auch cniht alleine mit der Vektor zum Schießen der Kugel oder der Spiegelung der Kugel, aber in der Theroie, hab ichs schon ziemlich gelöst. Mach das alles erst mal auf nem Blatt Papier
Vielen vielen Dank und nochmal Frohe Weihnachten, Leute. Bis zum nächsten Topiceintrag 
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 25.12.10 03:24
beastofchaos hat folgendes geschrieben : | Deswegen ist ein MousEMov deutlich besser. |
Wenn es denn so gewollt ist, dass nix passiert, wenn die Maus nicht bewegt wird, ist es besser, ja.
|
|
beastofchaos 
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: Sa 25.12.10 22:59
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Naja, das stört mich nicht, aber iwann ist doch auch das Programm überlastet, wenn ich lauter Timer ununterbrochen laufen lass.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: So 26.12.10 15:35
Man braucht nicht mehr als einen Timer. Wenn es ein Performance-Problem gibt, dann liegt es woanders.
|
|
beastofchaos 
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: So 26.12.10 16:34
F34r0fTh3D4rk hat folgendes geschrieben : | Man braucht nicht mehr als einen Timer. Wenn es ein Performance-Problem gibt, dann liegt es woanders. |
Naja, mein Timer für die bewegung der Minigolfkugel muss ja immer langsamer werden. Einer anderer Timer soll nur, wenn die Kugel sich nicht bewegt, Eine Linie von Kugel zur Maus erzeugen. Keien Ahnung, aber ich glaube ich werde insgesamt 3 Timer brauchen
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: So 26.12.10 17:18
Schonmal angesehen?
Da steht, wie du die Kugel langsamer werden lässt, ohne den Interval zu ändern.
Du brauchst insgesamt nur einen Timer, in dem lässt du halt alles laufen. Wenn das erstmal klappt, kannst du dir mal application.OnIdle anschauen, und das dann eleganter ohne Timer lösen. Aber strebe erstmal einen Timer an.
|
|
beastofchaos 
      
Beiträge: 247
Erhaltene Danke: 4
|
Verfasst: So 26.12.10 18:23
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Hab ich schon gesehen.
Ich kann das immer noch später machen. Schließlich läuft das Programm immer noch wie geschmiert, auch mit mehreren Timern. Und wenn man statt dem Interval die Strecke verlangsamt wird das sehr ungenau. er schießt bei mir imerm mit Entfernung 2 Positionen in eine Richtung. Da man bei x- und y-Werten imerm Runden muss, kommen nur so ungenaue Ergebnise raus( entweder 2,1 oder 0 -> nur drei verschiedene Geschwindigkeiten ).
|
|
|