Geschossrichtung

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Edlothiol

Betreff: Geschossrichtung

BeitragSo, Feb 22, 2004 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal wieder ein Problem mit der Duel - KI:
Ich möchte natürlich, dass die Gegner gut treffen Smile
Die Geschwindigkeit von Geschossen wird so berechnet:
Code: [AUSKLAPPEN]
dx# = (s\dx * 0.5) + Cos(s\angle) * Bullet_vel * 0.5
dy# = (s\dy * 0.5) + Sin(s\angle) * Bullet_vel * 0.5

Für die KI hab ich jetzt diese Gleichung(en) genommen und nach s\angle aufgelöst. Rausbekommen hab ich da:
Code: [AUSKLAPPEN]
targetangle# = acos((2.0*dx-s\dx) / float(Bullet_vel))

dx wird vorher berechnet und ist die x - Bewegung, die das Geschoss haben müsste um zu treffen.
Code: [AUSKLAPPEN]
angle# = atan2(ty-s\y,tx-s\x)
dx# = cos(angle) * float(Bullet_vel)

tx und ty sind die Position des Gegners.
Nur komischerweise gibt das 1. unterschiedliche Ergebnisse, je nachdem ob ich die Gleichung für dx oder die für dy verwende, und 2. trifft es auch nur so ca. in der Hälfte aller Fälle. Ich versteh das nicht, weil eigentlich müsste das so stimmen. Hat jemand eine Idee, was ich falsch gemacht haben könnte?
  • Zuletzt bearbeitet von Edlothiol am Di, Feb 24, 2004 19:47, insgesamt einmal bearbeitet

Markus2

BeitragSo, Feb 22, 2004 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls du Raketen meinst ...

Code: [AUSKLAPPEN]


;Rakete Ziel Blitz2D Example von Markus Rauch

;Tasten Links/Rechts steuert Schiff 1
;Maus Left schieß immer auf Schiff 2
;Maus Rechts schieß auf das Schiff wo cursor drüber ist

;MR 12.05.2003

Graphics 640,480,16,0
SetBuffer BackBuffer()

Type RaketeType
 Field px#
 Field py#
 Field dx#
 Field dy#
 Field speed#
 Field speedmax#
 Field w#
 Field range#
 Field TargetSchiff.SchiffType
 Field Staerke#
End Type

Type SchiffType
 Field Name$
 Field px#
 Field py#
 Field dx#
 Field dy#
 Field speed#
 Field speedmax#
 Field w#
 Field FarbeR
 Field FarbeG
 Field FarbeB
 Field Staerke#
 Field Sinkt
End Type

Type BumType
 Field x#,y#
 Field TargetSchiff.SchiffType
 Field TimeOut
End Type

Global Schiff.SchiffType
Global Rakete.RaketeType
Global Bum.BumType

SchiffNeu "1",320,300,260,1,200,0,255,0 ;Von hier wird geballert
SchiffNeu "2",320,100,200,2,200,255,0,0 ;Ziel
SchiffNeu "3",220,100,100,2,200,0,0,255 ;Ziel

;-------------------------------------------------------------------
MainLoop
End
;-------------------------------------------------------------------

Function MainLoop()

 Local PlayerSchiff1.SchiffType=SchiffFind("1")
 Local PlayerSchiff2.SchiffType=SchiffFind("2")

 Local mx,my

 While Not KeyHit(1)

  mx=MouseX()
  my=MouseY()

  Cls

  ;--------------------------------------------- Schiff 1 lenken

  If KeyDown(203) Then
   If PlayerSchiff1<>Null Then
    If PlayerSchiff1\Sinkt=False Then
     PlayerSchiff1\w=PlayerSchiff1\w+2
     If PlayerSchiff1\w>360 Then PlayerSchiff1\w=PlayerSchiff1\w-360
     PlayerSchiff1\dx=Sin(PlayerSchiff1\w)
     PlayerSchiff1\dy=Cos(PlayerSchiff1\w)
    EndIf
   EndIf   
  EndIf
  If KeyDown(205) Then
   If PlayerSchiff1<>Null Then
    If PlayerSchiff1\Sinkt=False Then
     PlayerSchiff1\w=PlayerSchiff1\w-2
     If PlayerSchiff1\w<0 Then PlayerSchiff1\w=PlayerSchiff1\w+360
     PlayerSchiff1\dx=Sin(PlayerSchiff1\w)
     PlayerSchiff1\dy=Cos(PlayerSchiff1\w)
    EndIf
   EndIf   
  EndIf

  ;---------------------------------------------

  SchiffeUpdate
  SchiffeZeigen
  BumUpdate
  BumZeigen
  RaketenUpdate
  RaketenZeigen

  ;---------------------------------------------

  ;Immer auf Schiff 2
  If MouseHit(1) Then
   RaketeNeu SchiffFind("1"),SchiffFind("2"),50
  EndIf
  ;Auf Schiff wo Maus ist
  If MouseHit(2) Then
   RaketeNeu SchiffFind("1"),SchiffFindXY(mx,my,40),50
  EndIf

  ;---------------------------------------------

  Color 255,255,255
  Oval mx-5,my-5,10,10,False

  ;---------------------------------------------

  Delay 20

  Flip
 Wend

 Delete Each SchiffType
 Delete Each RaketeType
 Delete Each BumType

