Wie kann man in ein 2D Game schießen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von mox.

    Wie kann man in ein 2D Game schießen

    Hallo,

    Ich hab seit einpaar Tage angefangen ein 2D Game zu proggen.
    Screenshot:



    Quellcode

    VB.NET-Quellcode

    1. Option Explicit On
    2. Public Class Form1
    3. Dim energy As Double
    4. Dim km As Double
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. energy = 100
    7. Timer1.Start()
    8. End Sub
    9. Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    10. KeyPreview = True
    11. Select Case e.KeyChar
    12. Case "w"c
    13. Panel1.Location = New Point(
    14. Panel1.Location.X,
    15. Panel1.Location.Y - 10)
    16. Panel1.BackgroundImage = System.Drawing.Image.FromFile("C:\Users\z\Desktop\oben.jpg")
    17. energy -= 0.01
    18. km += 100
    19. Case "a"c
    20. Panel1.Location = New Point(
    21. Panel1.Location.X - 10,
    22. Panel1.Location.Y)
    23. Panel1.BackgroundImage =
    24. System.Drawing.Image.FromFile("C:\Users\z\Desktop\links.jpg")
    25. energy -= 0.01
    26. km += 100
    27. Case "s"c
    28. Panel1.Location = New Point(
    29. Panel1.Location.X,
    30. Panel1.Location.Y + 10)
    31. Panel1.BackgroundImage = System.Drawing.Image.FromFile("C:\Users\z\Desktop\unten.jpg")
    32. energy -= 0.01
    33. km += 100
    34. Case "d"c
    35. Panel1.Location = New Point(
    36. Panel1.Location.X + 10,
    37. Panel1.Location.Y)
    38. Panel1.BackgroundImage = System.Drawing.Image.FromFile("C:\Users\z\Desktop\rechts.jpg")
    39. energy -= 0.01
    40. km += 100
    41. For Each pbox As Control In Me.Controls
    42. If pbox.Tag = "wall" Then
    43. Dim rect3 As New Rectangle
    44. rect3.Location = pbox.Location
    45. rect3.Size = pbox.Size
    46. Dim rect1 As New Rectangle
    47. rect1.Location = Panel1.Location
    48. rect1.Size = Panel1.Size
    49. If rect1.IntersectsWith(rect3) Then
    50. Panel1.Location = New Point(
    51. Panel1.Location.X - 30,
    52. Panel1.Location.Y)
    53. MsgBox("Zugang nur für Schiffe der Vengeance-Goliath Reihe")
    54. End If
    55. End If
    56. Next
    57. End Select
    58. End Sub
    59. Private Sub Form2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    60. Select e.KeyChar
    61. Case "q"c
    62. Panel1.Size = New Size(
    63. Panel1.Width - 10,
    64. Panel1.Height - 10)
    65. Case "e"c
    66. Panel1.Size = New Size(
    67. Panel1.Width + 10,
    68. Panel1.Height + 10)
    69. End Select
    70. End Sub
    71. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    72. PictureBox1.Location = New Point(
    73. PictureBox1.Location.X - 1,
    74. PictureBox1.Location.Y + 1)
    75. Label3.Text = "Energy = " & energy
    76. Label4.Text = "km = " & km
    77. If energy <= 0 Then Me.KeyPreview = False
    78. If energy <= 20 Then Label3.ForeColor = Color.Red
    79. End Sub
    80. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    81. Me.Close()
    82. End Sub
    83. End Class


    Ich weiß aber nicht genau wie ich das schießen mit Laser programmieren kann :(
    Hat jemand von euch vielleicht eine Idee dazu :?:
    Danke im voraus.

    Mfg, user82821.
    Zuerst einmal solltest du den ganzen Code in die Tonne werfen. Controls eignen sich absolut garnicht zum Erstellen von Spielen. Da solltest du auf GDI+ zurückgreifen (zumindest für den Anfang).
    Klick mich
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Und für ein Schuss baust du dir ein Timer, welcher sozusagen die GameTicks (Geschwindigkeit) vorgibt. Bei einem Schuss wird ein Projektil Objekt erstellt, mit GDI gezeichnet und durch den Timer werdne die Coordinaten so verändert, dass sich der Schuss solange bewegt bis er aus dem Spielfeld oder auf ein anderes Objekt getroffen ist. Dafür ist ein bischel mathematisches Geschick gefordert wie du die Flugbahn berechnest.

    Dodo schrieb:

    Dafür ist ein bischel mathematisches Geschick gefordert wie du die Flugbahn berechnest.
    @user82821:: Da fällt mir nur ein: Wurfparabel.
    Dreh das Koordinatensystem so, dass die Flugrichtung in x geht, da ist das einfach zu lösen.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich würde gar nicht erst mit Timern oä anfangen :D. Wenn du ernsthaft ein Spiel programmieren willst, dann mach das, wie ich vorher schon gesagt hab, mit ner anständigen Engine. Was dann aber auch noch dazu gehört, ist eine anständige Struktur. Es wird dir sicher nicht leicht fallen, das zu machen, wenn du es jedoch dann einmal hast, ist der Rest ein Kinderspiel. Um jetzt aber auf das mit dem Timer zurückzukommen, ich würde auf ne GameLoop setzen, welche dann 30 oder 60 Mal die Sekunde (ohne Timer :P) durchläuft und dann im Grunde genommen den folgenden Aufbau hat:
    1. Updates durchführen (z.B. die Flugbahn eines Projektils berechnen oder die nächste Bewegung des Gegners durchführen)
    2. Zeichnen
    Hierzu würde ich mir auch noch Artentus seine Game-Lib "GameUtils" anschauen, die ist gut strukturiert (wenn auch ziemlich kompliziert aufgebaut) und halt OpenSource, wodurch du einfach durch den Sourcecode schauen kannst. Link dazu ist hier: [C#] [OpenSource] GameUtils
    Hallo,

    obwohl das Thema bereits 2 Jahre alt ist, muss ich trotzdem hier posten. Für die Spielprogrammierung würde ich die GDI-Rendering dringend abraten. Die Performance ist die höchste Priorität für die Spiele.

    Ich würde euch WPF oder DirectX-Rendering jeweils von Microsoft empfehlen. Die WPF enthält auch Hardwarebeschleunigung. Der Threadersteller hätte lieber mit WPF arbeiten müssen, dann wäre seine Coding ganz okay.
    wenn du etwas c# kentniss hast, würde ich dir dringend raten, auf unity5 engine umzustiegen. das hat zwar nix mit vb und zu diesme thema zu tun aber ich wollte es nur gesagt haben.


    EDIT by LaMa5:
    - R.I.P.
    Hier könnte meine Signatur stehen.

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