Einen Laser Schuss von einem Raumschiff zu einer Bestimmten Position

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Einen Laser Schuss von einem Raumschiff zu einer Bestimmten Position

    Hallo Community

    ich Programmiere ein 2D 'StarGate' Adventure Spiel und habe Folgendes Problem.
    Ich möchte eine Art 'Waffe' (Laser Schüsse) vom Raumschiff zu einer Bestimmten Position senden.
    Also ich habe es versucht und habe bis jetzt das :

    VB.NET-Quellcode

    1. Public Class Bullet
    2. 'Public Variables
    3. Public Typ As String
    4. Public FirstLocation As Point
    5. Public LastLocation As Point
    6. 'List of all Bullets
    7. Public Shared Bullets As New List(Of Bullet)
    8. Public Shared Function CreateBullet(ByRef Bullet As Bullet, ByRef FirstLocation As Point, ByRef LastLocation As Point, Optional ByRef Typ As String = "Laser")
    9. 'create new bullets for the list
    10. Try
    11. Bullet = New Bullet
    12. With Bullet
    13. .FirstLocation = FirstLocation
    14. .LastLocation = LastLocation
    15. .Typ = Typ
    16. End With
    17. Bullets.Add(Bullet)
    18. Return True
    19. Catch ex As Exception
    20. Return False
    21. End Try
    22. End Function
    23. Public Shared Sub UpdateBullet()
    24. 'Update every bullet every tick
    25. For Each Bullet As Bullet In Bullet.Bullets
    26. If New Rectangle(Bullet.FirstLocation, Bullet.LastLocation).IntersectsWith(New Rectangle(GameScreen.Location, GameScreen.Size)) = False Then
    27. Bullets.RemoveAt(Bullets.IndexOf(Bullet))
    28. Else
    29. Bullet.FirstLocation.X += 10
    30. Bullet.FirstLocation.Y += 10
    31. Bullet.LastLocation.X += 10
    32. Bullet.LastLocation.Y += 10
    33. End If
    34. Next
    35. End Sub
    36. End Class


    Code aus dem Draw Event für jedes Bullet

    VB.NET-Quellcode

    1. For Each Bullet As Bullet In Bullet.Bullets
    2. Dim pen As New Pen(Brushes.Orange, 2)
    3. pen.DashStyle = Drawing2D.DashStyle.Dash
    4. G.DrawLine(pen, Bullet.FirstLocation, Bullet.LastLocation)
    5. Next




    Bild von der Umgebung(Die Gelb / Orangen Linien sind meine versuche.
    Dabei soll nur immer ein Laser als Bullet abgeschossen werden.


    Also um Hilfe wäre ich euch sehr Dankbar wenn ihr Verbesserung Vorschläge habt immer her damit möchte das so gut wie Möglich machen.

    MFG
    CypherTrix
    Moin,

    ist das Problem, dass Die Bullets nicht beim Raumschiff rauskommen? Sonst kann ich da jetzt nicht grade viel erkennen.

    Im 2-dimensionalen Raum kannst Du zweidimensionale Vektoren benutzen, um die Strecke dann entsprechend zu bilden. Geht über die Magnitude/Länge des Vektors, da die sich mit Pythagoras errechnet.

    Grüße
    #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 :!:
    Nein das Sieht nur so aus Weil sich das Raumschiff bewegt also die Schüsse werden vom Raumschiff abgeschossen
    Code Dafür

    VB.NET-Quellcode

    1. Player.Location.X + Player.Size.Width \ 2, Player.Location.Y + Player.Size.Height \ 2

    Ich möchte eine Linie sage ich mal die,die länge von 15 Pixel hat oder wie lang auch immer und sich dann zur posi bewegt also der Laser Strich.
    - Also Rechte Maustaste wird gedrückt = Bullet(laser) wird in der Welt gespawnt bei der Posi vom Raumschiff
    - Bei jedem GameTick(Tick) soll der Laser in Richtung Posi 2(Ziel Posi) bewegen. <- hier bei bleibe ich am meisten hängen ich habe keine Ahnung wie ich dass machen soll

    Ich meine der Code hier ist ja flasch weil der Laser ja direkt bei der neuen Posi ist wie bekomme ich die Berechnung dafür hin weil der Laser ja in alle 360 Grad Richtungen abgefeuert werden kann ?

    VB.NET-Quellcode

    1. Bullet.Location = New Point(x,y)
    Hier für sind Vektoren perfekt. Du hast einfach zwei Punkte (Positionen), nämlich Ursprung und Ziel.
    Der Richtungsvektor bzw. Abstandsvektor ergibt sich aus "Ziel - Urpsrung".

    Hast Du also Ursprung (10|2) und Ziel (20|10), dann ergibt sich die Differenz (10|8).
    Das ist dann der Vektor. Dessen Länge bekommst Du mit "sqrt(10^2+8^2)" = "sqrt(164)" = ~12,80. Das wäre dann die Länge der Strecke. Und dann setzt Du die Position vom Bullet entsprechend bei jedem Frame. Die Position musst Du dann natürlich auch als Vector2 verwalten.

    Grüße
    #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 :!:
    Okee soweit versteh ich das muss dazu aber sagen habe noch nie mit Vectoren gearbeitet hättest du einen Anhalts Punkt für mich
    und wie meinst du das mit Location = Vector ?
    Vektoren sind 11. Klasse Mathe. Stell's Dir einfach so vor: Es gibt zwei Koordinaten, X und Y. Dann ist es nur noch gewisse Arithmetik.
    Dein Point ist auch 2-dimensional, es fehlen halt gewisse Sachen wie Länge, Skalar- und Kreuzprodukt usw., die man dann für gewisse Sachen im Raum noch braucht. Man könnte das dann halt manuell verwalten, aber gut. Deine Location hat den Typ Point (X, Y) und ein Vector2 hat diese Koordinaten ja auch und kann für eine Position verwendet werden. Im Gegensatz zu 'nem Point, der einen Punkt darstellt, kann ein Vektor auch noch eine Richtung und Strecke darstellen.

    Grüße
    #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 :!:

    thefiloe schrieb:

    [Grafische ]Spieleprogrammierung ohne Vektoren ist [...] unmöglich.

    I fixed it for you.

    @TE lese dich in Vektoren ein, die sind mMn das mit Abstand einfachste Thema der Oberstufe, hab ich auch schon in der 7ten mit angefangen, teilweise musst ja nicht alle Funktionen verstehen warum, sondern was diese machen. Natürlich länge oder Winkel/Kreuzprodukt sollten schon verstanden werden, sind aber auch einfach.

    Zusätzlich ist deine Architektur milde gesagt Mist. Nach Möglichkeit niemals Shared verwenden(ist sogar fast immer möglich). Du hast eine Spielinstanz, diese Spielinstanz beinhaltet dein Universum/Welt, und diese Welt beinhaltet Entities(vlt. auch in Domains unterteilt jenach Welt größe). Bullet ist auch ein Entity und kann somit deiner Welt hinzugefügt werden, du kannst auch für den Anfang die Bullets getrennt von anderen Entities halten(bis du OOP richtig durchdrungen hast).
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---