Geschossrichtung
Übersicht

EdlothiolBetreff: Geschossrichtung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mal wieder ein Problem mit der Duel - KI:
Ich möchte natürlich, dass die Gegner gut treffen ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm, ich glaube, das meinte ich nicht ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Ist sie aber nicht, sie wird ja durch die Geschwindigkeit des Raumschiffes auch noch beeinflusst ![]() 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 ![]() |
||
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Edlothiol
Ich glaube du denkst zu kompliziert ![]() |
||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm, warum? ![]() |
||
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Edlothiol hat Folgendes geschrieben: ...Ich glaub nicht dass ich das jetzt gut erklärt habe
![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genau das meinte ich.
Die Geschosse sind nicht gelenkt, normalerweise (von der KI angenommen) fliegen sie in geraden Bahnen. |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit Beispiel ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 . |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group