Schiff automatisch Drehen wo der Gegner ist..

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bobo2040

Betreff: Schiff automatisch Drehen wo der Gegner ist..

BeitragSo, Sep 22, 2013 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Ich stehe grade irgendwie auf dem Schlauch ...
ich möchte, dass sich mein Schiff automatisch zu dem Gegner dreht wenn man ihn Angeklickt hat und auf Ihn feuert...
Nur bekomme ich das Irgendwie nicht so wirklich hin...
Hier ist mal mein bisheriger Code ... wäre nett wenn mir jemand einen Lösungsansatz erklären könnte ...
BlitzBasic: [AUSKLAPPEN]

;--- Schiff rotation ... bissher aber nur für eine Richtung...
Function ShipRotation()
If AiX-KameraX>AiX-160-KameraX And AiX-KameraX<AiX-480-KameraX Then
If AiY-KameraY>AiY-160-KameraY And AiY-KameraY<AiY-480-KameraY Then
SpielerShip=Ship_3
EndIf
EndIf


If AutoShoot=1
If GegnerPlace=Oben Then
SpielerShip=Ship_1
ElseIf GegnerPlace=LinksOben Then
SpielerShip=Ship_2
ElseIf GegnerPlace=Links Then
SpielerShip=Ship_4
ElseIf GegnerPlace=LinksUnten Then
SpielerShip=Ship_6
ElseIf GegnerPlace=Unten Then
SpielerShip=Ship_7
ElseIf GegnerPlace=RechtsUnten Then
SpielerShip=Ship_8
ElseIf GegnerPlace=Rechts Then
SpielerShip=Ship_5
ElseIf GegnerPlace=RechtsOben Then
SpielerShip=Ship_3
EndIf
EndIf
End Function
;--- Wo der Gegner Erstellt wurde und welche Koordinaten er hat...
Function MakeAi()
If AiMap=1 And Map=Map_1 Then
DefendAi()
Alien()
Color 100,240,50
breiteAi=AiHP/6300
hoeheAi=3
breiteAiS=AiSchild/6300
hoeheAiS=3
Rect AiX-KameraX,(AiY-10)-KameraY,breiteAi,hoeheAi
Color 0,191,255
Rect AiX-KameraX,(AiY-6)-KameraY,breiteAiS,hoeheAiS
DrawImage AiImage,AiX-KameraX,AiY-KameraY
If AiImage=AiDown Then
drawExplosion()
EndIf
If AiHP>1 Then
AiLog()
EndIf
ElseIf AiMap=2 And Map=Map_2 Then
Alien()
DefendAi()
Color 100,240,50
breiteAi=AiHP/6300
hoeheAi=3
breiteAiS=AiSchild/6300
hoeheAiS=3
Rect AiX-KameraX,(AiY-10)-KameraY,breiteAi,hoeheAi
Color 0,191,255
Rect AiX-KameraX,(AiY-6)-KameraY,breiteAiS,hoeheAiS
DrawImage AiImage,AiX-KameraX,AiY-KameraY
If AiImage=AiDown Then
drawExplosion()
EndIf
If AiHP>1 Then
AiLog()
EndIf
EndIf
End Function
;---- Wie die Variable KameraX/Y zustande kommen ....
KameraX=SpielerX-GraphicsWidth()/2
KameraY=SpielerY-GraphicsHeight()/2
;---- Spieler X/Y verändern sich wenn man sich bewegt ...


Mfg

DAK

BeitragSo, Sep 22, 2013 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Atan2 um den Winkel zum Gegner raus zu finden, und dann je nach Winkel das passende Bild zeichnen.

Hast du immer noch nur die 8-Wege-Bilder ohne Array? Das solltest du besser ändern.

Kannst du Arrays schon?

Was du brauchst ist sowas:

BlitzBasic: [AUSKLAPPEN]
;Initialisierung
Dim spielerbild(72)
For Local i = 0 To 72
spielerbild(i) = RotateImage(ungedrehtesSpielerbild,i*5)
Next

;Anwendung
DrawImage(spielerbild(richtung/5),x,y)


Dabei ist richtung die Richtung in die der Spieler schaut in Grad.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Kruemelator

BeitragSo, Sep 22, 2013 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Vllt hilft dir:
BlitzBasic: [AUSKLAPPEN]
ATan2(yabstand,xabstand)

x- und yabstand ist einfach Aiposition - Spielerposition
Das gibt dir einen Winkel von -180 bis 180 zurück.
Dann musst du den Winkel nur noch auswerten, z.B. so:
BlitzBasic: [AUSKLAPPEN]
If winkel > -180 Then seite = 1
If winkel > -90 Then seite = 2
If winkel > 0 Then seite = 3
If winkel > 90 Then seite = 4
 

Bobo2040

BeitragSo, Sep 22, 2013 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm okay Very Happy
Ich versuche es nachher mal ...
wusste nicht das es eine funktion wie Rotateimage() gibt -_-
ich habe alle Bilder mühevoll ausgeschnitten und die eingetragen ... Sad
Mfg
 

CO2

ehemals "SirMO"

BeitragSo, Sep 22, 2013 14:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch eine kleine Anmerkung: Was bringt diese Abfrage? BlitzBasic: [AUSKLAPPEN]
If AiX-KameraX>AiX-160-KameraX And AiX-KameraX<AiX-480-KameraX Then
If AiY-KameraY>AiY-160-KameraY And AiY-KameraY<AiY-480-KameraY Then '(...)


