raumschiffe, raketen etc drehen ... (bes. fetze gefragt)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Alfadur

Betreff: raumschiffe, raketen etc drehen ... (bes. fetze gefragt)

BeitragMi, März 03, 2004 3:51
Antworten mit Zitat
Benutzer-Profile anzeigen
aloa...

ihr müßt mir helfen, denn ich komme nicht weiter... und dabei probiere ich schon solange rum... *Seufz*

situation :

mein raumschiff steht in der mitte, mit der nase nach rechts...das is die 0° stellung ... das gegnerische raumschiff steht etwas weiter rechts, auch in der 0° stellung, ergo mit der nase nach rechts....tja, alles was ich jetzt gerne hätte, wäre das das feindliche raumschiff sich langsam aber sicher mit der nase um 180° dreht, und am ende mit der nase richtung mein eigenes raumschiff zeigt. das is natürlich einfach, aber irgendwie schaff ichs nicht das für jede beliebige position zu machen. also wenn mein schiff bei 100,100 steht und das feindliche bei 500,434 und ca 67° (zeigt ca nach unten-unten-rechts) drauf hat ...

mich würde mal interessieren wie fetze das problem gelöst hat, ich hab mir startrade noch nicht angeschaut (läd noch) ... aber irgendwie muß er ja auch vor dem problem gestanden haben ...
A Cray is the only computer that runs an endless loop in less than four hours.

Blatolo

BeitragMi, März 03, 2004 7:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du den Winkel haben willst den du haben musst um auf einen bestimmten Punkt zu zeigen ist die ATAN2 Funktion sehr hilfreich.
Winkel#=(ATAN2(y#,x#)+360) MOD 360
y und x sind die Abstände der Punkte, also
x=ziel_x-start_x
y=ziel_y-start_y
Dabei ist nach rechts zeigen schon die 0° Stellung und der Winkel wird im Uhrzeigersinn größer.
Hoffe dass es das ist was du meintest

Alfadur

BeitragMi, März 03, 2004 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
tja, das is nur ein teil davon, und zwar der teil den ich schon selbst gelöst hatte. also den winkel in den das feindliche schiff zeigen muß, den hab ich schon selbst rausgefunden, mit der von dir genannten formel...

ich hab mir mal den code zum austesten, wer es probieren will braucht noch ein bild, "raumschiff1.bmp" ... das kann ja zu testzwecken jedes bild sein, hauptsache man weiß wo vorne und hinten ist ...


Code: [AUSKLAPPEN]

Graphics 800,600

SetBuffer BackBuffer()

Const stepsize=5
Const pixcount=360/stepsize

Dim raumschiff(1,pixcount)
imgraumschiff=LoadImage("raumschiff1.bmp")
MaskImage imgraumschiff,255,0,255
For i=0 To pixcount
raumschiff(1,i)=CopyImage(imgraumschiff)
MidHandle(raumschiff(1,i))
RotateImage(raumschiff(1,i),i*stepsize+90)
MaskImage raumschiff(1,i),255,0,255
Next

x1#=400
y1#=400
dir1#=0

x2#=500
y2#=300
dir2#=0

Local dx#,dy#
Local wneu#
Local walt#

Function curveangle#(newangle#,oldangle#,increments#)
 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

Color 255,255,255

While Not KeyHit(1)
 Cls
 DrawImage raumschiff(1,dir1/stepsize),x1,y1
 DrawImage raumschiff(1,dir2/stepsize),x2,y2

 dx#=x2#-x1#
 dy#=y2#-y1#

 walt#=dir1#
 wneu#=(ATan2(dx#,dy#)+360) Mod 360

 inc#=5
 dir1=curveangle#(wneu,walt,inc)

 If dir1>360 Then dir1=dir1-360
 If dir1<0 Then dir1=dir1+360

 Text 10,30,"DIR1 : "+dir1,False,False

 Text 10,90,"WINKEL : "+wneu,False,False

 If KeyDown(200) Then y2=y2-10
 If KeyDown(208) Then y2=y2+10
 If KeyDown(203) Then x2=x2-10
 If KeyDown(205) Then x2=x2+10

 Flip 0

Wend
End


