Problem mit der Distanz
Übersicht

Ronon_DexBetreff: Problem mit der Distanz |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Leute ich bin es mal wieder ![]() Heute wollte ich euch fragen wie ich von mehrere Gegnern den nächsten herrausfinden kann. Es spielt sich alles in 2D nur auf der X Achse ab, Außerdem verwende ich für meine Schüsse keine Images sondern ich ermittle einfach in welche Richtung ich schaue und ziehe dann jedem Gegner in der Richtung Leben ab. Mein Problem ist jedoch, dass ich nur dem nächsten Gegner der an mir dran ist Schaden zu fügen will und nicht den anderen, die dahinter sind. Könnt ihr mir vllt etwas helfen ? wär echt Nett ![]() mfg Ronon_Dex |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie sieht dein Code aus? Wie verwaltest du die Gegner und Schüsse?
Wenn es nur eine Achse ist, sollte es ja ausreichen, die Differenz zum Ziel zu bilden. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aus dem stehgreif:
1) Richtung bestimmen (unterteilen in -1 und 1! 1 geht nach rechts, -1 nach links) 2) 2 Variablen festlegen: BesterGegner (ein zeiger für dein Gegnerobjekt), Letzte distanz. Letzte Distanz setzt du einfach auf zb 10000. (möglichst hoher wert) 3) Jeden gegner durchgehen. Dabei mit if Sgn(GegnerX - SpielerX) = richtung then ... bestimmen, ob der gegner in die gewünschte richtung liegt. (evtl mit den vorzeichen rumspielen, wenn mein hirn grade wieder spinnt ![]() 4) Wenn die richtung passt, das ergebnis von Abs(GegnerX-SpielerX) zwischenspeichern. Ist das ergebnis < "Letzte Distanz", wird Letzte Distanz auf Abs(GegnerX-SpielerX) gesetzt. Die variable BesterGegner wird ebenfalls auf den "aktuell geprüften" gegner gesetzt. 5) Am ende prüfst du noch, ob BesterGegner existiert und kannst ihm so schaden zufügen. Das wäre so meine vorgehensweise. Programmiert wird aber schön selbst ![]() Nochmal zusammengefasst, was ich nutzten würde: -Eine schleife, die alle gegner prüft. -Eine durch vorzeichen geprüfte richtung, anhand der differenz von Spieler->Gegner (ist der gegner links, ist normalerweise sein X wert kleiner. Das heißt, GegnerX-SpielerX wird negativ!) -Ein zwischenspeicher für gegner+distanz paare (distanz muss ABS sein, sonst gibts in die -links-richtung ein vorzeichen problem!) |
||
Ronon_Dex |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
danke ich werde mir das mal anschauen.
solange werde ich mal meinen Code posten um auch die letzten Missverständnisse aus zu räumen ![]() BlitzBasic: [AUSKLAPPEN] Global max=800, min=600 //Edit: Ich komm nicht wirklich klar mit deiner Anleitung ist etwas unverständlich geschrieben ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Blickrichtung mit einem String zu Prüfen funktioniert, ist aber keine hübsche Lösung. Integer werden schneller verarbeitet und Konstanten machen das ganze Lesbarer:
BlitzBasic: [AUSKLAPPEN] Const Rechts%=0, Links%=1 Deine Tasten-Variablen könnten entsprechend auch als Konstanten deklariert werden - es sei denn, du wolltest die Tastenbelegung einstellbar machen. Du brauchst auch die Position nicht doppelt speichern, den Char Global zu machen, wäre da die bessere Lösung: BlitzBasic: [AUSKLAPPEN] char.player = New player Und noch eins: BlitzBasic: [AUSKLAPPEN] If ppx < 740 Then Benutze von Anfang an Variablen und Konstanten, anstatt Werte "hardcoded" im Code zu benutzen - irgendwann willst du etwas ändern, und musst ein paar hundert Zeilen ändern, anstatt nur eine Zeile. Zum Hauptteil: Um den Abstand zweier Punkte zu berechnen, wird üblicherweise der Satz des Pythagoras verwendet. Etwas komplizierter wird es, das richtige Monster aus zu wählen: Ich würde eine Variable ZielMonster.monster und eine für den Abstand anlegen und in ZielMonster das Monster stecken, das einen kleineren Abstand hat als letzte. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Ronon_Dex |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: Ich würde eine Variable ZielMonster.monster und eine für den Abstand anlegen und in ZielMonster das Monster stecken, das einen kleineren Abstand hat als letzte.
genau da liegt das Problem ![]() Ich weis ja nicht wie ich die kleinste Distanz herraus bekommen soll... Das erste erstellte Monster muss ja nicht zwangsläufig die kleinste Distanz zum Player haben, es kann auch das 5. von 10 Monstern am nächsten am Player dran sein. |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hast du dir meinen beitrag überhaupt durchgelesen? :<
Da hatte ich eigentlich die Logik geschildert ^^ Um die distanz zu bestimmen (auf einer achse, zb X) reicht es, wenn du mit ABS werte vergleichst. Am besten rechnest du immer wie folgt die distanz aus: Monster-Spieler. Sprich: Monster-koordinate-X MINUS Spieler-koordinate-X. Dies mag einen negativen wert ergeben, aber das vorzeichen intressiert nicht. DH wir brauchen 'ABS' - eine funktion, welche dir eine zahl ohne Vorzeichen wiedergibt. Sprich: -2 wird zu 2, 4 wird zu 4. Somit hast du die absolute (abs ![]() wenn du nun anfängt, mit 2 variablen, welche dir ein Monster und eine Distanz zwischenspeichern, und getrennt davon alle monster durchläufst (for-schleife), kannst du so jedes monster vergleichen. Sollte die Absolute Distanz zum monster kleiner sein, als die zuletzt 'kleinste' (eine der Variablen -> Distanz) gehst du wie folgt vor: 1) Speichere die neueste, kleinste, absolute distanz in der variable (die, die VOR der for schleife erstellt wurde ![]() 2) Speichere das monster, welches die geringste distanz aufweißt, in der 2ten variable, dem zeiger auf dein monster. Hier ist der wert dir überlassne, obs nun ein Pointer auf eine Monster-instanz ist oder ein Index für einen array. Nachdem die schleife durch ist, kontrollierst du, ob überhaupt ein monster gefunden wurde und ziehst diesem eventuell hp ab. Das geht ganz einfach, da du, wie in punkt 2) erwähnt, das monster zwischengespeichert hast. Hmpf, nochmal mach ich mir nicht die mühe. (ps: Dies ist nur eine von vielen möglichkeiten und wird mit zunehmender monsteranzahl langsamer. Wenn du allerdings nur ein paar tausend hast, dürfte das okay sein. Für alles andere musst du eh dein system ein wenig anders unterteilen (Sektoren, etc)) |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Darum musst du eben alle Monster abarbeiten:
BlitzBasic: [AUSKLAPPEN] Local m.monster, ziel.monster, minD%=-1 |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da xeres meinen vorschlag nun code-technisch verfasst hat, erweiter ich das ganze noch ![]() BlitzBasic: [AUSKLAPPEN] Function Distanz%(x1%,x2%) Anzumerken sei auch, das in BlitzBasic: [AUSKLAPPEN] minD%=-1
auch -1 durch eine "maximale" distanz ersetzt werden kann und die abfrage BlitzBasic: [AUSKLAPPEN] If d < minD Or minD=-1 Then ; dann einfach BlitzBasic: [AUSKLAPPEN] If d < minD Then heißen kann. Aber bedenke: Dein jetziges vorhaben wird auf jedenfall einen gegner finden, dh die kugel wird nicht "fliegen" - solltest du aber nach dem schießen noch die kugel fliegen lassen, kannst du das ganze auch nutzen: Hierzu musst du statt der spieler position die kugel-position übergeben. (Distanz(kugel\positionX, m\PositionX) ) Der min-abstand sollte hier dann dem "radius" der kugel entsprechen - im besten fall noch ein wenig mehr, da die kugel wohl sehr schnell fliegen dürfte. |
||
Ronon_Dex |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich hab das jetz mal so gemacht:
BlitzBasic: [AUSKLAPPEN] Function Schuss(reload=5,dmg=1) nach rechts funktioniert es einigermaßen(d.h. manchmal greife ich auch den Mittleren an) jedoch nach links gar nicht. |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich bin leider kein BB-crack, aber für mich sieht das noch nicht 100% richtig aus.
So wie es grade ausschaut, tust du jeden gegner angreifen, welcher zwischen dem ersten fund und dem spieler liegt. Ich versuche grade mal ein wenig umzuformen, aber ich kann nicht garantieren, ob es so funktioniert^^ BlitzBasic: [AUSKLAPPEN] Function Schuss(reload=5,dmg=1) So oder so in der art sollte es funktionieren. Vorraussetzungen hierfür sind, das der KoordinatenUrsprung von X auf der linken seite (vom bildschirm) liegt. Aber, soweit ich das sehen kann, gibt es keinen logischen grund, warum monster auf der linken seite nicht angegriffen werden können. Bestenfalls stimmt was mit "lookat = llinks" nicht - vielleicht nimmt looktat niemals den wert von llinks an ? |
||
Ronon_Dex |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat: If (lookat=lrechts And ppx < m\mx) Or (lookat = llinks And ppx > m\mx) Then ;der spieler schaut in monster-richtung
Ich weis nicht ob ich gerade was übersehen habe aber: Greift er dann nicht den nächsten Gegner an auch wenn er in die falsche Richtung schaut ? //Edit: Ach nein stimmt doch ![]() Und dazu funktioniert es auch noch gut ![]() danke Phillipk |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group