[SFML] Sprite als Zeiger

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    [SFML] Sprite als Zeiger

    Ich hätte mal eine Frage,

    Wie erstelle ich Sprites als Zeiger?
    Ich weiß, dass es solch eine Funktion in C# gibt, aber weiß nicht ob es das auch für vb.net gibt.
    Laut Google finde ich nichts also gibt es das wahrscheinlich nicht, jedoch um 100% sicherzugehen wollte ich hier fragen!



    mfg
    Naja du kannst in VB sehr wohl auch mit Zeiger(deutsches Wort für Pointer) arbeiten.
    Nur ist das dort noch komplizierter als in C#. In VB kannst du z.B. die Marshal-Klasse oder die GCHandle Struktur verwenden. Was Sprites angeht kann ich dir jedoch nicht helfen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Tut mir leid wenn mans anders nennt, habs nur in einem C# Tutorial gehört, dass es heißt "Einen Sprite als Zeiger erstellen".

    Wenn sowas nicht geht,
    Wie könnte ich dann mein Problem lösen:

    Ich versuche mehrere Sprites("Tropfen") die vom Himmel herabregnen sollen(alle 0,5 Sekunden soll ein neuer Spawnen mit einer Random x Koordinate) zu zeichnen.

    Habe es mit jeder erdenklichen For und For each Schleife probiert, Habe eine List of Sprite erstellt, welcher ,nachdem auf der Stopwatch 500 millisekunden vergangen sind,
    eine Sprite("Tropfen") erstellt und diesen Spawnen lässt. Habe es mit Timern statt einer Stopwatch probiert, habe eine zweite variable deklariert welche halt um +1 steigt nach jedemmal wenn 500 millisekunden vergangen sind und dann den index = variable aus der Liste zeichnet. Mein Code ist derzeit komplett durcheinander, werde ihn gleich noch neu schreiben, nur weiß ich derzeit überhaupt nicht weiter.


    @thefiloe

    Siehe oben.

    Ist eigentlich nur für ein kleines 2D Spiel als Übung, deswegen sollte es nichts allzu kompliziertes sein, da ich eine "Alternative" für den Zeiger wohl weiter gebrauchen werde, da ich ständig Probleme bekomme wenn ich mehrere Sachen in einem gewissen Intervall Abstand zeichnen lassen will.
    Ein Objekt kann kein Zeiger sein, ein Zeiger ist selbst ein spezieller Wertetyp. Was du meinst ist, "einen Zeiger auf ein Objekt erstellen".
    Allerdings brauchst du für sowas überhaupt keine Pointer, das geht doch auch alles schön in .Net-Manier. Am besten du zeigst mal, was du hast, und dann was daran nicht funktioniert.

    @thefiloe
    Irgendwie wiederstrehbt es mir, das als Verwenden von Pointern zu bezeichnen. Das ist für mich eher das Aufrufen von externen Funktionen, die für einen den Zeiger erstellen und diesen dann in eine IntPtr-Struktur wrappen. Das kann man aber auch nur dazu verwenden, um den Pointer dann wieder an andere externe Funktionen zu übergeben, von Zeigerarithmetik o.ä. fehlt jede Spur.
    Wie gesagt, der Code ist komplett durcheinander und muss neu geschrieben werden:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports SFML
    3. Imports SFML.Graphics
    4. Imports SFML.Window
    5. Public Class Form1
    6. Public WithEvents RenderWindow As Graphics.RenderWindow
    7. Dim Aktiv As Boolean = True
    8. Dim texture As New Texture("Eimer2.png") 'Bild als Textur deklarieren
    9. Dim Spieler As New Sprite(texture) 'Anzeigebild als Bild deklarieren
    10. Dim Bild As New Texture("Park.png")
    11. Dim Hintergrund As New Sprite(Bild)
    12. Dim Gegner As New Texture("Tropfen.png")
    13. Dim List As New List(Of Sprite)
    14. Dim Position As New Random
    15. Dim Zahl2 As Single = Position.Next(0, 700)
    16. Dim Position2 As New Random
    17. Dim Zahl3 As Single = Position2.Next(0, 700)
    18. Dim Stopw As New Stopwatch
    19. Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    20. Me.Hide()
    21. Gameloop()
    22. End Sub
    23. Sub Gameloop()
    24. 'Tropfen
    25. 'Unser RenderWindow wird mit einer Zeile erstellt und ist dann einsatzbereit
    26. RenderWindow = New Graphics.RenderWindow(New VideoMode(800, 600), "Spiel") 'Fenster erstellen
    27. 'Hier können einige Einstellungen vorgenommen werden
    28. With RenderWindow
    29. '.SetFramerateLimit(120) 'Framerate auf 120 FPS begrenzen
    30. .SetFramerateLimit(120)
    31. '.UseVerticalSync(True) 'Verticale Sync - geringere Framerate!
    32. .SetVerticalSyncEnabled(True)
    33. End With
    34. Spieler.Position = New Vector2f(400, 500) 'Verschieben (New Window.Vector2f statt New Point)
    35. Spieler.Rotation = 0 'Rotation
    36. Spieler.Scale = New Vector2f(0.4, 0.4) 'Vergrösserungsfaktor
    37. 'sprite.Color = New Graphics.Color(0, 0, 0) 'Transparenz
    38. 'Grafiken etc werden geladen
    39. 'Der RenderLoop..
    40. List.Add(New Sprite(Gegner))
    41. Do While Aktiv = True
    42. Stopw.Start()
    43. If Stopw.ElapsedMilliseconds = 500 Then
    44. Stopw.Reset()
    45. List.Add(New Sprite(Gegner))
    46. End If
    47. 'Die Zeile lässt die Events ausführen (z.b. Tastatureingaben etc)
    48. RenderWindow.DispatchEvents()
    49. 'ZEICHENOPERATIONEN:
    50. 'färbt den Bildschirm schwarz
    51. RenderWindow.Clear(New Graphics.Color(0, 0, 0)) 'altes Bild löschen (Die Zahlen sind Farben hintergrund)
    52. RenderWindow.Draw(Hintergrund)
    53. For Zähler As Integer = Zähler To List.Count - 1
    54. RenderWindow.Draw(List(Zähler))
    55. Next
    56. RenderWindow.Draw(Spieler)
    57. 'RenderWindow.Draw(New Graphics.Text(New Text("FPS: " & (Math.Round(1 / RenderWindow.GetView.ToString))) 'FPS BERECHNEN
    58. 'Aktualisiert den Bildschirm
    59. RenderWindow.Display() 'neues Bild zeigen
    60. 'verhindert ein "einfrieren" der GUI.
    61. Application.DoEvents()
    62. Loop
    63. End Sub
    64. Private Sub RenderWindow_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles RenderWindow.Closed
    65. Me.Close()
    66. RenderWindow.Close()
    67. Aktiv = False
    68. Application.Exit()
    69. End Sub


    Hatte noch ein zweites Spiel gemacht, wo ich soein ähnliches Problem hatte undzwar dass ich "Schüsse" von einem Raumschiff zeichnen sollte, wenn space gedrückt wird. Derzeit klappt es das ein Schuss gezeichnet wird aber wenn man wieder Space drückt, wird der erste Schuss gelöscht und neu erstellt. Hier mal der Code davon (der ist etwas geordneter! :P)

    Code davon kommt im nächsten Post, da zu Lang.

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

    VB.NET-Quellcode

    1. Do While Aktiv = True
    2. Stopw.Start()
    3. If Stopw.ElapsedMilliseconds = 500 Then
    4. Stopw.Reset()
    5. List.Add(New Sprite(Gegner))
    6. End If


    Wie gesagt der Code ist extrem durcheinander!! Glaube da müsste auch noch ein renderwindow.draw(List(irgendeineVariable)) rein bzw war da schonmal drin^^


    € Habe noch ein oben erwähntes 2tes Spiel wo ich ähnliche Probleme habe, leider kann ich davon den Quellcode nicht posten, da dieser über 15000 Zeichen lang ist.
    Das kann so natürlich nicht funktionieren. Die Stopwatch wird genau einmal auf 500 Millisekunden stehen und danach einfach fleißig weiterlaufen. Und selbst diesen einen Moment, in der der Zähler auf 500 Millisekunden steht, wirst du höchst wahrscheinlich nie erreichen, weil du nicht genau bei 500ms an dieser Codestelle bist. Du solltest lieber deinen Gameloop begrenzen und dann in Gameticks rechnen.
    Stopw.reset stellt ja die Stopwatch zurück auf 0
    und habe es auch schon bereits mit If Stopw.elapsedmilliseconds >= 500 versucht

    Ich hab wie gesagt mit all meinen mir erlernten Kentnissen(:D) versucht das Problem zu lösen(seit 3 Tagen) und wollte nicht voreilig hier im Forum fragen, da man hier oft
    niedergemacht wird, sollte man vorher nicht alles versucht haben.

    € Hier das Tutorial in C# bei ca 4. minute kommt das vor:

    youtube.com/watch?v=PJanaKFj2E8
    Oh, ich dachte das wäre C# LOL (Peinlich).
    Mir kam alles so ähnlich vor
    Habe einfach dass was er erklärt hat versucht in Vb.net umzusetzen , da ich manches auch so schon umsetzen konnte gab es kaum große Schwierigkeiten bis jetzt. Habe weniger auf seinen Code geschaut.


    € Jetzt seh ich das C++ oben im Fenster im Tutorial :facepalm:
    :S

    Das Problem ist ja, dass kein Mensch ein Sfml Tutorial in Vb.net hochgeladen hat(Zumindest nicht auf Youtube).
    Habe lediglich hier im Forum einen Codeschnipsel mit Erklärungen gefunden um den Renderwindow zu starten, aber der war veraltet(sfml 1.6).
    Wenn ich stattdessen eine andere "Sprache" (oder wie man diese "Sprachen" für 2D / 3D Spiele entwicklung nennt) nehme, kommen andere Probleme auf.
    z.B. Xna geht auf Windows 8 nicht oder die "Sprache" ist nicht Einsteigergerecht sondern relativ schwer.
    Also weiß Ich auch nicht was ich sonst machen soll, mit GDI+ arbeiten??
    Dann guck ich mir lieber Tutorials in C++ an, weil man das erklärte teilweise in vb.net übernehmen kann.
    aber gut, Hier gehts ja jetzt um mein Zeigerproblem, wenn jemand Ansätze hat wie ich vorran kommen könnte, nur zu! 8-)
    Dein Problem ist aber kein Zeigerproblem.
    Erstens mal ist diese Schleife hier falsch:

    VB.NET-Quellcode

    1. For Zähler As Integer = Zähler To List.Count - 1
    2. RenderWindow.Draw(List(Zähler))
    3. Next
    Es muss nämlich lauten:

    VB.NET-Quellcode

    1. For Zähler As Integer = 0 To List.Count - 1
    2. RenderWindow.Draw(List(Zähler))
    3. Next

    Zudem sehe ich nirgendwo, dass du den neu erstellten Sprites eine Position zuweist, sie befinden sich also alle an 0,0 und damit übereinander.
    Ja, wie gesagt ziemlich durcheinander^^

    Hatte den neu gezeichneten Sprites eine Position zugewiesen, habs aber jetzt bei den ganzen Versuchen mit den Schleifen usw wohl irgendwann gelöscht.
    Oben hab ich aber ja ein Random deklariert zwischen 0 und 700, dieses war die X Koordinate des neuen Sprites.

    Ich fang jetzt ein ganz neues Projekt an, damits kein durcheinander mehr gibt.