Visual Basic Movement: Mauern

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    Visual Basic Movement: Mauern

    Ich weiß, ist so 0815 aber ich habe das Problem dass ich bei einem Movement Spiel, ich hoffe ihr wisst was ich meine, "Mauern" einbaue welche Hindernisse sind.
    Hier ein Bild vom Grundgerüst:

    Das Bewegen an sich ist kein Problem, auch nicht die Spielränder. Man kann sich somit aktuell im gesamten bereich innerhalb der äußeren Spielränder bewegen. Nur wie setzte ich um, dass man nicht durch die Zwischenränder/Mauern kommt? Ich poste mal den gesamten Code (Grundgerüst zum Verständnis).

    Gesamter:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Up1 As Boolean
    3. Dim Down1 As Boolean
    4. Dim Left1 As Boolean
    5. Dim Right1 As Boolean
    6. Dim Up2 As Boolean
    7. Dim Down2 As Boolean
    8. Dim Left2 As Boolean
    9. Dim Right2 As Boolean
    10. Dim rnd As New Random
    11. Private Sub Form6_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    12. 'TASTATUR W A S D = MOUSE = UP1 DOWN1 RIGHT1 LEFT1
    13. 'PFEILTASTEN UP DOWN LEFT RIGHT = CAT = UP2 DOWN2 RIGHT2 LEFT2
    14. 'Mouse
    15. If e.KeyCode = Keys.Up Then
    16. Up1 = True
    17. End If
    18. If e.KeyCode = Keys.Down Then
    19. Down1 = True
    20. End If
    21. If e.KeyCode = Keys.Right Then
    22. Right1 = True
    23. End If
    24. If e.KeyCode = Keys.Left Then
    25. Left1 = True
    26. End If
    27. 'Cat
    28. If e.KeyCode = Keys.W Then
    29. Up2 = True
    30. End If
    31. If e.KeyCode = Keys.S Then
    32. Down2 = True
    33. End If
    34. If e.KeyCode = Keys.D Then
    35. Right2 = True
    36. End If
    37. If e.KeyCode = Keys.A Then
    38. Left2 = True
    39. End If
    40. End Sub
    41. Private Sub Form6_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    42. If e.KeyCode = Keys.Up Then
    43. Up1 = False
    44. End If
    45. If e.KeyCode = Keys.Down Then
    46. Down1 = False
    47. End If
    48. If e.KeyCode = Keys.Right Then
    49. Right1 = False
    50. End If
    51. If e.KeyCode = Keys.Left Then
    52. Left1 = False
    53. End If
    54. If e.KeyCode = Keys.W Then
    55. Up2 = False
    56. End If
    57. If e.KeyCode = Keys.S Then
    58. Down2 = False
    59. End If
    60. If e.KeyCode = Keys.D Then
    61. Right2 = False
    62. End If
    63. If e.KeyCode = Keys.A Then
    64. Left2 = False
    65. End If
    66. End Sub
    67. Private Sub MovemenT_Tick(sender As Object, e As EventArgs) Handles MovemenT.Tick
    68. If playermouse.Bounds.IntersectsWith(PictureBox1.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox2.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox3.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox4.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox5.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox6.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox7.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox8.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox9.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox10.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox11.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox12.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox13.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox14.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox15.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox16.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox17.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox18.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox19.Bounds) Or playermouse.Bounds.IntersectsWith(PictureBox20.Bounds) Then
    69. 'berührt Mauer
    70. '???
    71. Else
    72. If Up1 = True Then
    73. playermouse.Top -= 3
    74. If playermouse.Top <= 12 Then
    75. playermouse.Top = 12
    76. End If
    77. End If
    78. If Down1 = True Then
    79. playermouse.Top += 3
    80. If playermouse.Top + 89 >= Me.Height Then
    81. playermouse.Top = Me.Height - 89
    82. End If
    83. End If
    84. If Left1 = True Then
    85. playermouse.Left -= 3
    86. If playermouse.Left <= 21 Then
    87. playermouse.Left = 21
    88. End If
    89. End If
    90. If Right1 = True Then
    91. playermouse.Left += 3
    92. If playermouse.Left + 64 >= Me.Width Then
    93. playermouse.Left = Me.Width - 64
    94. End If
    95. End If
    96. If Up2 = True Then
    97. playercat.Top -= 2
    98. If playercat.Top <= 12 Then
    99. playercat.Top = 12
    100. End If
    101. End If
    102. If Down2 = True Then
    103. playercat.Top += 2
    104. If playercat.Top + 89 >= Me.Height Then
    105. playercat.Top = Me.Height - 89
    106. End If
    107. End If
    108. If Left2 = True Then
    109. playercat.Left -= 2
    110. If playercat.Left <= 21 Then
    111. playercat.Left = 21
    112. End If
    113. End If
    114. If Right2 = True Then
    115. playercat.Left += 2
    116. If playercat.Left + 64 >= Me.Width Then
    117. playercat.Left = Me.Width - 64
    118. End If
    119. End If
    120. End If
    121. End Sub
    122. End Class





    Mein Problem liegt ca. ab Zeile 89. Wenn "playermouse" (ich entwickle hauptsächlich erst für die eine, dann für die andere Spielfigur) eine Wand berührt, kann sich der Spieler nicht mehr in diese Richtung bewegen. Das Problem habe ich gerade schon dargestellt, wie bekomme ich hin dass der Spieler sich dann nur noch 'zurück' bewegen kann?
    Hoffe ich habe mein Problem richtig definiert, bei Fragen: fragen :)





    Liebe grüße
    Bilder
    • Unbenannt.PNG

      222,73 kB, 794×542, 18 mal angesehen

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝

    MaxeStudios schrieb:

    Mein Problem liegt ca. ab Zeile 89. Wenn "playermouse" (ich entwickle hauptsächlich erst für die eine, dann für die andere Spielfigur) eine Wand berührt, kann sich der Spieler nicht mehr in diese Richtung bewegen. Das Problem habe ich gerade schon dargestellt, wie bekomme ich hin dass der Spieler sich dann nur noch 'zurück' bewegen kann?
    Definiere 'zurück'.

    Weil in meiner Welt, wenn man sich in genügend richtungen nicht mehr bewegen kann, dann bleibt automatisch nur noch eine übrig - das wäre doch: 'zurück' - oder?
    Wenn man von Programmaufbau, Namensgebung, Objektorientierungsansatz etc. absieht: Definiere eine Variable LastGoodPosition, die die letzte valide Position des Spielers beinhaltet. Wenn der Spieler dann mit einer Wand kollidiert, wird er einfach auf jene valide Position zurückgesetzt, bevor er neu gezeichnet wird.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @ErfinderDesRades Genau, da wäre meine Frage gewesen wie ich auslese, wo zurück ist. Ist der Spieler mit einer Mauer unter ihm kollidiert, kann er nur noch nach oben/links/rechts aber nicht mehr nach unten.


    @VaporiZed klingt einfach und simple, werde ich ausprobieren.



    Ich melde mich nochmal wenn ich Fragen habe, danke

    Lg

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝

    MaxeStudios schrieb:

    wie ich auslese, wo zurück ist
    Wenn die Figur 4 Möglichkeiten zur Bewegung hat, gib ihr ein Enum-Flag mit diesen 4 Möglichkeiten.
    Wenn links die Mauer ist, lösche das Links-Flag und es bleiben die 3 anderen Richtungen übrig.
    Form mit 3 Buttons und nem Label:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. <Flags>
    3. Enum Directions
    4. None = 0
    5. Top = 1
    6. Right = 2
    7. Down = 4
    8. Left = 8
    9. All = 15
    10. End Enum
    11. Dim Direction As Directions = Directions.All
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. ' Reset
    14. Direction = Directions.All
    15. Label1.Text = Direction.ToString
    16. End Sub
    17. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    18. ' Mauer oben
    19. Direction = Direction And Not Directions.Top
    20. Label1.Text = Direction.ToString
    21. End Sub
    22. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    23. ' Mauer unten
    24. Direction = Direction And Not Directions.Down
    25. Label1.Text = Direction.ToString
    26. End Sub
    27. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!