Bewegungsspiel erstellen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Unwesen.

    Bewegungsspiel erstellen

    Hi Com,

    Ich bin gerade dabei ein kleines Spiel zu erstellen und komme leider nicht weiter.

    Wie bekomme ich es jetzt hin das wenn die Picturebox(oben links) über einer der LineShapes kommt zurück an den Startpunkt gesetzt wird?


    mfg. TwiTIn

    PS.: Man kann die Picturebox schon mit w,a,s,d bewegen! THX im vorraus
    Du machst ja iwie die Linien und da musst du dir die Koordinaten von merken und dann in den Background eine Fkt. setzen, die ständig überprüft ob die aktuelle Position des kleinen Kastens iwann mal mit welchen der Linien übereinstimmt.

    Also zB so in der Art:

    VB.NET-Quellcode

    1. dim linien_koords as string(,) '2dim. Array mit den Linienkoordinaten
    2. if lininen_koords.contains(akt_Pos_X, akt_Pos_Y) then
    3. ' was soll passieren, wenn übereinstimmen
    4. else
    5. ' ansonsten
    6. end if
    hey, das mit den koordinaten ist aber recht unsauber.
    wenn ihr in der schule schon lineare funktionen besprochen habt kannst du es damit machen, einfach berechnen ob sich die gerade zwischen den punkten PositionVorher und PositionNachher mit einer der Linien schneidet. wichtig ist, dass der schnittpunkt zwischen den beiden oben genannten punkten liegt - außerhalb ist KEIN schnittpunkt.

    Noch ein tipp nebenbei: eine picturebox zu bewegen ist recht unschön. mach es doch mit GDI+. Dann kannst du selbst entscheiden wie die spielfigur aussieht etc. ein einfaches kästchen ist ja recht langweilig^^
    ansonsten kann ich dir nur ans herz legen, das ganze auf gdi zu bauen. formelemente sind gaaarnicht dafür gemacht in realsize "animiert" bewegt zu werden.

    wenn du dann mit gdi halt ne linie zeichnest kannste deren einzelne pixel abspeichern und die dnan halt zum checken nutzen, oder noch besser du speicherst den pfad, der sozusagen nicht verlassen werden darf, währ besser als jeden linienpixel zu speichern
    @ kinsi
    desshalb ja die lineare funktion. dann braucht man die pixel nicht zu speichern. man braucht lediglich den start und endpunkt sowie die position des spielers (jetzt und davor!). dann kann man berechnen ob man gegen die wand gelaufen ist.
    Hab net wirklich Ahnung, was ich da tue, aber es funzt:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim posX, posY As Integer
    3. Dim PlayerLocation As Rectangle
    4. Dim RGrenzen As New List(Of Point)
    5. Dim LGrenzen As New List(Of Point)
    6. Dim SpielfeldShow As Boolean
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. Me.KeyPreview = True
    9. Me.DoubleBuffered = True
    10. 'Grenzen Zeichnen
    11. RGrenzen.Add(New Point(0, 0))
    12. RGrenzen.Add(New Point(5, 100))
    13. RGrenzen.Add(New Point(10, 120))
    14. RGrenzen.Add(New Point(10, 140))
    15. RGrenzen.Add(New Point(0, 160))
    16. RGrenzen.Add(New Point(30, 200))
    17. LGrenzen.Add(New Point(50, 0))
    18. LGrenzen.Add(New Point(55, 100))
    19. LGrenzen.Add(New Point(60, 120))
    20. LGrenzen.Add(New Point(60, 140))
    21. LGrenzen.Add(New Point(50, 160))
    22. LGrenzen.Add(New Point(80, 200))
    23. 'Spielfigur setzen
    24. PlayerLocation = New Rectangle(5, 5, 10, 10)
    25. posX = PlayerLocation.Left
    26. posY = PlayerLocation.Top
    27. 'Zeichnen erlauben
    28. SpielfeldShow = True
    29. End Sub
    30. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    31. 'Pfeiltasten abfragen
    32. Select Case e.KeyCode
    33. Case Keys.Up
    34. posY -= 1
    35. If posY < 0 Then posY = 0
    36. Case Keys.Down
    37. posY += 1
    38. If posY > Me.Height Then posY = Me.Height
    39. Case Keys.Left
    40. posX -= 1
    41. If posX < 0 Then posX = 0
    42. Case Keys.Right
    43. posX += 1
    44. If posX > Me.Width Then posX = Me.Width
    45. End Select
    46. PlayerLocation = New Rectangle(posX, posY, 10, 10)
    47. 'Paint auslösen
    48. Me.Invalidate()
    49. End Sub
    50. Dim pen As New Pen(Brushes.Black, 2)
    51. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    52. Dim bmp As Bitmap = New Bitmap(510, 512)
    53. Dim g As Graphics = Graphics.FromImage(bmp)
    54. If SpielfeldShow Then
    55. 'Spielfigur
    56. g.FillRectangle(Brushes.Red, PlayerLocation)
    57. 'Linke und rechte Grenze
    58. g.DrawLines(pen, RGrenzen.ToArray)
    59. g.DrawLines(pen, LGrenzen.ToArray)
    60. 'Prüfe, ob Farbe unter Pixel Schwarz ist
    61. If bmp.GetPixel(PlayerLocation.Left, PlayerLocation.Top).ToString = "Color [A=255, R=0, G=0, B=0]" OrElse _
    62. bmp.GetPixel(PlayerLocation.Left + 9, PlayerLocation.Top).ToString = "Color [A=255, R=0, G=0, B=0]" OrElse _
    63. bmp.GetPixel(PlayerLocation.Left, PlayerLocation.Top + 9).ToString = "Color [A=255, R=0, G=0, B=0]" OrElse
    64. bmp.GetPixel(PlayerLocation.Left + 9, PlayerLocation.Top + 9).ToString = "Color [A=255, R=0, G=0, B=0]" Then
    65. 'Kollision findet statt
    66. Me.Text = "BÄM"
    67. End If
    68. Me.BackgroundImage = bmp
    69. End If
    70. End Sub
    71. End Class

    Frag mich jetzt bloß keiner, warum ich das mache:
    .ToString = "Color [A=255, R=0, G=0, B=0]"

    Kann nämlich nur sagen, das es anders net funktionieren wollte. :wacko:

    :D
    Naja, knall es halt mal in ein neues Projekt. Bewegung über Pfeiltasten, Kollision wird in der Titelzeile der Form als "BÄM" angezeigt.
    Vermutlich ist der Code nicht als wirklich Lösung anzusehen, aber ich dachte ich poste ihn mal, damit jemand erklären kann, wie man es richtig machen sollte. Interessiert mich halt auch.
    Dann wäre es Nett, wenn du mir die Sachen, die du anders machen würdest, zeigst. Oder ins Detail gehst, was eventuell auf jeden Fall vermieden werden sollte.
    :whistling:

    //Edit

    Habe gerade erkannt, das man die Level dafür einfach mit einem Malprogramm erstellen kann.. Beispielbild ist im Anhang, rein in die Ressourcen und es kann losgehen. :D
    Angepasster Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim posX, posY As Integer
    3. Dim PlayerLocation As Rectangle
    4. Dim SpielfeldShow As Boolean
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. Me.KeyPreview = True
    7. Me.DoubleBuffered = True
    8. Me.Size = New Size(512, 512)
    9. Me.BackgroundImageLayout = ImageLayout.None
    10. 'Spielfigur setzen
    11. PlayerLocation = New Rectangle(15, 25, 10, 10)
    12. posX = PlayerLocation.Left
    13. posY = PlayerLocation.Top
    14. 'Zeichnen erlauben
    15. SpielfeldShow = True
    16. End Sub
    17. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    18. 'Pfeiltasten abfragen
    19. Select Case e.KeyCode
    20. Case Keys.Up
    21. posY -= 1
    22. If posY < 0 Then posY = 0
    23. Case Keys.Down
    24. posY += 1
    25. If posY > Me.Height Then posY = Me.Height
    26. Case Keys.Left
    27. posX -= 1
    28. If posX < 0 Then posX = 0
    29. Case Keys.Right
    30. posX += 1
    31. If posX > Me.Width Then posX = Me.Width
    32. End Select
    33. PlayerLocation = New Rectangle(posX, posY, 10, 10)
    34. 'Paint auslösen
    35. Me.Invalidate()
    36. End Sub
    37. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    38. Dim bmp As Bitmap = New Bitmap(My.Resources.Bild1)
    39. Dim g As Graphics = Graphics.FromImage(bmp)
    40. If SpielfeldShow Then
    41. If bmp.GetPixel(PlayerLocation.Left, PlayerLocation.Top).ToString = "Color [A=255, R=0, G=0, B=0]" OrElse _
    42. bmp.GetPixel(PlayerLocation.Left + 9, PlayerLocation.Top).ToString = "Color [A=255, R=0, G=0, B=0]" OrElse _
    43. bmp.GetPixel(PlayerLocation.Left, PlayerLocation.Top + 9).ToString = "Color [A=255, R=0, G=0, B=0]" OrElse
    44. bmp.GetPixel(PlayerLocation.Left + 9, PlayerLocation.Top + 9).ToString = "Color [A=255, R=0, G=0, B=0]" Then
    45. 'Kollision findet statt
    46. Me.Text = "BÄM"
    47. Else
    48. Me.Text = Nothing
    49. End If
    50. 'Spielfigur
    51. g.FillRectangle(Brushes.Red, PlayerLocation)
    52. Me.BackgroundImage = bmp
    53. End If
    54. End Sub
    55. End Class


    Die Steuerung sollte auf jeden Fall verbessert werden. The Maze kann man mit dieser jedenfalls vergessen. Mal gucken, das ganze noch auf Maussteuerung umbauen, damit da mal mehr Speed und freie Bewegung reinkommt. ^^
    Bilder
    • Bild1.png

      27,33 kB, 512×512, 135 mal angesehen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Unwesen“ ()