AiX-KameraX ist immer größer als AiX-160-KameraX, AiX-KameraX ist allerdings auch immer größer als AiX-480-KameraX, womit schon die erste Abfrage immer false ist (da du überprüfst, ob AiX-KameraX kleiner ist als AiX-480-KameraX), analog hierzu natürlich auch die 2. Abfrage...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

Bobo2040

BeitragSo, Sep 22, 2013 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok
Das mit dem Winkelberechnen hat geklappt Smile
Nur wenn der Gegner irgendwo neu Gespawnt wird dann bringen mir die Alten Winkel nichts mehr.... Ich habe es bis jetzt so das es fuer den ersten Gegner geht aber wenn er Tod ist wird er irgendwo zufaellig Gegrespawnt und dann muesste ich das nochmal neu alles machen...
Kann ich das nicht automatisieren... ?
Bin als am Ueberlegen nur faellt mir nicht ein wie ich das mmchen koennte das es egal ist ob AiX 100 ist oder ob AiX1000 ist ...

DAK

BeitragSo, Sep 22, 2013 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar kannst du es automatisieren. Musst es einfach automatisch neuberechnen lassen. Was hindert dich daran?
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragSo, Sep 22, 2013 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja Smile
Icb weis nicht wie stark sich der winkel verandert...
Ich probiers morgen mal Smile
Werdet noch was von mir hoeren ^^

DAK

BeitragMo, Sep 23, 2013 9:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Na verwend, doch einfach Atan2 wie zuvor, um den Winkel komplett neu bestimmen zu lassen. Keine Angst Befehl beißt nicht.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragMo, Sep 23, 2013 12:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja das mache ich doch...
Nur ist iwie die map voll mit winkeln und nicht der ai
Also in der mitte der map ist der winkel 0
EDIT:
Hier ist bis jetzt mal die Funktion ...
BlitzBasic: [AUSKLAPPEN]

Function ShipRotation()
WinkelX = ATan2(AiX,SpielerX)
WinkelY = ATan2(AiY,SpielerY)

;--- Schiff drehen ---
If AutoShoot=1 Then

If WinkelX<160 And WinkelX>61 And WinkelY>70 And WinkelY<150 Then
;ObenLinks
SpielerShip=Ship_8

ElseIf WinkelX>26 And WinkelX<60 And WinkelY>70 And WinkelY<150 Then
;oben
SpielerShip=Ship_7

ElseIf WinkelX>12 And WinkelX<25 And WinkelY>70 And WinkelY<150 Then
;Rechtsoben
SpielerShip=Ship_6

ElseIf WinkelX>8 And WinkelX<35 And WinkelY>30 And WinkelY<70 Then
;Rechts
SpielerShip=Ship_4

ElseIf WinkelX>12 And WinkelX<25 And WinkelY>15 And WinkelY<30 Then
;Rechtsunten
SpielerShip=Ship_2

ElseIf WinkelX>25 And WinkelX<60 And WinkelY>10 And WinkelY<30 Then
;Unten
SpielerShip=Ship_1

ElseIf WinkelX>25 And WinkelX<155 And WinkelY>15 And WinkelY<30 Then
;Linksunten
SpielerShip=Ship_3

ElseIf WinkelX>60 And WinkelX<150 And WinkelY>15 And WinkelY<30 Then
;Links
SpielerShip=Ship_5

Else
Print "Unknown Winkel [ERROR]"
EndIf

EndIf

Text 300,150,WinkelX+" - "+WinkelY,True,False
End Function

wobei ich mir nicht sicher bin ob ich den winkel so richtig ausgerechnet habe... also ob ich da noch cosinus oder sowas brauche Very Happy

DAK

BeitragMo, Sep 23, 2013 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, hast du nicht richtig verwendet. Hättest du die Hilfedatei zu Atan2 auch nur überflogen, dann hättest du ganz am Anfang das hier entdeckt:

Code: [AUSKLAPPEN]
Aufruf
Winkel# = ATan2(Y#, X#)

Parameter
Y#    vertikaler Abstand (Gegenkathete)
X#    horizontaler Abstand (Ankathete)


Mal zu beginn, weißt du was ein Winkel ist? Wenn nicht, bitte lies dir den Wiki-Artikel dazu durch.

Sowas wie einen X-Winkel oder Y-Winkel gibt es in 2D nicht! Dort hast du nur den Winkel, wenn du von oben draufschaust. Der gibt an, wie weit das Ding gedreht wird, agiert also sowohl auf X als auch auf Y.

Also, wie kriegt man den X- und Y-Abstand zwischen zwei Punkten raus? Das geht so:

BlitzBasic: [AUSKLAPPEN]
XAbstand = XSchiff-XGegner
YAbstand = YSchiff-YGegner


Der Winkel errechnet sich also so:
BlitzBasic: [AUSKLAPPEN]
Winkel# = ATan2(YSchiff#-YGegner#,XSchiff#-XGegner)


Wenn du solche Probleme hast, dann würde ich dir dringend empfehlen (a) Hilfedateien zu lesen und (b) die Grundlagen der Mathematik halbwegs zu lernen, bevor du beginnst, ein MMO zu schreiben.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragMo, Sep 23, 2013 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Aaahhhh
Ich weiss was ein Winkel ist ^^
Nur mag ich vorffertige Mathematische Funktionen nicht also schon aber nur wenn ich weis was
Passiert...
Naja ich probiers wenn ich nach hazse komme ^^

Edut:
Du bist ein GENIE!!!!
Danke es geht !!!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group