End Function

Function SchiffNeu(Name$,px#,py#,winkel#,speed#,staerke#,r,g,b)

 ;Neues Schiff bauen

 Schiff.SchiffType=New SchiffType
 
 Schiff\Name$=Name$
 Schiff\px=px
 Schiff\py=py
 Schiff\dx=Sin(winkel)
 Schiff\dy=Cos(winkel)
 Schiff\w=winkel
 Schiff\speed=speed
 Schiff\staerke=staerke
 Schiff\FarbeR=R
 Schiff\FarbeG=G
 Schiff\FarbeB=B
 Schiff\Sinkt=False

End Function

Function SchiffeUpdate()

 ;Schiffe bewegen
 
 For Schiff.SchiffType =Each SchiffType 
  If Schiff\Sinkt=False Then
   If Schiff\Speed<Schiff\SpeedMax Then Schiff\Speed=Schiff\Speed+0.1   
   Schiff\px=Schiff\px+Schiff\dx*Schiff\speed
   Schiff\py=Schiff\py+Schiff\dy*Schiff\speed
   If Schiff\px<0 Then Schiff\px=Schiff\px+GraphicsWidth()
   If Schiff\py<0 Then Schiff\py=Schiff\py+GraphicsHeight()
   If Schiff\px>GraphicsWidth() -1 Then Schiff\px=Schiff\px-GraphicsWidth()
   If Schiff\py>GraphicsHeight()-1 Then Schiff\py=Schiff\py-GraphicsHeight()
  EndIf
 Next

End Function

Function SchiffFind.SchiffType(Name$)

 ;Schiffnamen suchen und SchiffType zurück geben
 
 For Schiff.SchiffType =Each SchiffType 
  If Schiff\Name$=Name$ Then Return Schiff
 Next

 Return Null

End Function

Function SchiffFindXY.SchiffType(px#,py#,ra#)

 ;Schiffnamen suchen und SchiffType zurück geben
 
 For Schiff.SchiffType =Each SchiffType 
  If Entf(px,py,Schiff\px,Schiff\py)<=ra Then Return Schiff
 Next

 Return Null

End Function

Function RaketeNeu(SS.SchiffType,SZ.SchiffType,staerke#)

 ;Neue Rakete starten , erstmal mit Winkel wie Schiff :-)

 If ss=Null Or sz=Null Then Return 0
 If ss=sz Then Return 0 ;auf sich selber schießen wäre doof ;-)

 Rakete.RaketeType=New RaketeType

 Rakete\px=ss\px
 Rakete\py=ss\py
 Rakete\w=ss\w
 Rakete\dx=ss\dx
 Rakete\dy=ss\dy
 Rakete\speed=0
 Rakete\speedmax=10
 Rakete\range=200
 Rakete\staerke=staerke
 Rakete\TargetSchiff=sz

 Return True

End Function

Function RaketenUpdate()

 ;Beschleunig die Rakete und bewegt sie bis der Treibstoff alle ist
 ;Dann wird sie langsamer und verschwindet

 Local Weg
 
 For Rakete.RaketeType =Each RaketeType
  Weg=0
  RaketeZielUpdate Rakete
  If Rakete\Speed<Rakete\SpeedMax Then Rakete\Speed=Rakete\Speed+0.1:If Rakete\Speed>Rakete\SpeedMax Then Rakete\Speed=Rakete\SpeedMax   
  Rakete\px=Rakete\px+Rakete\dx*Rakete\speed
  Rakete\py=Rakete\py+Rakete\dy*Rakete\speed
  If Rakete\TargetSchiff<>Null Then
   If Entf(Rakete\px,Rakete\py,Rakete\TargetSchiff\px,Rakete\TargetSchiff\py)<10 Then
    BumNew Rakete\px,Rakete\py,Rakete\TargetSchiff,Rakete\Staerke
    Weg=True
   EndIf
  EndIf
  If Rakete\range>0 Then Rakete\range=Rakete\range-Rakete\Speed ;Flugdauer begrenzen
  If Rakete\range<=0 Then
   If Rakete\Speed>0 Then Rakete\Speed=Rakete\Speed-0.25 ;kein Treibstoff mehr
   If Rakete\Speed<=0 Then Weg=True ;Hokus Pokus
  EndIf
  If Weg=True Then RaketeFree Rakete
 Next

End Function

Function RaketeFree(R.RaketeType)

 ;Rakete freigeben

 Delete R

End Function

Function RaketeZielUpdate(R.RaketeType)

 If r\TargetSchiff=Null Then Return ;Schiff gibt es nicht mehr dann einfach weiter fliegen lassen mit letztem Kurs

 ;neuen Kurs für die Rakete ausrechnen

 Local dx#,dy#

 dx=r\TargetSchiff\px-r\px
 dy=r\TargetSchiff\py-r\py

 Local wneu#
 Local walt#
 Local wd#

 walt=R\W
 wneu=ATan2(dx,dy)

 Local inc#=(r\speedmax/r\speed)*2.0+5.0

 R\W=curveangle#( wneu,walt,inc)

 r\dx=Sin(R\W)
 r\dy=Cos(R\W)

 ;Richtung zum Ziel
 ;Local l=300
 ;Color 128,128,128
 ;Line r\px,r\py,r\px+(l*r\dx) , r\py+(l*r\dy)

End Function

Function RaketenZeigen()

 ;Alle Raketen zeigen
 
 For Rakete.RaketeType =Each RaketeType
  RaketeZeigen Rakete   
 Next

End Function

Function RaketeZeigen(R.RaketeType)

 Local l#=10 ;Länge Rakete

 Color 255,255,0
 ;Schweif in die entgegengesetzte Richtung !
 Line r\px, r\py , r\px-(l*r\dx) , r\py-(l*r\dy)

 ;Punkt alt Raketenkopf :-)
 Color 255,0,0
 Plot r\px,r\py

