XNA - Bücher, Tipps, Tutorials

  • VB.NET

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von Rootbob91.

    Du kannst auch ausserhalb des Paint Events zeichnen. Das Problem hierbei ist, du hast keinen Plan wann das Fenster überzeichnet wird und das System das Fenster neu zeichnet. Dann ist plötzlich das Gezeichnete weg. Darum sendet das System WM_PAINT ans Fenster wenns neu gezeichnet werden muss, die Form Klasse hohlt sich dann per BeginPaint() den DC des Fensters und erstellt ein Graphicsobjekt daraus, dieses wird dann als Parameter im Paint-Event mitgeliefert. Nach verlassen des Events gibt die Klasse den DC per EndPaint() wieder frei.

    Da brauchst du dich also erstens nicht drum zu kümmern obs auch neu gezeichnet wird und zweitens wird dir sogar ein Graphicsobjekt mitgeliefert.
    C# ist nicht sonderlich schwer, VB.Net mit C ähnlicher Syntax und n bisschen Pointerkontext. Wer sich mit VB.Net auskennt hat da eigentlich leichtes Spiel
    Okay, damit habt ihr mir das schonmal etwas näher gebracht!!

    Ich hatte letztens noch ein wenig rumprobiert, da habe ich im Paint Event einfach ein Sub aufgerufen "Fliegen", der ich dann e als ByRef übergeben habe, damit gings dann einigermaßen, naja ich wurschtel mich mal durch ;)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Klassen brauchste nichtmal als Referenz übergeben, per Value geht da automatisch ne Referenz rein. Das liegt daran das Klasseninstanzen immer Pointer sind (sieht man denen nur net an), in CLI heißen die auch ref-Klassen. Val-Klassen gibts auch noch, diese werden per Value übergeben (in C# und VB aber als Structure übersetzt), wobei CLI-Structures in VB & C# auch Structures sind :whistling:
    Les dir das mal durch, ich finds sehr gut erklärt. Die Kurzfassung:
    Klasseninstanzen sind Pointer (also Zeiger auf das eigentliche Objekt im CLR-Heap also im Speicher). So wird bei einer Funktion nur die Speicheraddresse übergeben, so greifste natürlich automatisch auf das Objekt zu. Structures und Valueklassen werden kopiert und dann übergeben. Das hat einen Sinn, mal angenommen du hast ne List mit 200 Elementen, diese müssten alle kopiert werden und das würde extrem auf Performance und Speicher gehen. So wird nurn Zeiger übergeben und in der Funktion kann man dann einfach aufs Objekt im Speicher zugreifen.

    In anderen Sprachen wie C++ haben Klassen einen Kopierkonstruktor und werden auch per Value übergeben. Da sollte man natürlich grundsätzlich als Referenz übergeben
    Schaut euch mal das an, so habe ich das allgemein mit dem Paint Event verstanden, bzw. mit dem Zugriff darauf:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    3. Schreiben(e)
    4. End Sub
    5. Public Event Geschrieben()
    6. Public Sub Schreiben(ByVal e As PaintEventArgs)
    7. e.Graphics.DrawString("test", New Font(FontFamily.GenericSansSerif, 32), Brushes.CadetBlue, 0, 0)
    8. RaiseEvent Geschrieben()
    9. End Sub
    10. End Class



    Mein persönliches Problem damit ist einfach, dass ich dann noch nicht so ganz weiß, wie ich das mache, wenn ne Klasse beispielweise die Funktion Schreiben (auch wenn die vll. sinnlos erscheint.. als Beispiel..) aufruft. Wie male ich das dann, ich weiss ja vorher nicht, wann das aufgerufen wird, denn ich muss das ja dann scheinbar wie oben, von vorne rein im Paint Event angeben, dass diese Methode durchgeführt wird?
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Nanana, du denkst ganz und gar nicht objektorientiert. Die einzelnen Spielobjekte zeichnen sich alle selber, im Render-Zyklus werden lediglich die einzelnen Render-Methoden der Objekte aufgerufen. Schau dir mal das hier an:
    [C#] [OpenSource] GameUtils
    Bzw. speziell das:
    github.com/Artentus/GameUtils/…ter/GameUtils/GameLoop.cs
    Normal denke ich das schon, aber wie gesagt verwirrt mich der GDI-Kram :)..

    Um mal kurz ein Argument in den Raum zu schmeißen:
    Wir nehmen an, dass ich einen Schuss "erstelle" also instanziere (eine Klasse, abgeleitet von der Picturebox, visible, location gesetzt etc.), sie auch dadurch automatisch auf der Form sichtbar ist?

    Und wenn ich dann möchte, dass diese sich bewegt, dann müsste ich ja einfach nur in einer Sub, die sich dann fliegen oder bewegen nennt, Me.Location inkrementieren?

    EDIT:
    @Artentus: Ich habs geladen, ich schaus mir mal an :)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Jo, aber dann bin ich wieder an dem Punkt, dass ichs nicht hinkriege alles zu zeichnen wenns nötig ist T.T..

    Mit der Inherits Picturebox Methode würde das ja warscheinlich so klappen wie in meinem vorigen Post, wenn das wieder alles nur übers Paint Event klappt, check ich nicht wie ichs einfügen kann, dass der Spieler schießt und das dann gezeichnet wird.

    Wäre ja dann irgendwie über

    VB.NET-Quellcode

    1. e.Graphics.DrawImage()
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Jo, ich verstehe schon, so wars auch ursprünglich gemeint, dass ichs nur mit GDI machen wollte, leider fehlt mir die oben genannte Realisierungs-Möglichkeit/Idee..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Gonger96 schrieb:

    Guck dir doch mal Artentus Post an. So hättest du eine gute Lösung
    Ich hatte es mir runtergeladen und wollts mir anschauen, leider bekommt Visual Studio n Lizenzfehler, müsst ich morgen schauen :/..
    Und um mich jetzt durch den C#-Code zu kämpfen (von der Seite), habe ich gerade nicht den Ehrgeiz^^.. Ich hatte zwar C# in der Schule, aber ist echt nicht meine Welt, ich mags nicht :/..

    Ps: Danke für eure Zeit die ihr hier investiert, ich weiß das zu schätzen ;)!
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Vom Prinzip her siehts so aus:

    VB.NET-Quellcode

    1. Interface IRenderable
    2. Sub Render(graphics As Graphics)
    3. End Interface
    4. Dim renderableObjects As List(of IRenderable)
    5. Sub X_Paint(sender As Object, e As PaintEventArgs) Handles X.Paint
    6. For Each item In renderableObjects
    7. item.Render(e.Graphics)
    8. Next
    9. End Sub
    Nur hab ich das in meiner Engine natürlich enorm abstrahiert und mit mehr Möglichkeiten versehen.

    Edit: du kannst dir den ganzen Code auch auf GitHub ansehen (siehe zweiter Link).

    Eistee schrieb:

    Weiß ja nicht genau wo es bei Rootbob91 hakt.
    Ich erklärs gerne nochmal, denn mir wäre das sehr wichtig :)...

    Alsoo:

    (die jetzige Variante ohne GDI)
    Nehmen wir an ich habe:

    - frm_Gamepanel
    Ein Spielfeld (dort sollen später natürlich auch neue Gegner spawnen etc..)

    Ich habe jeweils einzelne Klassen gemacht, die abgeleitet von PictureBox sind:
    - Spieler
    Eigenschaften: Punkte, Leben und ein Schiff
    Funktionen: Bewegen

    - Schiff
    Eigenschaften: Name, Gesundheit, Bewegungsgeschwindigkeit und eine Waffe

    - Waffe
    Eigenschaften: Schaden, Geschwindigkeit (des Schusses), Schussbild und SchussSound (wie der Schuss aussieht und sich anhört)

    Später werde ich ggf. das Schiff dann als Spieler selber nehmen, weil die Klassentrennung ja nicht sein muss..

    Jetzt fliegt der Spieler natürlich rum und schießt, dann würde ich mit dem jetzigen Stand eine neue Class Schuss generieren, die im Konstruktor die Position des Spielers zugewiesen bekommt und von da aus dann nach vorne fliegt.. Bis zum Rand natürlich.

    Ich kriegs nicht gebacken wie ich das nun auf GDI gebaut bekomme :/.. Mit Controls klappt das ja, da diese ja gezeichnet werden, wenn sie "konstruiert wurden".. Aber so :/..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..