zielsuchende Raketen
Übersicht BlitzBasic Allgemein
CodeMasterBetreff: zielsuchende Raketen |
Do, Feb 23, 2006 21:11 Antworten mit Zitat |
|
---|---|---|
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
(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)
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 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 |
aMulSieger des Minimalist Compo 01/13 |
Do, Feb 23, 2006 21:14 Antworten mit Zitat |
|
---|---|---|
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 |
hecticSieger des IS Talentwettbewerb 2006 |
Do, Feb 23, 2006 22:16 Antworten mit Zitat |
|
---|---|---|
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
aMulSieger des Minimalist Compo 01/13 |
Do, Feb 23, 2006 22:19 Antworten mit Zitat |
|
---|---|---|
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 |
hecticSieger des IS Talentwettbewerb 2006 |
Do, Feb 23, 2006 22:26 Antworten mit Zitat |
|
---|---|---|
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... 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 |
Do, Feb 23, 2006 22:30 Antworten mit Zitat |
|
---|---|---|
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. |
||
hecticSieger des IS Talentwettbewerb 2006 |
Do, Feb 23, 2006 22:46 Antworten mit Zitat |
|
---|---|---|
@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... ...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 |
Do, Feb 23, 2006 23:04 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Feb 24, 2006 0:09 Antworten mit Zitat |
|
---|---|---|
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 |
hecticSieger des IS Talentwettbewerb 2006 |
Fr, Feb 24, 2006 1:00 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Feb 24, 2006 9:45 Antworten mit Zitat |
|
---|---|---|
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! |
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group