Level-Objekte aus Textdatei entnehmen...

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    Level-Objekte aus Textdatei entnehmen...

    Hallo liebes Forum,
    ich suche nach einer Möglichkeit, Level-Infos aus einer *.txt Datei zu entnehmen, und dieses dann in GDI zeichnen lasse...
    Also,
    Spoiler anzeigen
    ##########################################
    #'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' #
    # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#
    # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#
    #'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''[][][] '''''''''''''#
    # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#
    #'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' #
    # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#
    # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#
    # ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''#
    ##########################################

    als Beispiel.
    # steht für ein Block.
    [][][] für eine Plattform...

    Ich hab mir gedacht, die *.txt-Datei, zeichenweise einzulesen, und auf [][][];# zu prüfen...
    Ist dieses so möglich?

    Hoffe auf weitere Antworten...

    Mfg.eniking1998

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „enIking1998“ ()

    Ich kenn mich jetzt mit GDI nicht so wirklich aus, aber eine Datei einzulesen und die einzelnen Zeilen/Zeichen zu analysieren sollte ja eigentlich kein Problem darstellen.
    Du müsstest halt definieren, welche Zeichen erlaubt sind und dementsprechende Objekte daraus formen. Du hast ja quasi die X und Y Koordinaten (Zeile/Zeichen).

    Oder versteh ich die Frage falsch?

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @enIking1998 Klar ist das möglich, aber wäre es nicht besser das ganze über ein Koordinatensystem zu regeln. Dann bräuchtest du z.b wenn es eine 2D Map, etc wäre einfach nur die x, y Koordinate einzutragen. Wenn du die Zeichen auslesen möchtest, musst du das wie fichz es gesagt hat machen.

    Gruß
    Youtube Info Library 2013 jetzt im Showroom.
    xnamag.de/article.php?aid=27

    ist zwar für XNA, aber abgesehen vom zeichnen ist das Prinzip ja das selbe. Außerdem ist die Tilemap hier bereits fest im Code, aber deine Textdatei per System.IO.File.ReadAllText() auslesen und dann per String.Split(Environment.NewLine) und String.ToCharArray() erst ein ein- und dann ein zweidimensionales Array draus machen ist auch relativ simpel.

    J-F schrieb:

    Ich würde dir raten, lieber so ein Speicherformat zu nehmen:

    PositionX,PositionY,Width,Height

    Quellcode

    1. 0,0,50,100
    2. 50,0,50,100
    3. 250,360,10,300


    Finde aber auch deinen Ansatz gut.

    ~Jan

    Wenn die Map tilebasiert ist wäre das unnötig verbrauchter Speicherplatz.
    @All , danke!
    Ich werde es meinem Projekt implementieren.
    Das gibt dem Spieler mehr Freiraum.




    So Leute, hier:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Const map_breite As Integer = 20
    3. Private Const map_höhe As Integer = 10
    4. Private Const tile_breite As Integer = 40
    5. Private Const tile_höhe As Integer = 40
    6. Private Shared tilemap As Char(,) = New Char(map_höhe - 1, map_breite - 1) {{"#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    7. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    8. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    9. "#"c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    10. " "c, " "c, " "c, " "c, " "c, " "c, _
    11. "#"c, " "c, " "c, "S"c, " "c, " "c, _
    12. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    13. " "c, " "c, " "c, " "c, " "c, " "c, _
    14. "#"c, " "c, " "c, " "c, " "c, " "c, _
    15. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    16. " "c, " "c, " "c, " "c, " "c, " "c, _
    17. "#"c, " "c, " "c, " "c, " "c, " "c, _
    18. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    19. " "c, " "c, " "c, " "c, " "c, "%"c, _
    20. "|"c, " "c, " "c, " "c, " "c, " "c, _
    21. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    22. " "c, " "c, " "c, " "c, " "c, " "c, _
    23. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    24. "#"c, "#"c}, _
    25. {"#"c, " "c, " "c, " "c, " "c, " "c, _
    26. " "c, " "c, " "c, " "c, " "c, " "c, _
    27. "#"c, " "c, " "c, " "c, " "c, " "c, _
    28. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    29. " "c, " "c, " "c, " "c, " "c, " "c, _
    30. "#"c, " "c, " "c, " "c, " "c, " "c, _
    31. " "c, "#"c}, {"#"c, " "c, "@"c, " "c, " "c, " "c, _
    32. " "c, " "c, " "c, " "c, " "c, " "c, _
    33. "#"c, " "c, " "c, " "c, " "c, " "c, _
    34. " "c, "#"c}, {"#"c, "#"c, "_"c, "_"c, "#"c, "#"c, _
    35. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    36. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    37. "#"c, "#"c}}
    38. Dim Wand As Rectangle
    39. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    40. End Sub
    41. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    42. ' alle Zeilen durchlaufen
    43. For i As Integer = 0 To map_höhe - 1
    44. ' alle Spalten durchlaufen
    45. For j As Integer = 0 To map_breite - 1
    46. ' je nach ASCII-Zeichen in der Map, eine andere Textur zeichnen
    47. Select Case tilemap(i, j)
    48. Case " "c
    49. ' kein Tile => nichts zeichnen und weiter machen
    50. Exit Select
    51. Case "#"c
    52. ' Wand
    53. e.Graphics.FillRectangle(Brushes.Red, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    54. Exit Select
    55. Case "_"c
    56. ' Kerkertür
    57. e.Graphics.FillRectangle(Brushes.Green, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    58. Exit Select
    59. Case "|"c
    60. ' Zellentür
    61. e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    62. Exit Select
    63. Case "S"c
    64. ' Schatztruhe
    65. e.Graphics.FillRectangle(Brushes.Yellow, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    66. Exit Select
    67. Case "%"c
    68. ' Monster
    69. e.Graphics.FillRectangle(Brushes.RoyalBlue, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    70. Exit Select
    71. Case "@"c
    72. ' Held
    73. e.Graphics.FillRectangle(Brushes.Salmon, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    74. Exit Select
    75. Case Else
    76. Exit Select
    77. End Select
    78. Next
    79. Next
    80. End Sub
    81. End Class

    Danke an creac für den Link.
    War zu Leicht es mit GDI umzusetzen...

    Viel Spaß!
    Mfg. eniking1998

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „enIking1998“ ()

    creac schrieb:

    Wenn die Map tilebasiert ist wäre das unnötig verbrauchter Speicherplatz.

    Die Variante aus dem Startpost verbraucht aber noch viel mehr unnötigen Speicherplatz, auch wenn die Karte tilebasiert ist. Der Trick ist, eben nur die Tiles zu speichern, die belegt sind, alles andere wird dann automatisch zu Luft. Dafür würde es auch reichen, einfach X und Y Koordianten des jeweiligen Tiles zu speichern.
    Wobei wenn viele Tiles belegt sind und du pro Tile von mir aus sowas speichern musst: 230,110,19(wobei 19 die tileid ist) dann hast du immerhin auch schon 10 Zeichen. Wenn du nur 1/10 mit Tiles belegt hast rentiert sich das schon nicht mehr. Aber mal ganz im ernst. Das ist doch komplett wurscht. Wir sprechen hier von Speicher auf ner Festplatte. Ob da jetzt nen paar kb mehr oder weniger sind ist doch sowas von egal.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Nö. Klar ist es clusterfuck und wird bei komplexeren Dingen auch sofort unbrauchbar. Trotzdem machen im Zeitalter von Terabytes als Durchschnittliche Speicherkapazität ein paar kb keinen großen Unterschied mehr.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hallo!
    Kleine Frage,
    ich habe versucht mit,

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Const map_breite As Integer = 20
    4. Private Const map_höhe As Integer = 10
    5. Private Const tile_breite As Integer = 40
    6. Private Const tile_höhe As Integer = 40
    7. Dim Path As String = "C:\Tiles.txt"
    8. Dim readTileMap2d As New StreamReader(Path)
    9. Private Shared tilemap As Char(,)
    10. Dim x As String
    11. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    12. x = readTileMap2d.ReadToEnd()
    13. tilemap = New Char(map_höhe - 1, map_breite - 1) {{x}}
    14. End Sub
    15. Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    16. ' alle Zeilen durchlaufen
    17. For i As Integer = 0 To map_höhe - 1
    18. ' alle Spalten durchlaufen
    19. For j As Integer = 0 To map_breite - 1
    20. ' je nach ASCII-Zeichen in der Map, eine andere Textur zeichnen
    21. Select Case tilemap(i, j)
    22. Case " "c
    23. ' kein Tile => nichts zeichnen und weiter machen
    24. Exit Select
    25. Case "#"c
    26. ' Wand
    27. e.Graphics.FillRectangle(Brushes.Red, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    28. Exit Select
    29. Case "_"c
    30. ' Kerkertür
    31. e.Graphics.FillRectangle(Brushes.Green, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    32. Exit Select
    33. Case "|"c
    34. ' Zellentür
    35. e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    36. Exit Select
    37. Case "S"c
    38. ' Schatztruhe
    39. e.Graphics.FillRectangle(Brushes.Yellow, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    40. Exit Select
    41. Case "%"c
    42. ' Monster
    43. e.Graphics.FillRectangle(Brushes.RoyalBlue, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    44. Exit Select
    45. Case "@"c
    46. ' Held
    47. e.Graphics.FillRectangle(Brushes.Salmon, New Rectangle(tile_breite * j, tile_höhe * i, 30, 30))
    48. Exit Select
    49. Case Else
    50. Exit Select
    51. End Select
    52. Next
    53. Next
    54. End Sub
    55. End Class
    (Der jetzige Code ist crap, ich weiß, würde mich auch über Verbesserungsvorschläge freuen.)

    die Level-Objekte auszulesen.
    Das Problem hierbei ist, das die Breite und Höhe eine Konstante, und somit nicht variierbar sind, ist ja klar.
    Ich hab versucht x dem Array zuzufügen.
    Nur gibt die IDE mir ein Fehler, dem Array fehlen 9 Elemente, aus...

    Kann jemand mir ein theoritschen Tipp geben, um dieses richtig handzuhaben?

    Mfg.eniking1998
    Hier,

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. x = readTileMap2d.ReadToEnd()
    3. tilemap = New Char(map_höhe - 1, map_breite - 1) {{x}}
    4. End Sub


    war beim ersten Post nicht editiert, sorry.

    Mfg.eniking1998

    enIking1998 schrieb:

    Das Problem ist nicht das, sondern das das die Strings, dem 2-D-Array, nicht zugefügt werden kann...


    Genau das habe ich dir doch gesagt:

    sonne75 schrieb:

    Schau mal mit dem Debugger, wie deine tilemap im Paint-Event aussieht, vielleicht wurde es falsch aufgeteilt...


    EDIT: x ist ein String, in dem Komma, "c" und so weiter stehen, wie willst du einen String einem Array zuweisen?

    Wieso probierst du es nicht wie vorher aus (direkt Array füllen)?
    [VB 2012] Level-Objekte aus Textdatei entnehmen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()

    Ich muss dieses noch zu CharArray konventieren...
    Das kommt aber nicht zur Sache, das ist kein Problem...

    Mein Problem ist, wie ich ein String, einem 2-D-Array schreiben kann...heißt ein 1-D-Array in 2-D-Array...
    Statt zur Entwicklungszeit es so,

    VB.NET-Quellcode

    1. Private Shared tilemap As Char(,) = New Char(map_höhe - 1, map_breite - 1) {{"#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    2. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    3. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    4. "#"c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    5. " "c, " "c, " "c, " "c, " "c, " "c, _
    6. "#"c, " "c, " "c, "S"c, " "c, " "c, _
    7. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    8. " "c, " "c, " "c, " "c, " "c, " "c, _
    9. "#"c, " "c, " "c, " "c, " "c, " "c, _
    10. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    11. " "c, " "c, " "c, " "c, " "c, " "c, _
    12. "#"c, " "c, " "c, " "c, " "c, " "c, _
    13. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    14. " "c, " "c, " "c, " "c, " "c, "%"c, _
    15. "|"c, " "c, " "c, " "c, " "c, " "c, _
    16. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    17. " "c, " "c, " "c, " "c, " "c, " "c, _
    18. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    19. "#"c, "#"c}, _
    20. {"#"c, " "c, " "c, " "c, " "c, " "c, _
    21. " "c, " "c, " "c, " "c, " "c, " "c, _
    22. "#"c, " "c, " "c, " "c, " "c, " "c, _
    23. " "c, "#"c}, {"#"c, " "c, " "c, " "c, " "c, " "c, _
    24. " "c, " "c, " "c, " "c, " "c, " "c, _
    25. "#"c, " "c, " "c, " "c, " "c, " "c, _
    26. " "c, "#"c}, {"#"c, " "c, "@"c, " "c, " "c, " "c, _
    27. " "c, " "c, " "c, " "c, " "c, " "c, _
    28. "#"c, " "c, " "c, " "c, " "c, " "c, _
    29. " "c, "#"c}, {"#"c, "#"c, "_"c, "_"c, "#"c, "#"c, _
    30. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    31. "#"c, "#"c, "#"c, "#"c, "#"c, "#"c, _
    32. "#"c, "#"c}}

    zu laden, möchte ich es aus einer *.txt-Datei laden...

    Mfg.eniking1998