mit den cursortasten bewegt man eins der raumschiff und das andere soll sich nach möglichkeit immer zu dem jeweiligen hindrehen... aber irgendwie.... ach mann ... *Seufz*
A Cray is the only computer that runs an endless loop in less than four hours.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, März 03, 2004 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, hab doch schom mal was mit einem Panzer hier als beispiel gecodet
mit genau diesem thema!
ich habs....Code: [AUSKLAPPEN]
Graphics  800,600,16,2
SetBuffer BackBuffer()
Dim Panzer (360)
;PanzerGrafik_berechnen > 360 Einzelbilder <
      Rect 9,0,2,20
      Rect 0,10,20,20,1
      Flip
      Panzer(0) = CreateImage (20,30)
      GrabImage Panzer(0),0,0
      MidHandle Panzer(0)
       
      For z= 1 To 359
      panzer(z) = CopyImage (Panzer(0))
      RotateImage panzer(z),z
      MidHandle Panzer(z)
      Text 500,500,z
      Flip
      Cls
      Next
x=  400: y= 30

Repeat
   If MouseHit(1) Then
      x= MouseX ()
      Y= MouseY ()      ;Winkel bezieht sich auf den Panzer
      winkel = Objekt_richtung_grad(x,y ,400 ,300)
   End If

   ;Geschuetz_turm_drehen (posPanzer,Winkel ) so könnte die heißen
   
   If posPanzer > Winkel  And  posPanzer -180 < Winkel  Then posPanzer = posPanzer -1
   If posPanzer > Winkel  And  posPanzer -180 > Winkel  Then posPanzer = posPanzer +1
   If posPanzer < Winkel  And  posPanzer +180 < Winkel  Then posPanzer = posPanzer -1
   If posPanzer < Winkel  And  posPanzer +180 > Winkel  Then posPanzer = posPanzer +1
   If posPanzer = Winkel -180  Or posPanzer -180  = Winkel  Then posPanzer = posPanzer +1
   
   If posPanzer < 0      Then posPanzer =359;Damit es im Kreis läuft
   If posPanzer > 359 Then posPanzer =     0
   
   If posPanzer = Winkel  Then Line x,y ,400 ,300 ;Schuss
   Oval  x-5,y-5,10,10,1 ;Klickpunkt malen
   DrawBlock Panzer(posPanzer),400,300;Panzer malen
   Text 100,30, posPanzer + " Panzer"
   Text 100,60, winkel +      " Grad"
   Flip
   Cls
   Until KeyHit (1)
End


Function Objekt_richtung_grad(Zielpunkt_X,Zielpunkt_Y,Ausgangspunkt_X,Ausgangspunkt_Y )
grad =ATan2(Zielpunkt_Y -Ausgangspunkt_Y, Zielpunkt_X -Ausgangspunkt_X)+90; +90 verschiebt die 0Grad Position
If grad < 0 Then grad = grad+360
Return grad
End Function


hoffe es hilft dir...
[BB2D | BB3D | BB+]

Fetze

BeitragMi, März 03, 2004 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
So, die bisher hier geposteten Ansätze sollten dir helfen. Da du danach gefragt hast, erkläre ich dir auch nochmal mein (eigentlich blödes Laughing ) System:

Ich überprüfe ob der Winkel des anzugreifenden Schiffen zum gerade berechneten Schiff größer oder kleiner ist, als der Winkel des gerade berechneten Schiffes. Dann setze ich eine Variable auf 0, 1 oder 2: Bei 0 ist der Winkel gleich dem Winkel zum Ziel und das raumschiff dreht sich nicht. Bei eins ist der Winkel des Ziels kleiner als der des berechneten Schiffes und das Raumschiff dreht sich folglich nach links, rechts bei 2(bedingungen kannste dir ja denken).

Hoffe, das hat dir geholfen(auch wenn ichs nicht glaube Wink )

Alfadur

Betreff: leute...

BeitragMi, März 03, 2004 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
mann bin ich doof...doof dooooof.....doooooooooooof. so genug. eigentlich dachte ich immer, mir passiert sowas nicht...aber....ich hatte einfach bei atan2 das y mit dem x vertauscht... und deswegen bin ich nich weiter gekommen. danke für eure hilfe, das panzerbeispiel hat mir dann ein licht aufgehen lassen.... das hat mein startrade konkurrenzprodukt ein ganzes stück weiter gebracht .-)
A Cray is the only computer that runs an endless loop in less than four hours.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group