Waypoints die verbunden sind?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Waypoints die verbunden sind?

BeitragDo, Feb 11, 2010 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich glaube, dass die Frage jetzt sau dämlich ist, aber ich hab schon die halbe Nacht drüber gegrübelt und bin auf keine zufriedenstellende Lösung gekommen.

Ich bin dabei, waypoints in meinen Mapeditor einzubauen. Jetzt will ich aber nicht, dass später einfach überprüft wird, welcher Waypoint näher liegt, sondern ich will "Straßen" zwischen den Waypoints haben.
Also, wenn ich auf den einen Waypoint klicke, und dann auf einen anderen, dass diese verbunden werden.
Das optisch darzustellen ist im Prinzip kein Problem.

Aber:
Wie speichere ich das, welcher Waypoint mit welchem verbunden ist?
Ich hab mir überlegt, jedem Waypoint eine fortlaufende Nummer zu geben.
Und dann die Nummer, mit dem ein Waypoint vernetzt ist auch in dem Waypoint zu speichern.
Über Arrays wär das aber recht unübersichtlich und unschön.

Gibts da vielleicht ne bessere Lösung?

Würd mich echt übern paar Denkanstöße freuen.

Lg, M0rgenstern

Xeres

Moderator

BeitragDo, Feb 11, 2010 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Kommt darauf an, ob du Verzweigungen benutzen möchtest oder nicht. Eine Lineare Reihe von Punkten lässt sich mit einem Array oder mit Types leicht verwirklichen. Mit Verzweigungen würden Types Sinn machen - Punkte und Verbindungen.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

M0rgenstern

BeitragDo, Feb 11, 2010 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, sagen wir ich habe Waypoint 5.
Waypoint 5 hat eine Verbindung zu Waypoint 2 und Waypoint 4 und Waypoint 3.
Waypoint 6 Wiederum hat eine Verbindung zu 3, 7 und 10.

So dachte ich das.

Das Problem ist, dass ich nicht weiß, inwieweit das effektiv umsetzbar ist, bzw wie ich es umsetzen soll.

Hoffe, das ist jetzt verständlicher.

Lg, M0rgenstern

Xeres

Moderator

BeitragDo, Feb 11, 2010 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann brauchst du einen Type für die Punkte und einen Type für die Verbindungen. Punkt 5 besitzt 3 Verbindungen, die jeweils die passenden Punkte beinhalten.

Etwa:
Code: [AUSKLAPPEN]
Type TWayPoint
   ;Field nr ;Nummer / Name oder am besten handle zum unterscheiden falls nötig
   Field x, y
End Type

Type TWayConnection
   Field P1.TWayPoint
   Field P2.TWayPoint
End Type
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

SpionAtom

Betreff: Graph

BeitragDo, Feb 11, 2010 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du realisieren möchtest, wie es scheint, ist ein Graph

Ich hab auch mal versucht sowas mit Blitz zu schreiben: https://www.blitzforum.de/foru...hp?t=22290

Ich kann dir empfehlen mal gezielt nach diesem Begriff zu suchen. Es ist ein komplexer Bereich in der Informatik. Aber auch einfachere Dinge, wie Wegsuche und sowat lassen sich damit gut lösen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

M0rgenstern

BeitragDo, Feb 11, 2010 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für eure Hilfe, das ganze funktioniert super so wie ichs mir vorgestellt habe.

Mir ist nur ein Problem aufgefallen.
Ich hab die koordinaten an die Punkte mit:

Code: [AUSKLAPPEN]
Wegpunkt\Xpos = (XOFFSET-(XPos Mod TILESIZE)+Xi*TILESIZE)
Wegpunkt\YPos = (YOFFSET-(YPos Mod TILESIZE)+Yi*TILESIZE)


übergeben.

Jetzt hängt das alles "am Monitor", also nicht auf der Karte.

Ich weiß aber auch nichtgenau, wie ich die Koordinaten errechne für die Wegpunkte.
Mit (xi+xrtv) funktionierts auch nicht.

Jemand vielleicht ne Idee?

Wäre echt toll.


Lg, m0rgenstern

Xeres

Moderator

BeitragDo, Feb 11, 2010 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Du berechnest offenbar, wo die Wegpunkte auf dem Bildschirm sind. Sie sollten aber unabhängig vom Bildausschnitt sein - also Entfernung vom Punkt 0,0.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

M0rgenstern

BeitragDo, Feb 11, 2010 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, mir ist bewusst, was da schief läuft, aber nicht, wie ichs ändern kann.
Ich hab halt Scrolling drin und die map an sich wird immer mit map(xi+xrtv,yi+yrtv) angegeben, wobei xi undyi die Variablen der Forschleife sind und xrtv und yrtv die Verschiebung.
Außerdem noch Xpos und YPos für die Mapposition.

Lg, m0rgenstern

darth

BeitragDo, Feb 11, 2010 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich würde das Problem als eine LinkedList angehen. Falls dir das nichts sagt, hier die grobe Idee:
Definiere einen Type Waypoint, dieser hat eine ID (Grund dazu später), eine Koordinate X und eine Y, und dann den nächsten Waypoint in der Liste, also so:

BlitzBasic: [AUSKLAPPEN]
Type Waypoint
Field X#
Field Y#
Field ID
Field TmpID
Field Succ.Waypoint


