GDI+ J&R

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ThuCommix.

    Hi,

    Da ich mittlerweile kleinere Brettspiele mit GDI realisiert habe möchte ich mich mal an einem einfachen J&R probieren. Das Spiel soll so funktionieren, dass man seine Figur durch das drücken der Leertaste hochspringen lassen kann umso Wänden auszuweichen die sich auf einen zu bewegen. So soll dasn ganze grob bisher aussehen:



    Ich habe auch schon an den grundlegenden Sachen gearbeitet(Verfeinerung des Smoothmodes etc kommt später):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class frmgame
    3. Private Function Abrunden(ByVal Rect As Rectangle, ByVal radius As Integer) As GraphicsPath
    4. Dim gp As System.Drawing.Drawing2D.GraphicsPath = New _
    5. System.Drawing.Drawing2D.GraphicsPath()
    6. Dim x, y, width, height As Integer
    7. x = Rect.X
    8. y = Rect.Y
    9. width = Rect.Width
    10. height = Rect.Height
    11. gp.AddLine(x + radius, y, x + width - radius, y)
    12. gp.AddArc(x + width - radius, y, radius, radius, 270, 90)
    13. gp.AddLine(x + width, y + radius, x + width, y + height - radius)
    14. gp.AddArc(x + width - radius, y + height - radius, radius, radius, 0, 90)
    15. gp.AddLine(x + width - radius, y + height, x + radius, y + height)
    16. gp.AddArc(x, y + height - radius, radius, radius, 90, 90)
    17. gp.AddLine(x, y + height - radius, x, y + radius)
    18. gp.AddArc(x, y, radius, radius, 180, 90)
    19. gp.CloseFigure()
    20. Return gp
    21. gp.Dispose()
    22. End Function
    23. Private Sub DrawPlayerSprite(ByVal rect As Rectangle, ByVal g As Graphics)
    24. g.DrawImage(Sprite, rect)
    25. End Sub
    26. Private Sub DrawWall(ByVal rect As Rectangle, ByVal g As Graphics)
    27. Dim gp As GraphicsPath
    28. gp = Abrunden(rect, 5)
    29. Using lgb As New LinearGradientBrush(rect, Color.Red, Color.Firebrick, LinearGradientMode.Horizontal)
    30. g.FillPath(lgb, gp)
    31. End Using
    32. End Sub
    33. Public ReadOnly Property Sprite As Image
    34. Get
    35. Return My.Resources.Player
    36. End Get
    37. End Property
    38. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    39. DrawPlayerSprite(New Rectangle(80, 80, 45, 45), e.Graphics)
    40. DrawWall(New Rectangle(400, 100, 20, 100), e.Graphics)
    41. DrawWall(New Rectangle(140, 300, 20, 100), e.Graphics)
    42. End Sub
    43. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    44. If e.KeyCode = Keys.Space Then
    45. End If
    46. End Sub
    47. End Class


    Jetzt meine Frage: wie löse ich das konzeptmäßig am Intelligentesten? Bewegt sich der Hindergrund und der Spieler "bleibt stehen", oder lasse ich den Spieler sich bewegen und der Hintergrund wird wird quasi nur weitergespult? Das Problem bei der Frage ist, dass der Spieler nur die Höhe kontrollieren soll und die Figur quasi nur weiter fliegt/ geht. Außerdem muss sich auch die "Geschwindigkeit des Objektes" erhöhen können. Kommt es zu großen Performanceproblemen wenn ich mit GDI statt mit SharpDx arbeite?

    Hier mal die Vorlage:
    JetpackJoyride
    Das soll natürlich nicht so viele Features haben sondern nur die Basis:


    Danke für eure Hilfestellung

    8-) faxe1008 8-)
    Wie schnell GDI+ ist hängt stark von der Implementierung ab und ob man für seine TextureDrawings Doppelpufferung verwendet (Die muss man im übrigen selbst Implementieren) Ich habe schon viele Spiele programmiert und im 2D Bereich ist GDI meist völlig ausreichend.

    Eventuell schaust du dir ja mal das an?:

    [OpenSource][C#] Sharpex.GameLibrary
    [C#] [Sharpex.GameLibrary] Tutorialübersicht
    Also wenn Du Direct2D verwendest sollte es fast genauso funktionieren wie mit GDI
    (Koordinaten absolut, oben Links (0|0) usw.).
    Wenn Du das ganze mit Direct3D umsetzt (Auch wenn nur 2D) ist es komplizierter.
    Auch wenn Direct2D langsamer ist als 3D sollte es mehr wie ausreichend schnell sein.

    Eine sehr detaillierte Online Doku kenn ich nicht.
    Gibt es auch wohl nicht, anonsten hätte ich die gefunden :D
    Aber was es gibt, ist einmal die Class Library Reference
    Zu speziellen fragen mit vieeeel Glück bereits beantwortete Fragen im geschlossenen SharpDX Forum
    (Ich hatte da im 3D Bereich schon einige male Glück gehabt).

    Für das generelle Verständnis, finde ich die mit installierten Beispiele sehr hilfreich.

    Angefangen habe ich hiermit: indiedev.de/wiki/SharpDX_Einstieg
    Wobei ich damit nicht allzuweit gekommen bin, dannach hab ich mich an die Beispiele gehalten.
    @ThuCommix: Ich habe mal ein wenig in deiner Übersicht gelesen und da stand, dass man Klassen an die Gameloop binden kann. Müsste ich also für Spieler und Mauern eine Klasse anlegen und die dann einfach inder Gameloop verwenden? Aber wie löse ich denn das Problem dass der Hintergrund mitsamt Mauern weitergleitet?

    8-) faxe1008 8-)
    Das hat nichts mit den GameLoop zutun, ich wollte dir damit nur eine Leistungsstarken GDI+Renderer nahebringen.

    Ich würde den Spieler starr sein lassen (Außer eventuell springen) und nur die Map dahinter bewegen, das könntest du in eine Klasse Map auslagern. Bestimmte Objekte werden erst gezeichnet wenn eine bestimmte Zeit vergangen ist, oder eine spezielle X-Koordinate absolviert wurde. Ich würde einen Hintergrund nehmen der 3x mal so groß ist wie dein Fenster, und auf jeden Teilbild ein bisschen anders aussieht, und das bewegst du dann hin und her, so das man nacheinander alle 3 Teilbilder sieht. Das lässt den Effekt erscheinen die Map würde immer weiter laufen. Jetzt kannst du Random irgendwelche Objekte fallen lassen oder Hinternisse auftauchen lassen, denen der Spieler ausweichen muss. Damit kannst du dir viel Rechenarbeit sparen, da quasi die Objekte die fallen usw sich immer im Breich X+Fenstergröße und Y+Fenstergröße befinden, es aber den Anschein hat, als wären sie weiter hinten.