Seite 1 von 4
Ziel Schuss
Verfasst: 26.03.2008 23:17
von Gn00bi
Hi
wie kann ich dafür sorgen, dass ein schuss immer genau auf sein ziel zufliegt?
Ich hab keine Idee, wie ich das umsetzen könnte bitte um Hilfe!
Verfasst: 26.03.2008 23:30
von Tombi
Soll es den auf die geschossene Strecke schießen oder auch treffen, wenn sich der Gegner vom Fleck gerührt hat?
Verfasst: 26.03.2008 23:33
von Gn00bi
auf der geschossenen strecke, soll den gegner also nicht verfolgen
Verfasst: 26.03.2008 23:56
von gnasen
zB anhand von Waypoints bewegen. Nimmst zum Beispiel die Entfernung (kommste über den Satz des Pythagoras dran) und teilst diese durch die Schrittweite in Pixel.
Nun teilste die Entfernung auf der X-Achse und ebenso auf der Y-Achse durch die Schrittzahl und hast schon wunderbare Waypoints.
zB:
|.......................______P2 (das ist ne Diagonale, Mensch!)
|.............______|
|...______|
P1----------------------
P1 = (5|5)
P2 = (20|10)
Schrittgeschwindigkeit: 2
sqrt((20-5)² + (10-5)²) / 2 = 7 Schritte
5 + 15 * 1/7 = 7
5 + 15 * 2/7 = 9
...
5 + 15 * 7/7 = 20 <-- X-Achse
5 + 5 * 1/7 = 6
5 + 5 * 2/7 = 6
...
5 + 5 * 7/7 = 10 <-- Y-Achse
Als Liste:
(7|6) ; (9|6) ; ... ; (20|10)
Ist als Procedur sehr leicht umsetzbar
€: Wer suchet, der findet, ich wußte ich hab das selber mal gebastelt ^^
Code: Alles auswählen
structure waystruc
x.l
y.l
endstructure
Global Newlist Waypoints.waystruc()
Procedure MakeWaypoints(X1.l, Y1.l, X2.l, Y2.l, Abstand.f)
Protected Punktanzahl.l
Protected a.l
Punktanzahl = Round(Sqr( ((X2-X1) * (X2-X1)) + ((Y2-Y1) * (Y2-Y1)) ) / Abstand, 0) + 1
For a = 0 To Punktanzahl
AddElement(Waypoints())
Waypoints()\x = (X2-X1) * a / Punktanzahl + X1
Waypoints()\y = (Y2-Y1) * a / Punktanzahl + Y1
Next
EndProcedure
Verfasst: 27.03.2008 00:21
von STARGÅTE
kannst dir auch mein Code hier angucken:
Mausverfolgender Bot + Anhänger
da läuft der Bot immer zielsicher der Maus hinterher, so kannst du dann auch den Schuss programmieren oder rakete, die dann auch ziellenkung hat
Verfasst: 27.03.2008 00:25
von Gn00bi
erstmal danke für den ansatz, aber soleicht ist das nicht, denn wenn man z.b. die punkte: p1(3,1) und p2(1,3), dann wäre nach deiner formel, die verallgemeinert ja
sqrt((x1-x2)² + (y1-y2)²)
lautet das ergebnis 0, da das dreieck allerdings seitenlänegn von jeweils 2 hat müsste was anderes raskommen.
Man könnte natürlich immer vorher prüfen lassen, ob x1 oder x2 größer ist usw., das wäre allerdings dann ziemlich viel, oder? gibt es vielleicht eine einfachere Lösung die Entfernung zwischen 2 Punkten rauszufinden?
€dit: der Edit und der andeer Post kamen als ich bereits am überlegen war^^ werds mir erstmal nagucken
Verfasst: 27.03.2008 00:44
von gnasen
Gn00bi hat geschrieben:
p1(3,1) und p2(1,3)
sqrt((x1-x2)² + (y1-y2)²)
lautet das ergebnis 0
*hust* ?
sqrt((3-1)²+(1-3)²) = sqrt( 8 ) = 2.xx was weiss ich, aber nicht 0
Verfasst: 27.03.2008 00:46
von Gn00bi
ok ok ich überleg lieber morgen wieter und ge erstmal ins bett

glaub bin heut nicht merh so dazu fähig

Verfasst: 27.03.2008 02:35
von Kaeru Gaman
benutze floats alle alle verarbeiteten variablen, dann kommts auch nicht zu Nullstellern.
bei integer werden immer die nachkommastellen abgeschnitten.
wenn deine werte also zu klein werden, kommt irgendwann nur noch null raus.
umgekehrt gilt, wenn deine werte bei floats zu groß werden, bekommst du ungenauigkeiten rein.
wenn du mit floats mit krummen werten weit aufwärts zählst, und dann wieder abwärts,
landest du nicht wieder bei Null.
Verfasst: 27.03.2008 14:00
von Gn00bi
da ich noch ziemlicher anfänger bin, könnte mir das hier:
Code: Alles auswählen
structure waystruc
x.l
y.l
endstructure
Global Newlist Waypoints.waystruc()
Procedure MakeWaypoints(X1.l, Y1.l, X2.l, Y2.l, Abstand.f)
Protected Punktanzahl.l
Protected a.l
Punktanzahl = Round(Sqr( ((X2-X1) * (X2-X1)) + ((Y2-Y1) * (Y2-Y1)) ) / Abstand, 0) + 1
For a = 0 To Punktanzahl
AddElement(Waypoints())
Waypoints()\x = (X2-X1) * a / Punktanzahl + X1
Waypoints()\y = (Y2-Y1) * a / Punktanzahl + Y1
Next
EndProcedure
mal bitte wer erläutern?