Dann erstellst du deinen Waypoint, achte darauf, dass die ID immer unterschiedlich sind, also bei einem "new Waypoint" würde ich gucken, dass:

BlitzBasic: [AUSKLAPPEN]
lastWP.Waypoint=Last Waypoint
lastID=lastWP\ID

WP.Waypoint=New Waypoint
WP\ID=lastID+1


Die Koordinaten des Waypoints kannst du natürlich beliebig setzen. Danach kommt das zusammenhängen, wie du das im Editor lösen willst ist eine andere Frage, rein technisch geht das einfach so, dass du das Succ.Waypoint Feld des vorherigen mit dem jetzigen füllst.

BlitzBasic: [AUSKLAPPEN]
neuerWP.Waypoint=New Waypoint
alterWP\Succ=neuerWP


Wenn du jetzt einen Waypoint-Pfad ablaufen willst, dann kannst du das einfach so machen, indem du deiner Succ-Liste folgst. In etwa so:

BlitzBasic: [AUSKLAPPEN]
If Starte()
WPIter.Waypoint=StartPunkt.Waypoint
EndIf

If WaypointErreicht(...)
WPIter=WPIter\Succ
If WPIter=Null
;ENDE DER LISTE ERREICHT
EndIf
EndIf


Das ist die Technik. Das kannst du so natürlich nicht speichern (also... du kannst wahrscheinlich schon versuchen die Handles des Succ-Feldes zu speichern, aber das ist relativ sinnlos). Von daher brauchst du die ID des Types. Beim Speichern würd ich dann so vorgehen:

BlitzBasic: [AUSKLAPPEN]
For WP.Waypoint=Each Waypoint
WriteFloat(WP\x)
WriteFloat(WP\y)
WriteInt(WP\ID)
If WP\Succ<>Null
WriteInt(WP\Succ\ID)
Else
WriteInt(-1)
EndIf
Next


Beim Laden musst du dann zuerst die TmpID füllen, damit du dann die Liste wieder zusammenhängen kannst. Also zuerst ganz normal Laden:

BlitzBasic: [AUSKLAPPEN]
While Not Eof()
WP.Waypoint=New Waypoint

WP\x=ReadFloat()
WP\y=ReadFloat()
WP\ID=ReadInt()
WP\TmpID=ReadInt()
Wend


Nachher musst du dann die Liste vervollständigen, also einfach den Waypoint suche, der die gleiche ID hat wie die TmpID des jetzigen Waypoints.

BlitzBasic: [AUSKLAPPEN]
For WP.Waypoint=Each Waypoint
If WP\TmpID<>-1
For WP2.Waypoint=Each Waypoint
If WP2\ID=WP\TmpID
WP\Succ=WP2
Exit
EndIf
Next
EndIf
Next


Und das wärs glaub ich. Ich hoffe das Prinzip ist einigermassen verständlich. Falls nicht... wir sind ja schon in einem Thread.

MfG,
Darth
Diese Signatur ist leer.

M0rgenstern

BeitragDo, Feb 11, 2010 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@ darth:
Ich schau mir deinen Code morgen mal genauer an.
Das Waypoint System, das ich habe funktioniert eigentlich ganz gut.
Das Problem ist halt, dass ich die Waypoints nicht richtig auf die Karte gesetzt bekomme.
Also, dass ich nicht weiß wie ich die Koordinaten berechnen soll.

Momentan siehts so aus:

Code: [AUSKLAPPEN]
If mousedown3d=1 And ((WErstZeit+WErstStart)<MilliSecs()) Then
                  
                  If (Map(Xi+XRtv,Yi+YRtv,0) = 0) Then
                     
                     Map(Xi+XRtv,Yi+YRtv,0) = 1
                     
                     WPNummer = WPNummer + 1
                     
                     Wegpunkt.TWaypoint = New TWaypoint
                     Wegpunkt\Nr = WPNummer
                     Wegpunkt\Dead = 0
                     Wegpunkt\XPos = (Xi+XRtv)
                     Wegpunkt\yPos = (Yi+YRtv)
                     
                     WPCSet = 2
                     WErstStart = MilliSecs()
                     
                  EndIf


Ihr seht ja, wo ich die x und y Koordinaten übergebe.

Aber das funktioniert so nicht.
Ich muss das irgendwie in Relation zur Maus setzen etc, aber ich weiß nicht wie.

Hier mal die Stellen in denen die Koordinaten der Map berechnet werden:

Code: [AUSKLAPPEN]
XPos = XPos+(KeyDown(205)-KeyDown(203))*2
   YPos = YPos+(KeyDown(200)-KeyDown(208))*2
   
   If XPos<0 Then XPos=0
   If YPos<0 Then YPos=0
   If XPos>XWALL Then XPos=XWALL
   If YPos>YWALL Then YPos=YWALL
   
   XRtv=Floor(XPos/(TILESIZE))
   YRtv=Floor(YPos/(TILESIZE))
   
   For Yi = 0 To YDRAWTILES
      For Xi = 0 To XDRAWTILES


In den Forschleifen steht dann halt auch der Code von oben wo die Waypoints erstellt werden.

Ich hoffe, dass ihr mir helfen könnt.

Lg, m0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group