Ziel Schuss

Anfängerfragen zum Programmieren mit PureBasic.
Gn00bi
Beiträge: 22
Registriert: 10.04.2007 16:00

Ziel Schuss

Beitrag 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!
Tombi
Beiträge: 369
Registriert: 05.03.2008 22:05

Beitrag von Tombi »

Soll es den auf die geschossene Strecke schießen oder auch treffen, wenn sich der Gegner vom Fleck gerührt hat?
Bild Bild Bild
Intel Pentium 4 630 (3 GHZ)
Gn00bi
Beiträge: 22
Registriert: 10.04.2007 16:00

Beitrag von Gn00bi »

auf der geschossenen strecke, soll den gegner also nicht verfolgen
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Gn00bi
Beiträge: 22
Registriert: 10.04.2007 16:00

Beitrag 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
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
Gn00bi
Beiträge: 22
Registriert: 10.04.2007 16:00

Beitrag von Gn00bi »

ok ok ich überleg lieber morgen wieter und ge erstmal ins bett :freak:
glaub bin heut nicht merh so dazu fähig :freak:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gn00bi
Beiträge: 22
Registriert: 10.04.2007 16:00

Beitrag 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?
Antworten