End Function

Function SchiffeZeigen()

 ;Zeigt alle Schiffe

 For Schiff.SchiffType =Each SchiffType
  SchiffZeigen Schiff   
 Next

End Function

Function SchiffZeigen(S.SchiffType)

 ;zeichnet das Schiff

 Local l=20 ;Schiff länge

 If S\Sinkt=False Then
  Color s\FarbeR,s\FarbeG,s\FarbeB
 Else
  Color 128,128,128
 EndIf
 Line s\px,s\py,s\px-s\dx*l,s\py-s\dy*l

 ;Kopf des Schiffes
 Color 255,255,255
 Plot s\px,s\py

End Function

Function BumNew(x,y,S.SchiffType,Staerke#)

 ;Neuen Treffer zeigen und Ziel an Staerke abziehen , wenn Ziel kaputt dann wird Schiff\Sinkt=True
 
 Bum.BumType=New BumType

 Bum\TimeOut=100
 Bum\x=x
 Bum\y=y
 Bum\TargetSchiff=s
 If Bum\TargetSchiff\Staerke>0 Then
  Bum\TargetSchiff\Staerke=Bum\TargetSchiff\Staerke-Staerke
  If Bum\TargetSchiff\Staerke<=0 Then Bum\TargetSchiff\Staerke=0:Bum\TargetSchiff\Sinkt=True
 EndIf

End Function

Function BumUpdate()

 ;Treffer sollen nicht ewig sichtbar sein

 For Bum.BumType=Each BumType
  If Bum\TimeOut>0 Then
   Bum\TimeOut=Bum\TimeOut-1
  Else
   Delete Bum
  EndIf
 Next

End Function

Function BumZeigen()

 ;Treffer zeigen

 Local x#,y#

 For Bum.BumType=Each BumType
 
  Color 255,255,0
 
  x=Bum\x
  y=Bum\y
   
  Oval x-4,y-4,8,8

 Next

End Function

Function curveangle#(newangle#,oldangle#,increments#)

 ;Elegante Lösung um die Winkel differenz heraus zu bekommen
 ;Mit increments kann man die gesamt Winkeldifferenz teilen das kleine Schritte möglich sind

 If (oldangle+360)-newangle<NEWANGLE-OLDANGLE Then OLDANGLE=360+OLDANGLE
 If (newangle+360)-oldangle<OLDANGLE-NEWANGLE Then NEWANGLE=360+NEWANGLE
 oldangle=oldangle-(oldangle-newangle)/increments
 Return oldangle

End Function

Function Entf#(x1#,y1#,x2#,y2#)

 ;Entfernung zwischen Punkt 1 und 2

 Local dx#,dy#

 dx=x2-x1
 dy=y2-y1

 Return Sqr(dx*dx+dy*dy)

End Function
 

Edlothiol

BeitragDi, Feb 24, 2004 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, ich glaube, das meinte ich nicht Confused
Das mit der Richtung der Geschosse und so klappt alles schon längst, nur gibts jetzt bei der KI Probleme. Die Geschosse fliegen (meistens) in geraden Bahnen. Die Richtung eines Geschosses wird sowohl von der Bewegungsrichtung des Raumschiffes, das es abschießt, und von dessen Richtung (in die es zeigt) beeinflusst. Am Besten siehe Duel.
Jetzt möchte ich, dass die KI diese Formel nutzt, um die Gegner zu treffen. Also hab ich sie nach s\angle aufgelöst, um rauszufinden, in welche Richtung das Raumschiff zeigen muss. Das klappt jedoch so nicht: Nur in ca. der Hälfte aller Fälle trifft die KI. Deshalb meine Frage, was ich falsch gemacht habe.
 

Edlothiol

BeitragDi, Feb 24, 2004 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe noch ein bisschen mehr rausgefunden:
Code: [AUSKLAPPEN]
(2.0*dx-s\dx) / float(Bullet_vel)

scheint kein gültiger Eingabewert für ACos zu sein; es kommt fast immer NaN raus. Nochmal, kann mir irgendjemand sagen, welchen Fehler ich gemacht habe?
 

Edlothiol

BeitragMi, Feb 25, 2004 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Letztendlich hab ich den Fehler gefunden:
Ich hab angenommen, dass dx immer ein Vielfaches von Bullet_vel sein müsste, d.h. die Geschwindigkeit der Geschosse immer konstant ist Mad
Ist sie aber nicht, sie wird ja durch die Geschwindigkeit des Raumschiffes auch noch beeinflusst Mad
Naja, könnte mir jemand diese Formel nach s\angle auflösen (oder mir sagen, dass es nicht geht), ich kriegs nämlich nicht hin?
Code: [AUSKLAPPEN]
dx = Cos(ATan(  (Sin(s\angle) * 0.5 * Bullet_vel + s\dy*0.5)     /    (Cos(s\angle) * 0.5 * Bullet_vel + s\dx*0.5)  ))

Wenn das nicht geht, werd ich wohl jeden möglichen Winkel durchgehen und schauen ob er passt. Hoffe, dass das von der Performance her geht Confused

Ctuchik

BeitragMi, Feb 25, 2004 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich kriegs net hin!
Hab auch nen anderen Weg versucht aber s kommt nix gescheites raus!
Ich müsste wíssen wie man den Winkel bei der Addition von Kräften rauskriegt, damit könnte man es wahrscheinlich machen!
Ich denk weiter drüber nach...

mfG Ctuchik!

Markus2

BeitragDo, Feb 26, 2004 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
@Edlothiol
Ich glaube du denkst zu kompliziert Wink
 

Edlothiol

BeitragDo, Feb 26, 2004 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, warum? Rolling Eyes

Ctuchik

BeitragDo, Feb 26, 2004 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann es sein, dass das gar nicht geht?
Kann es sein dass man nur durch verändern des Winkels nicht aus allen Positionen treffen kann?
Ich komm zu keinem Ergebnis!
Mir fällt nix mehr ein!
 

Edlothiol

BeitragDo, Feb 26, 2004 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht. Ich weiß es nicht. Naja, ich werds auf anderem Weg versuchen, trotzdem danke...



Edit: Hm, wenn ichs mir recht überlege, ist das logisch: Wenn man nur schnell genug fliegt, kann man nicht mehr nach hinten schießen. Zum Bleispiel.

Markus2

BeitragDi, März 02, 2004 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@Edlothiol
Zitat:
dx = Cos(ATan( (Sin(s\angle) * 0.5 * Bullet_vel + s\dy*0.5) / (Cos(s\angle) * 0.5 * Bullet_vel + s\dx*0.5) ))


Sag mal was das bewirken soll .

@Ctuchik
Zitat:
Ich müsste wíssen wie man den Winkel bei der Addition von Kräften rauskriegt, damit könnte man es wahrscheinlich machen!


Wenn man diese zwei Richtungs Vectoren(der Kräfte) addiert hat man
einen gesamt Vector und einen Winkel .
 

Edlothiol

BeitragDi, März 02, 2004 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Formel innendrin ist die zur Berechnung der Bewegung(srichtung) eines Geschosses. Aussenrum ist das Atan und das Cos, um die Richtung auf eine einheitliche Länge zu bringen, die ich kenne. Ich kann das richtige dx (einfach nur die rechte Formel im Atan) ja nicht einfach berechnen, da es völlig variieren kann. Also berechne ich den Winkel, und daraus wieder den Kosinus, um es auf die Länge 1 zu bringen. Ich könnte den Cos auch weglassen und nur mit dem Winkel rechnen. Bringt aber auch nichts.
Ich glaub nicht dass ich das jetzt gut erklärt habe Neutral

Ctuchik

BeitragDi, März 02, 2004 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Weisst du was, ám besten änderst du die Geschossrichtung nach dem Abschuss bei dem Spiel!
Es sieht sowieso ein bischen seltsam aus, weil dei Schüsse viel zu stark von der Planetenanziehung beeinflusst werden!
Die Schüsse kommen dann total schräg aus dem Raumschiff und bremsen zu stark ab!
 

Edlothiol

BeitragMi, März 03, 2004 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt nicht nur an der Planetenanziehung. Die Richtung der Schüsse wird ja auch von der Bewegungsrichtung der Raumschiffe beeinflusst. Und ich glaub, ich werd das so lassen Smile

Markus2

BeitragFr, März 05, 2004 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Edlothiol hat Folgendes geschrieben:
...Ich glaub nicht dass ich das jetzt gut erklärt habe Neutral


Ne , nicht wirklich ,
wenn du den Richtungs Vector hast normierst du ihn also auf
die länge 1 ?


Sind deine Geschosse jetzt gelenkt oder nicht ?
Das die zus. noch abgelenkt werden habe ich mitbekommen .
 

Edlothiol

BeitragFr, März 05, 2004 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau das meinte ich.
Die Geschosse sind nicht gelenkt, normalerweise (von der KI angenommen) fliegen sie in geraden Bahnen.

Markus2

BeitragFr, März 05, 2004 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok,

wäre dann so wenn diese noch durch Planeten abgelenkt werden .

dx=TargetX-SchussX
dy=TargetY-SchussY

w=ATan2(dx,dy) 'da soll der Schuss hin

dx=PlanetX-SchussX
dy=PlanetY-SchussY

wa=ATan2(dx,dy) 'Winkel zum Planet

SchussSpeedX=((Sin(w)*0.9)+(Sin(wa)*0.1))*SchussSpeed
SchussSpeedY=((Cos(w)*0.9)+(Cos(wa)*0.1))*SchussSpeed

Also in der Theorie müßte 10% in Richtung Planet gehen !?
Muß ich gleich mal selber testen 8)

