zielsuchende Raketen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

CodeMaster

Betreff: zielsuchende Raketen

BeitragDo, Feb 23, 2006 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Frage an euch: Hat zufällig jemand eine Ahnung oder eine Idee, wie man am besten eine autonome zielsuchende Rakete programmiert, die unter halbwegs korrekten physikalischen Bedingungen (d.h. Schwerkraft, Trägheit etc.) ein frei bewegliches Ziel treffen kann?
Mein Ansatz dazu ist folgender:Code: [AUSKLAPPEN]
Global g# = 9.80665, Wind# = 0
Global GameSpeed# = 1, FrameTime#, GameTimer%, LastTimer%

Global Missile_Fuel = 100
Global Missile_MaxThrust = 30
Global Missile_Weight = 20

Type TParticle
  Field fX#
  Field fY#
  Field fSpdX#
  Field fSpdY#
  Field fWght#
  Field fCol%
  Field fLifetime%
  Field fStart%
  Field fGlow#
End Type

Type TMissile
  Field fX#
  Field fY#
  Field fSpdX#
  Field fSpdY#
  Field fLstAc#
  Field fAcc#
  Field fDir#
  Field fFuel#
  Field fTargetSort%
  Field fTarget
  Field fAimX#
  Field fAimY#
  Field fStart%
End Type

Graphics 800,600,0,2
SetBuffer BackBuffer()

music = LoadSound("1free1.wav")
LoopSound(music)
musicchannel = PlaySound(music)

While Not KeyDown(1)
  Cls
  If KeyHit(29) Then
    If Not bullet = 3 Then bullet = (bullet + 1) Mod 4
  EndIf
  If (bullet Mod 2) = 1 Then
    ctime = MilliSecs()
    If ctime - lastbullet > 10 Then bullettime# = bullettime# - 2 * Sgn(bullet - 2) : lastbullet = ctime
  EndIf
  If bullettime >= 90 Then bullet = 2 : bullettime = 90
  If bullettime <= 0 Then bullet = 0 : bullettime = 0
  GameSpeed = 1 - Sqr#(bullettime) / 10
  ChannelPitch(musicchannel, 44100 * (GameSpeed * 0.7 + 0.3))
  UpdateTimer
  If KeyHit(57) Then TMissile_Create(400,500,270,20,1,0,100,100)
  TMissile_Update
  TMissile_Show
  TParticle_Update
  TParticle_Show
  Text 0,0, "Time factor: " + GameSpeed
  Text 0,15,"Time stamp: " + GameTimer
  Text 0,30,"Bullettime: " + BulletTime
  Flip
Wend
End

Function UpdateScreen()
  Local lTime = MilliSecs()
  If lTime - LastFLip > 1000 / FramesPerSecond Then
    Flip False
    Cls
    LastFlip = lTime
    Return True
  EndIf
  Return False
End Function

Function UpdateTimer()
  Local lTimer% = MilliSecs() - LastTimer
  If GameSpeed < 0 Then GameSpeed = 0
  FrameTime = GameSpeed * lTimer / 1000.0
  GameTimer = GameTimer + Int(GameSpeed * lTimer)
  LastTimer = MilliSecs()
End Function


