Autor Beitrag
beastofchaos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: 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 user profile iconNarses: Binaries aus den Anhängen entfernt.


Zuletzt bearbeitet von beastofchaos am So 27.03.11 00:39, insgesamt 3-mal bearbeitet
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 24.12.10 12:37 
Hallo und :welcome: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Fr 24.12.10 12:40 
Kleiner 1? Das wäre dann ja über 1000 Schritte/ Pixel pro Sekunde?!? :gruebel:

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 :wink:

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 24.12.10 12:50 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
@Gausi: das kann bei schnellen Geschwindigkeiten und hohen Intervallen zu Fehlergebnisen führen.


Das ist mir schon klar. ;-)

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
[...] ein erster Anfang wäre [...]


Aber man muss ja mal klein anfangen. Geht ja schließlich auch nicht um Maxi-Golf. :mrgreen:

_________________
We are, we were and will not be.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Fr 24.12.10 17:59 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Hey,
Ich würde es so machen:
ausblenden 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 :D):
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 user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von beastofchaos am Fr 24.12.10 18:43, insgesamt 2-mal bearbeitet
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Fr 24.12.10 18:08 
soo wegen dem komma problem: einfach intern mit extended rechnen und erst beim zeichnen runden
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Fr 24.12.10 18:15 
user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
soo wegen dem komma problem: einfach intern mit extended rechnen und erst beim zeichnen runden


ich benutze zur Berechnung lieber meinen Standard ( Real ) und die Position rund ich mit trunc(). obwohl mir grad einfällt, dass trunc() nur abrundet. Gibt es noch einen Befehl, der ab ",5" auch aufrundet? Und nebenbei kennt ihr auch einen Befehl, der den Betrag berechnet ( also x = betrag(-5))? Das bräuchte ich nämlich zur Winkelberechnung beim Zusammenstoß mit Hidnernis.



user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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 "=". :)


Und danke, mir fällt auch erst jetzt auf, dass es zwischen Interval 25 und 1 keinen Unterschied gibt bzw. windows es nicht schneller machen kann ;) damit hab ich glaub ich schon ein problem mit der abfallenden Geschwindigkeit behoben ( genauere Werte beim Abfallen ).


PS: außerdem wünsch ich allen frohe Weihnachten, die innerhalb der nächsten Stunde nicht mehr on kommen ( solange bin ich ncoh da ).

Moderiert von user profile iconNarses: Zitat gekürzt.


Zuletzt bearbeitet von beastofchaos am Fr 24.12.10 18:16, insgesamt 1-mal bearbeitet
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: 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 user profile iconNarses: Anhänge in den ersten Beitrag verschoben.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Sa 25.12.10 02:57 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 25.12.10 03:24 
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: Sa 25.12.10 22:59 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 26.12.10 15:35 
Man braucht nicht mehr als einen Timer. Wenn es ein Performance-Problem gibt, dann liegt es woanders.
beastofchaos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 16:34 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: So 26.12.10 17:18 
user profile iconF34r0fTh3D4rk hat folgendes geschrieben Zum zitierten Posting springen:
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


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 247
Erhaltene Danke: 4



BeitragVerfasst: So 26.12.10 18:23 
Moderiert von user profile iconNarses: 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 ).