Markus2

BeitragFr, März 05, 2004 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Beispiel Smile Meine Theorie geht 8)

Code: [AUSKLAPPEN]

;Der krume Schuß :-)

Graphics 800,600
SetBuffer BackBuffer()

 Local dx#,dy#,w#,wa#
 Local SchussSpeed#
 Local SchussSpeedX#
 Local SchussSpeedY#

 SchussSpeed#=1

 Local SchussX#=400
 Local SchussY#=300

 Local TargetX#=400
 Local TargetY#=200

 Local PlanetX#=500
 Local PlanetY#=250

While Not KeyHit(1)

 Cls

 dx=TargetX-SchussX
 dy=TargetY-SchussY

 w=ATan2(dx,dy) ;da soll der Schuss hin

 dx=PlanetX-SchussX
 dy=PlanetY-SchussY

 wa=ATan2(dx,dy) ;Winkel zum Planet

 Color 255,255,255
 Text 10,10,w
 Text 10,20,wa

 SchussSpeedX=((Sin(w)*0.8)+(Sin(wa)*0.2))*SchussSpeed
 SchussSpeedY=((Cos(w)*0.8)+(Cos(wa)*0.2))*SchussSpeed

 SchussX=SchussX+SchussSpeedX
 SchussY=SchussY+SchussSpeedY

 Color 255,255,0
 Plot PlanetX,PlanetY

 Color 0,255,0
 Plot SchussX,SchussY

 Color 255,0,0
 Plot TargetX,TargetY

 Flip

Wend
End
 

Edlothiol

BeitragFr, März 05, 2004 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, toll, und was soll ich jetzt damit?
Ausserdem wird die Austrittsrichtung nicht von den Planeten beeinflusst, nur später wirkt noch Gravitation auf sie ein.

Markus2

BeitragSa, März 06, 2004 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest noch die entfernung zum Planeten hinzu nehmen
und die Gewichtung ändern das die Ausrichtung nicht sofort
zu sehen ist .
In dem Beispiel sind die Punkte ja auch nah beisammen .

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group