Function TMissile_Create.TMissile(pX#, pY#, pDir#, pSpd#, pTargetSort%, pTarget, pAimX#, pAimY#)
  Local lMissile.TMissile = New TMissile
  lMissile\fX = pX
  lMissile\fY = pY
  lMissile\fDir = pDir
  lMissile\fAcc = 0
  lMissile\fFuel = Missile_Fuel
  lMissile\fSpdX = Cos(pDir) * pSpd
  lMissile\fSpdY = Sin(pDir) * pSpd
  lMissile\fTargetSort = pTargetSort
  lMissile\fTarget = pTarget ;<----------------------------------------------
  lMissile\fAimX = pAimX
  lMissile\fAimY = pAimY
  lMissile\fStart = GameTimer
  Return lMissile
End Function

Function TMissile_Update()
  Local lMissile.TMissile
  Local lCurrentLifetime%
  Local lAngle#
  For lMissile = Each TMissile
    t = t + 1
    lCurrentLifetime = GameTimer - lMissile\fStart
    If lMissile\fY < GraphicsHeight() Then
      lMissile\fAimX = MouseX() ;<-------
      lMissile\fAimY = MouseY() ;<-------
      lAngle = turnto(lMissile\fX, lMissile\fY, lMissile\fAimX, lMissile\fAimY, lMissile\fDir)
      lMissile\fDir = lMissile\fDir + lAngle * FrameTime * 20
      If lMissile\fFuel > 0 Then
        lMissile\fAcc = 0
        If Abs(lAngle) < 10 Then lMissile\fAcc = 1 - Abs(lAngle) / 10.0
        lMissile\fFuel = lMissile\fFuel - lMissile\fAcc * Missile_Weight * FrameTime
      Else
        lMissile\fAcc = 0
      EndIf
      If GameTimer - lMissile\fLstAc > 5 Then
        For i = 1 To (Missile_MaxThrust / 5 * lMissile\fAcc) ;<-------
          TParticle_Create(lMissile\fX+Rnd(-2,2),lMissile\fY+Rnd(-2,2),lMissile\fDir+180+Rand(-10,10),lMissile\fAcc * Missile_MaxThrust,3,$ff5500,500)
        Next
        lMissile\fLstAc = GameTimer
      EndIf
      lMissile\fSpdX = lMissile\fSpdX - (lMissile\fSpdX / 4) * FrameTime + lMissile\fAcc * Missile_MaxThrust * Cos(lMissile\fDir) * 30 * FrameTime;lMissile\fSpdX + (lMissile\fAcc * Missile_MaxThrust * Cos(lMissile\fDir) * 5) * FrameTime
      lMissile\fSpdY = lMissile\fSpdY - (lMissile\fSpdY / 4) * FrameTime + lMissile\fAcc * Missile_MaxThrust * Sin(lMissile\fDir) * 30 * FrameTime + Missile_Weight * g * FrameTime;lMissile\fSpdY + (lMissile\fAcc * Missile_MaxThrust * Sin(lMissile\fDir) * 5 + Missile_Weight * g / 100) * FrameTime
      lMissile\fX = lMissile\fX + lMissile\fSpdX * FrameTime / 2
      lMissile\fY = lMissile\fY + lMissile\fSpdY * FrameTime / 2
    Else
      Delete lMissile
    EndIf
  Next
End Function

Function TMissile_Show()
  Local lMissile.TMissile
  For lMissile = Each TMissile
    Oval lMissile\fX-8,lMissile\fY-8,16,16,0
    Line lMissile\fX, lMissile\fY, lMissile\fX + Cos(lMissile\fDir) * 8, lMissile\fY + Sin(lMissile\fDir) * 8
    Rect lMissile\fX + 10, lMissile\fY + 10, 5, 10, 0
    Rect lMissile\fX + 10, lMissile\fY + 10, 5, lMissile\fFuel / Float(Missile_Fuel) * 10, 1
  Next
End Function

Function TParticle_Create.TParticle(pX#, pY#, pDir#, pSpd#, pWght#, pCol%, pLifetime%)
  Local lParticle.TParticle = New TParticle
  lParticle\fX = pX
  lParticle\fY = pY
  lParticle\fSpdX = Cos(pDir) * pSpd
  lParticle\fSpdY = Sin(pDir) * pSpd
  lParticle\fWght = pWght
  lParticle\fCol = pCol
  lParticle\fLifetime = pLifetime
  lParticle\fStart = GameTimer
  lParticle\fGlow = 1
  Return lParticle
End Function

Function TParticle_Update()
  Local lParticle.TParticle
  Local lCurrentLifetime%
  For lParticle = Each TParticle
    lCurrentLifetime = GameTimer - lParticle\fStart
    If (lCurrentLifetime < lParticle\fLifetime) And (lParticle\fX >= 0) And (lParticle\fY >= 0) And (lParticle\fX < GraphicsWidth()) And (lParticle\fY < GraphicsHeight()) Then
      lParticle\fSpdX = lParticle\fSpdX - lParticle\fSpdX * 0.65 * FrameTime + Wind * 10 * FrameTime
      lParticle\fSpdY = lParticle\fSpdY + lParticle\fWght * g * FrameTime
      lParticle\fX = lParticle\fX + (lParticle\fSpdX * 5 + Rnd(-10,10)) * FrameTime
      lParticle\fY = lParticle\fY + (lParticle\fSpdY * 5 + Rnd(-10,10)) * FrameTime
      lParticle\fGlow = 1 - (lCurrentLifetime / Float(lParticle\fLifetime))^2
    Else
      Delete lParticle
    EndIf
  Next
End Function

Function TParticle_Show()
  Local lParticle.TParticle
  Local lR, lG, lB
  LockBuffer()
  For lParticle = Each TParticle
    If (lParticle\fX >= 0) And (lParticle\fY >= 0) And (lParticle\fX < GraphicsWidth()) And (lParticle\fY < GraphicsHeight()) Then
      lR = (lParticle\fCol And $FF0000) / $10000 * lParticle\fGlow
      lG = (lParticle\fCol And $FF00) / $100 * lParticle\fGlow
      lB = (lParticle\fCol And $FF) * lParticle\fGlow
      WritePixelFast(lParticle\fX, lParticle\fY, lR * $10000 + lG * $100 + lB)
    EndIf
  Next
  UnlockBuffer()
End Function


Function turnto(x1#,y1#,x2#,y2#,dir#)
 Temp# = (90 - ATan2(x2#-x1#,y2#-y1#) - dir# + 360) Mod 360
 If Temp# > 180 Then Temp# = Temp# - 360
 Return Temp
End Function
(Leertaste zum Starten einer Rakete, Maus ist das Ziel. Goodie: Linke STRG-Taste bewirkt einen Bullettime-Effekt, der durch einen Hintergrundbeat (http://www.hooverwebdesign.com/sounds/1free1.wav) noch verstärkt wird)

Das Problem an meinem Ansatz ist die durch die Trägheit bedingte Zielungenauigkeit, sodass es nicht selten passiert, dass die Raketen entweder über oder unter dem Ziel vorbeifliegen oder ständig drumherum kreisen. Zum Ausgleichen habe ich bereits eingebaut, dass die Raketen nur in einem bestimmten Anflugkorridor Gas geben, das heißt, dass nur beschleunigt wird, wenn das Ziel nur wenige Grad von Raketenkurs abweicht.
Und eine Rakete, die einfach stupide hinter einem Ziel hinterherfliegt - also ohne Trägheit und Schwerkraft - möchte ich nicht haben.

Jemand ne Idee?
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

aMul

Sieger des Minimalist Compo 01/13

BeitragDo, Feb 23, 2006 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest abfragen, wie weit die Rakete vom Ziel entfernt ist.
Ab einer bestimmten Entfernung könntest du sie grade drauf zu fliegen lassen, oder zumindest die Ungenauigkeit verringern...

EDIT:
Habs mir mal angeschaut. Sieht schon ganz gut aus.
Aber vieleicht solltest du die Trägheit runterstellen, sonst driften die Raketen zu weit...
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 23, 2006 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also dazu habe ich schon so einiges gemacht... *versuche sie mal zu erklären*

1) Jeden Rakette hat eine Position, eine Geschwindigkeit, eine Rotationsposition und eine Rotationsgeschwindigkeit. Diese Variante ist die am 'realistischten' aber in Form von einer intelligenten Zielsuchsteuerung schwer zu programmieren... Habe dieses so lösen können. Mit Atan2 wird deie relative Richtung des Ziels gesucht und danach in die Richtung gesteuert. Wichtig ist hier das nicht plump +/- irgendwas genommen wird, sondern die Geschwinigkeit zu Einlenkung zum Ziel in der nähe des Visirs zunimmt! Da sonst ein ewiges umkreisen des Ziels die Folge sein kann. Ausserdem wird bei naher Verfehlung des Ziels (zB Ziel hat sich im letzten Moment zur Seite bewegt), erst ein gewisser Abstand abgeflogen um den nächsten Angriff nicht mit zusätzlich seitlichen Eigenbewegungen zu kämpfen... Das Resultat ist echt schon anzusehen, vorallem weil im längerem Flug die Rakette erst mal ausrichten müssen was leichte Schlenderbewegungen mit sich zieht das ganz gut aussieht...

2) Jede Rakette hat eine Position, eine Geschwindigkeit und eine Rotationsposition. Hier wird auf die Rotationsgeschwindigkeit verzichtet. Das Problem dabei ist, daß bei einem ungenauem Abschiessen der Raketten, die Raketten das Ziel nie treffen, weil sie ständig um das Ziel umher fliegen. Problemlösung dazu. Das Ziel 'virtuel' verlagern. Das Verlagern muß in entgegengesetzter Richtung der eigenen Fluggeschwindigkeit geschehen. Also wenn die Rakette mit einer Geschwindigkeit von x=+2 und y=0 fliegt, dann muß das virtuelle Ziel nach links verschoben werden, damit es auch getroffen wird. Die 'Verstärkung' der Verschiebung sollte von dem Abstand des Ziel abhängig gemacht werden... Beim Anflug dieser Rakettentypen erscheinen diese 'intelligenter' aber nicht so schön... Ausserdem kann es bei Nahkämpfen dazu kommen das das Ziel verfehlt wird.

Falls Beispielcode dazu gewünscht ist, kann ich die beiden mal hier rein stellen... Aber seid gewarnt! Es ist für mich nur ein Test gewesen wie man sowas machen kann und wie was aussieht. Dementsprechend ist der Code auch schnell mal eingehackt worden... Die Beschreibungen sollten genügen. Würde mich aber interessieren wie andere das gelöst haben...

/EDIT: Habe mir mal dein Code nochmal angeschaut... Das enspricht sowas ähnliches wie mein zweites Beispiel. Wenn du jetzt noch das Ziel virtuell zur engegengesetzten Richtung der eingenen Flugrichtung der Rakette berlagerst und den Abstand dazu noch berücksichtigst, dann sollte die Rakette schon ganz gut treffen...
  • Zuletzt bearbeitet von hectic am Do, Feb 23, 2006 22:20, insgesamt einmal bearbeitet

aMul

Sieger des Minimalist Compo 01/13

BeitragDo, Feb 23, 2006 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest du zum 1. Punkt einen Beispielcode posten?
Würd mich mal interesieren wie dus genau programiert hast...
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 23, 2006 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gewünscht, hier der Code... 'Die grünliche Rakette ist eine Arschlochrakette'. Haut erst ab und tut so als würde es sie nicht interessieren, um dann plötzlich wiedermal anzugreifen... Wink Hat aber nicht mehr viel mit Realität zu tun, also nur die anderen beiden beobachten... Und wie gesagt, der Code ist nur zu Testzwecken mal schnell eingehackt worden... Mit dem Dim-Array ki# wird die Steuerungssensibilisierung einzelner Winkel angegeben...

Code: [AUSKLAPPEN]
Graphics 1024,768,32,1
SetBuffer BackBuffer()

Dim xp1#(255)
Dim yp1#(255)
Dim xg1#(255)
Dim yg1#(255)
Dim xp2#(255)
Dim yp2#(255)
Dim xg2#(255)
Dim yg2#(255)
Dim xp3#(255)
Dim yp3#(255)
Dim xg3#(255)
Dim yg3#(255)

rxp1#=140
ryp1#=40
rxg1#=0
ryg1#=0
rrp1#=0
rrg1#=0

rxp2#=984
ryp2#=40
rxg2#=0
ryg2#=0
rrp2#=0
rrg2#=0

rxp3#=500
ryp3#=484
rxg3#=0
ryg3#=0
rrp3#=0
rrg3#=0

mx#=0
my#=0
wk1#=0
wk2#=0
wk3#=0

Dim ki#(40)
ki(00)=0.5
ki(01)=1
ki(02)=1.5
ki(03)=2
ki(04)=2.5
ki(05)=3
ki(06)=3
ki(07)=3
ki(08)=3
ki(09)=3
ki(10)=3
ki(11)=3
ki(12)=3
ki(13)=3
ki(14)=3
ki(15)=3
ki(16)=3
ki(17)=3
ki(18)=2
ki(19)=1
ki(20)=0
ki(21)=-1
ki(22)=-2
ki(23)=-3
ki(24)=-3
ki(25)=-3
ki(26)=-3
ki(27)=-3
ki(28)=-3
ki(29)=-3
ki(30)=-3
ki(31)=-3
ki(32)=-3
ki(33)=-3
ki(34)=-3
ki(35)=-3
ki(36)=-2.5
ki(37)=-2
ki(38)=-1.5
ki(39)=-1
ki(40)=-0.5

Delay 1000
MoveMouse 512,384



While Not KeyHit(1)

 For q=0 To 254
  xp1(q)=xp1(q+1)
  yp1(q)=yp1(q+1)
  xg1(q)=xg1(q+1)
  yg1(q)=yg1(q+1)
  xg1(q)=xg1(q)/1.004
  yg1(q)=yg1(q)/1.004
  xp1(q)=xp1(q)+xg1(q)
  yp1(q)=yp1(q)+yg1(q)
  Color q,q,q:Plot xp1(q),yp1(q)
  xp2(q)=xp2(q+1)
  yp2(q)=yp2(q+1)
  xg2(q)=xg2(q+1)
  yg2(q)=yg2(q+1)
  xg2(q)=xg2(q)/1.004
  yg2(q)=yg2(q)/1.004
  xp2(q)=xp2(q)+xg2(q)
  yp2(q)=yp2(q)+yg2(q)
  Color q,q,q:Plot xp2(q),yp2(q)
  xp3(q)=xp3(q+1)
  yp3(q)=yp3(q+1)
  xg3(q)=xg3(q+1)
  yg3(q)=yg3(q+1)
  xg3(q)=xg3(q)/1.004
  yg3(q)=yg3(q)/1.004
  xp3(q)=xp3(q)+xg3(q)
  yp3(q)=yp3(q)+yg3(q)
  Color q,q,q:Plot xp3(q),yp3(q)
 Next

 mx=MouseX()
 my=MouseY()

 wk1=(ATan2(mx-rxp1,my-ryp1))
 wk2=(ATan2(mx-rxp2,my-ryp2))
 wk3=(ATan2(mx-rxp3,my-ryp3))
 rrg1=(rrg1+ki(20-Sin(wk1-rrp1)*20)/10)/1.2
 rrg2=(rrg2+ki(20-Sin(wk2-rrp2)*20)/200)/1.01
 rrg3=(rrg3+ki(20-Sin(wk3-rrp3)*20)/200)/1.01
 rrp1=rrp1+rrg1
 rrp2=rrp2+rrg2
 rrp3=rrp3+rrg3

;For q=0 To 40
;Rect 306+q*10,0,10,10,0
;Next
;Rect 306+Int(20-Sin((wk-rrp1)*2)*20)*10,0,10,10,1
;Rect 486-Int(ki(20-Sin((wk-rrp1)*2)*20)*50),10,50,10,1

 rxg1=(rxg1+Sin(rrp1)/8)/1.1
 rxg2=(rxg2+Sin(rrp2)/80)/1.01
 rxg3=(rxg3+Sin(rrp3)/80)/1.01
 ryg1=(ryg1+Cos(rrp1)/8)/1.1
 ryg2=(ryg2+Cos(rrp2)/80)/1.01
 ryg3=(ryg3+Cos(rrp3)/80)/1.01
 rxp1=rxp1+rxg1
 rxp2=rxp2+rxg2
 rxp3=rxp3+rxg3
 ryp1=ryp1+ryg1
 ryp2=ryp2+ryg2
 ryp3=ryp3+ryg3

 Color 120,240,120:Line rxp1-Sin(rrp1)*6,ryp1-Cos(rrp1)*6,rxp1+Sin(rrp1)*8,ryp1+Cos(rrp1)*8
 Color 240,240,240:Line rxp2-Sin(rrp2)*6,ryp2-Cos(rrp2)*6,rxp2+Sin(rrp2)*8,ryp2+Cos(rrp2)*8
 Color 240,240,240:Line rxp3-Sin(rrp3)*6,ryp3-Cos(rrp3)*6,rxp3+Sin(rrp3)*8,ryp3+Cos(rrp3)*8
 Color 255,000,000:Line rxp1-Sin(rrp1)*8,ryp1-Cos(rrp1)*8,rxp1-Sin(rrp1)*6,ryp1-Cos(rrp1)*6
 Color 255,000,000:Line rxp2-Sin(rrp2)*8,ryp2-Cos(rrp2)*8,rxp2-Sin(rrp2)*6,ryp2-Cos(rrp2)*6
 Color 255,000,000:Line rxp3-Sin(rrp3)*8,ryp3-Cos(rrp3)*8,rxp3-Sin(rrp3)*6,ryp3-Cos(rrp3)*6
 xp1(255)=rxp1-Sin(rrp1)*8
 xp2(255)=rxp2-Sin(rrp2)*8
 xp3(255)=rxp3-Sin(rrp3)*8
 yp1(255)=ryp1-Cos(rrp1)*8
 yp2(255)=ryp2-Cos(rrp2)*8
 yp3(255)=ryp3-Cos(rrp3)*8
 xg1(255)=Rnd(-.1,.1)+rxg1-Sin(rrp1)*2
 xg2(255)=Rnd(-.1,.1)+rxg2-Sin(rrp2)*2
 xg3(255)=Rnd(-.1,.1)+rxg3-Sin(rrp3)*2
 yg1(255)=Rnd(-.1,.1)+ryg1-Cos(rrp1)*2
 yg2(255)=Rnd(-.1,.1)+ryg2-Cos(rrp2)*2
 yg3(255)=Rnd(-.1,.1)+ryg3-Cos(rrp3)*2

 Oval mx-12,my-12,25,25,0
 Flip 0
 Cls
Wend
End
 

Florian

BeitragDo, Feb 23, 2006 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
1. So nähner die Paketen den Zeil sind, um so langsamer solten Sie werden.

2. In einen bestimmten Zeitabstand sollten die Raketen die Richtung korrigieren.
Je näher die Paketen den Zeil sind, um so kleiner wird der Zeitaabstand.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Feb 23, 2006 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
@Florian, warum sollten die Raketen langsamer werden wenn sie dem Ziel näher gekommen sind? Raketen sollten eigentlich immer nur schneller werden wenn sie in eine Richtung fliegen! Geben ja ständig Schub! Mir ist keine Rakete bewust die während des Fluges den Antrieb abschalten kann... Rolling Eyes ...Das mit den Zeitabständen halte ich für Überflüssig. Denn dann könnte es zu unschönen Flugmuster kommen, wenn sie aus großer Entfernung abgeschossen werden. Sowas mit kreisendem Muster und nie das Ziel erreich, bis der Treibstoff alle ist...

Firstdeathmaker

BeitragDo, Feb 23, 2006 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte so ein ähnliches Problem mal bei einem Spiel von mir, da allerdings mit Gegnersteuerungsroutinen. Gelöst habe ich es einigermaßen, indem ich den Gegner vorberechnen hab lassen, wo er beim Ziel ankommen würde wenn er den momentanen Kurs halten würde, und danach dann den Kurs durch entsprechende Manöver korrigiert. Ging ganz gut so.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

CodeMaster

BeitragFr, Feb 24, 2006 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke euch für eure Antworten und werde mir das ganze morgen mal etwas genauer zu Gemüte führen - sieht sehr vielversprechend aus. Was ich aber in jedem Fall einbauen möchte, ist Schwerkraft, die die Raketen in ihren Flugbahnen beeinflusst und sie schließlich, wenn sie keinen Treibstoff mehr haben und das Ziel nicht getroffen wurde, zu Boden fallen lässt.
Weiß jemand zufällig, wie echte zielsuchende Raketen gesteuert werden? Die werden ja wohl kaum immer einfach auf das Ziel hin beschleunigen...
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Feb 24, 2006 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, im Grunde machen die nichts anderes... Nur das da Steuereinheiten installiert sein müssen die der Rakete sagen wie die momentane Lage ist etc... Nähere Informationen dazu findet man unter Wikipedia Beispiel: http://de.wikipedia.org/wiki/AIM-9_Sidewinder oder http://de.wikipedia.org/wiki/Raketentechnik nicht zu venachlässigen ist aber, das diese Steuereinheiten komplexer sind als die der Raumfahrt...

Xaron

BeitragFr, Feb 24, 2006 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, so komplex auch nicht. Die Sidewinder-Raketen übersteuern einfach um 15°...

Hier mal ein Stück Code aus meinem Spiel. Damit wird der Vorhaltewinkel berechnet, bzw. der Punkt, an dem sich das Ziel bei gleichbleibender Geschwindigkeit und Richtung mit dem Projektil treffen wird:

Code: [AUSKLAPPEN]

;Richtung vom Abschusspunkt zum Ziel bestimmen
sourcePosX# = EntityX#( pShip\entity )
sourcePosY# = EntityY#( pShip\entity )
sourcePosZ# = EntityZ#( pShip\entity )
targetPosX# = EntityX#( gTargetShipList\ship\entity )
targetPosY# = EntityY#( gTargetShipList\ship\entity )
targetPosZ# = EntityZ#( gTargetShipList\ship\entity )
dirX# = targetPosX# - sourcePosX#
dirY# = targetPosY# - sourcePosY#
dirZ# = targetPosZ# - sourcePosZ#
;Diskriminante des Terms für die Zeit berechnen.
;Wenn sie kleiner als null ist, dann ist es nicht möglich, das Ziel zu treffen.
;Das kann zum Beispiel passieren, wenn das Ziel schneller als das Geschoss ist.
;Wir liefern dann einfach die Position des Ziels als Zielvektor zurück.
targetVelX# = TOKRB_GetVelocityX#( gTargetShipList\ship\tokHandle )
targetVelY# = TOKRB_GetVelocityY#( gTargetShipList\ship\tokHandle )
targetVelZ# = TOKRB_GetVelocityZ#( gTargetShipList\ship\tokHandle )
dirLengthSq# = dirX*dirX + dirY*dirY + dirZ*dirZ
crossX# = dirY * targetVelZ - dirZ * targetVelY
crossY# = dirZ * targetVelX - dirX * targetVelZ
crossZ# = dirX * targetVelY - dirY * targetVelX
crossLengthSq# = crossX*crossX + crossY*crossY + crossZ*crossZ
targetX# = 0.0
targetY# = 0.0
targetZ# = 0.0
discriminant# = WEAPON_PLASMA_SPEED_SQ * dirLengthSq - crossLengthSq
If( discriminant < 0.0 )
  targetX# = targetPosX#
  targetY# = targetPosY#
  targetZ# = targetPosZ#
Else
  ;Zeit des Treffers berechnen
  dot# = dirX * targetVelX + dirY * targetVelY + dirZ * targetVelZ
  targetSpeedSq# = targetVelX*targetVelX + targetVelY*targetVelY + targetVelZ*targetVelZ
  hitTime# = ( Sqr( discriminant ) + dot ) / ( WEAPON_PLASMA_SPEED_SQ - targetSpeedSq )
  ;Zielvektor berechnen
  targetX# = targetPosX + hitTime * targetVelX
  targetY# = targetPosY + hitTime * targetVelY
  targetZ# = targetPosZ + hitTime * targetVelZ
End If
;Ergebnisvektor aufs HUD projizieren
CameraProject( gCockpitCam, targetX, targetY, targetZ )
DrawImage( gImgHudTargetVector, ProjectedX#()-8, ProjectedY#()-8 )


Gruß - Xaron
Cerberus X - Monkey X Reloaded!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group