Grundgerüst eines einfachen Spieles (hier - Irrgarten)

    • VB.NET

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

      Grundgerüst eines einfachen Spieles (hier - Irrgarten)

      hallo,

      hier mal ein "Grungerüst" für ein Irrgartenspiel.

      Probleme die auftreten können:
      1. ein bewegen über den Form-Rand hinweg hab ich nicht abgefangen
      2. wenn die Spielfigur größer als die schmale Seite einer Wand ist, kann eine Kollission unter umständen nicht erkannt werden.
      evtl. mehr Punkte in der Funktion Chrashed abfragen

      VB.NET-Quellcode

      1. Public Class Form1
      2. 'bild des Spielers
      3. Private player As Bitmap
      4. 'position des Spielers
      5. Private player_location As New Point(50, 50)
      6. 'Array aller Mauern als Rectangle
      7. Private border() As RectangleF = {New RectangleF(120, 40, 10, 180), New RectangleF(40, 150, 200, 10)}
      8. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
      9. Dim lastpos As Point = player_location
      10. Select Case e.KeyCode
      11. Case Keys.Down
      12. player_location = New Point(player_location.X, player_location.Y + 5)
      13. Case Keys.Up
      14. player_location = New Point(player_location.X, player_location.Y - 5)
      15. Case Keys.Left
      16. player_location = New Point(player_location.X - 5, player_location.Y)
      17. Case Keys.Right
      18. player_location = New Point(player_location.X + 5, player_location.Y)
      19. End Select
      20. If Chrashed(New Rectangle(player_location, player.Size)) = True Then
      21. Me.PictureBox1.BackColor = Color.Red
      22. player_location = lastpos
      23. Else
      24. Me.PictureBox1.BackColor = Me.BackColor
      25. End If
      26. Me.PictureBox1.Refresh()
      27. End Sub
      28. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      29. player = New Bitmap(Image.FromFile("character.png"))
      30. Me.KeyPreview = True
      31. Me.Size = New Size(300, 300)
      32. Me.PictureBox1.Dock = DockStyle.Fill
      33. End Sub
      34. ''' <summary>Zeichnet das Spielfeld und Spielfigur an der aktuellen Position.</summary>
      35. ''' <remarks></remarks>
      36. Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
      37. Dim b As New Bitmap(Me.PictureBox1.Size.Width, Me.PictureBox1.Size.Height)
      38. Using g As Graphics = Graphics.FromImage(b)
      39. g.DrawImage(player, player_location)
      40. For i As Integer = 0 To border.Count
      41. g.FillRectangles(Brushes.Black, border)
      42. Next
      43. End Using
      44. Me.PictureBox1.Image = b
      45. End Sub
      46. ''' <summary>Prüft, ob der Spieler mit einer Mauer kollidiert.</summary>
      47. ''' <param name="player">Position und Größe des Spielers.</param>
      48. ''' <returns>True wenn Kollission - sonst False.</returns>
      49. ''' <remarks></remarks>
      50. Private Function Chrashed(ByVal player As Rectangle) As Boolean
      51. For i As Integer = 0 To border.Length - 1
      52. Dim r As RectangleF = border(i)
      53. If r.Contains(player.Left, player.Top) Or _
      54. r.Contains(player.Left, player.Bottom) Or _
      55. r.Contains(player.Right, player.Top) Or _
      56. r.Contains(player.Right, player.Bottom) Then
      57. Return True
      58. End If
      59. Next
      60. Return False
      61. End Function
      62. End Class

      Kommentare erwünscht.

      Gruss

      mikeb69
      hallo bshobbit,

      natürlich sollte man den code - z.b. eines spieles - in klassen aufteilen.
      zumindest sollte man dies tun wenn man auch nur ansatzweise objektorientiert programmieren will.

      nur - was soll ich aus diesen paar zeilen in eine klasse auslagern ?
      und - der code entstand aus einer frage heraus - es ist nicht anzunehmen, dass derjenige viel damit hätte anfangen können.

      für mich ist das was ich geschrieben habe schon ok, wenn man sich das publikum hier so ansieht.
      einem gehobenen anspruch werden diese paar zeilen nicht gerecht - da stimme ich dir zu.

      und warum im sourcecode austausch ?
      ganz einfach - die frage nach der spieleprogrammierung taucht hier ständig auf somit könnte es mehr als nur einem user helfen.
      und gefunden wird es hier besser als in einer normalen frage.

      gruss

      mikeb69
      hallo noname,

      von welcher zeile sprichst du ?
      ich hab keinen unterton bemerkt

      oder meinst du das hier ?
      für mich ist das was ich geschrieben habe schon ok, wenn man sich das publikum hier so ansieht.

      wobei das, für meinen geschmack, klar formuliert ist.

      gruss

      mikeb69
      Ich stimme zu das alle paar Tage hier einer rein schneit und ein Spiel programmieren möchte. Allerdings bin ich der Meinung das es falsch ist, so jemandem einen fast fertigen Ansatz zu präsentieren, der in der Praxis keinen Wert hat, weils schlichtweg ein falscher Programmierstil ist.

      Ich würder immer erst vorschlagen sich das Galileo OpenBook anzuschaun.
      Hier nochmal der Link: galileocomputing.de/openbook/visual_basic/

      Das Buch sollte man soweit durcharbeiten, das man den Aspekt der Objektorientierung verstanden hat. Es gibt auch ein Kapitel über GDI+ in diesem Buch.

      Wenn man das alles durchgelesen hat, dann sollte man schon von alleine in der Lage sein ein solch kleines Spiel zu programmieren, ich denke wer dann immernoch keine Idee hat wie er das machen soll, sollte den weg eines Spieleprogrammierers nicht länger verfolgen, oder wenn man noch Jung ist vllt ein paar Jahre warten.

      Wenn man dann die ersten Spiele mit GDI+ fertig geschrieben hat, und immernoch weitermachen möchte, und auch noch auf Visual Basic beharrt, dann kann mich sich Artikel und Bücher "Managed Game Programming" anschauen. Das ist aber meist in C#, allerdings ist eine Konvertierung von C# nach Visual Basic meist sehr sehr einfach. Wenn man dann an die performence Grenzen der Sprache trifft (wovon ich niemals ausgehe) dann bleibt einem wohl nichts anderes über als an OpenGL/DirectX mit C++ ranzugehen, aber bis dahin sollten schon 8-15 Jahre als Hobbyprogrammierer vergangen sein.