[GDI+][XNA]FlappyBird Remake

    • VB.NET

    Es gibt 47 Antworten in diesem Thema. Der letzte Beitrag () ist von NGE'o.

      [GDI+][XNA]FlappyBird Remake

      Vorwort
      Nun, aufgrund der Tatsache, dass ich ein absoluter Feind von Handys und demähnlichen bin, ich aber das
      Spiel
      FlappyBird ganz witzig finde, hab ich beschlossen, das Spiel in XNA nachzuprogrammieren...

      Nun, gestern tauchte ein Thread im Forum auf, welches darauf zielte, mit Controls (Panel) dieses Spiel(FlappyBird) nachuzuahmen.
      Dem User bat ich meine Hilfe an, der jedoch beschäftigt zu scheint.

      Inhalt
      Das Spiel GDI+-FlappyBird-Remake, ist (hoffentlich) O-O-programmiert.
      Ich habe versucht es komplett OO- zu gestalten, das Beispielprojekt aber ist noch verbesserungswürdig.

      Das Spiel umfasst unteranderem
      eine GameLoop, die die Form invalidiert, und anschließend die geladenen Objekte rendert und aktualisiert.
      Ausserdem ist ein TileMap-System(Auf String -und Bitmapbasis)implementiert, und die Verdeutlichung von Erbungen.

      Screenshots
      Ich hab zwei Screenshots dem Anhang beigefügt:
      Der erste Screenshot ist vom XNA-Remake, das
      darauffolgende vom GDI+


      Projekt
      Das Projekt wird dem Anhang beigefügt.

      Bilder
      • flappybird.png

        168,36 kB, 811×512, 508 mal angesehen
      • flappybirdGDI.png

        198,74 kB, 1.225×641, 481 mal angesehen
      Dateien

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „NGE'o“ ()

      Ja , ich brauchte eine Vorgeschichte, die das Vorwort füllt.

      Zuerst programmierte ich es in XNA, bin damit fertig geworden, anschließend hab ich es versucht es in GDI+ zu rekonstruieren.

      Nur ist die CPU-Auslastung nicht zufriedenstellend.

      Die GameLoop:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Class GameLoop
      2. Public Property EnabledGameLoop As Boolean
      3. Public GameLoopTargets As New List(Of GameObjects)
      4. Private Form As Form
      5. Public GameTime_Interval As Long
      6. Public GameTime_Tick As Long
      7. Public GameTime As New Stopwatch
      8. Public FPS As Integer
      9. Public Sub Init(Form_ As Form)
      10. Form = Form_
      11. Main()
      12. End Sub
      13. Private Sub Main()
      14. GameTime.Start()
      15. Do While EnabledGameLoop
      16. GameTime_Tick = GameTime.ElapsedMilliseconds
      17. Application.DoEvents()
      18. Do While GameTime.ElapsedMilliseconds - GameTime_Tick < GameTime_Interval
      19. Form.Invalidate()
      20. Loop
      21. Loop
      22. End Sub
      23. Public Sub Render()
      24. For i = 0 To GameLoopTargets.Count - 1
      25. GameLoopTargets(i).Render()
      26. Next
      27. End Sub
      28. Public Sub Update()
      29. For i = 0 To GameLoopTargets.Count - 1
      30. GameLoopTargets(i).Update()
      31. Next
      32. End Sub
      33. End Class


      Nun, ist hier jenes, welches die Zufriedenheit stört, abgesehen von der CPU-Auslastung?
      Bitte um Kritik.
      Bei mir sind es sogar 45-50% mehr Auslastung (i5 2,2 2.Gen).
      Bei meinem eigenen "aktuellen" Spiel mit GDI+ ist das ganze auch nicht viel besser, hab dort eben so 30-35% mehr Auslastung.
      Das sollte man noch etwas reduzieren.

      (Habe es jeweils in einen eigenen Thread geworfen und lasse diesen mit sleep schlafen wenn das ganze zu schnell wird).
      naja, der Gameloop beschäftigt halt eine Cpu zu 100%. Bei 2 Kernels ist man also mit > 50% Prozessorlast unterwegs.
      Das kann man schon sehr verbessern, wenn man sich die Regeln von OwnerDrawing zu eigen macht, also dass nur das neu gezeichnet wird, was sich verändert.

      kann man aber auch lassen - WinForms ist halt eher was für Spiele, wo der Hintergrund stille steht - etwa Tetris, Minesweeper, PacMan, Snake, Pong.
      Es kommt darauf an, wie viele logische Kerne man hat. Ein Kern wird zu 100% ausgelastet, das teilt man dann durch die Anzahl und man erhält die Auslastung durch das Spiel, bei meinem i7 sinds z.B. 100% / 8 = 12,5 (wobei es etwas mehr ist, weil auch noch andere Kerne etwas hochgehen).

      Nachdem ich jetzt übrigens gefühlte 100 mal am ersten Tor gescheitert bin, geb ichs auf, das ist absolut nichts für mich. :D
      Dem Spiel fehlt noch ganz dringend ein Menü, das Fenster buggt sich bei mir unter die Taskleiste und Fullscreen wäre auch nicht schlecht.
      Es ist kein Showroom, Du kannst es nach Deinem Belieben ändern.

      @backtothetoast

      Nimm mal dies,

      VB.NET-Quellcode

      1. Public Sub setGravitation()
      2. If SwitchGravitation Then
      3. If Not Intersects(New RectangleF(FlappyBirdGDI.GameLoop.GameLoopTargets(0).Position.X, FlappyBirdGDI.GameLoop.GameLoopTargets(0).Position.Y, 30, 32)) Then
      4. PlayerY += 1.0F
      5. Else
      6. PlayerY = 0
      7. X = 500
      8. End If
      9. Else
      10. If MaxInt >= 12 Then
      11. MaxInt = 0
      12. SwitchGravitation = True
      13. ElseIf Intersects(New RectangleF(FlappyBirdGDI.GameLoop.GameLoopTargets(0).Position.X, FlappyBirdGDI.GameLoop.GameLoopTargets(0).Position.Y, 30, 32)) Then
      14. PlayerY = 0
      15. X = 500
      16. Else
      17. PlayerY -= 0.9F
      18. MaxInt += 1
      19. End If
      20. End If
      21. End Sub


      Kleiner Unterschied, ist aber besser, wie ich finde, hab das Level geschafft.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NGE'o“ ()

      [XNA]Überarbeitung in XNA

      Ich werde unteranderem auch eine XNA-Version
      hochladen.

      Dies wird einige Features mehr bieten
      (Rotations,Verfolgung des Spielers unteranderem über die Y-Achse...)


      Im Anhang schon mal die Projektmappe...

      Viel Spaß!
      Dateien
      • FlappyBird.rar

        (272,52 kB, 143 mal heruntergeladen, zuletzt: )
      So, nun ist Version 0.1 XNA Flappy Bird als Download verfügbar:FlappyBirdXNA.rar


      Und die verbesserte Fassung des FlappyBirdGDI's:
      Im Startpost


      An alle, die sich wegen des Levels beschweren:
      Die Map-Datei findet ihr im Content-Ordner.
      Dies ist eine .PNG-Datei und lässt sich komfortabel individualisieren!

      Im Kommenden, wird ein FlappyBird-spezifischer Random-Level implementiert,

      Quellcode

      1. LevelGenerator.cs
      .

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „NGE'o“ ()