RPG Demonstration

    • Beta

    Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

      RPG Demonstration

      Name des Programms:
      RPG Engine v0.001

      Beschreibung:
      Also, Hiermit will ich nur zeigen, wie man ein RPG basierend auf VB.NET und GDI realisieren kann. Ich habe den Code kommentiert - hoffentlich hilft das beim verstehen - und mir mühe gegeben eine halbwegs anständige form einzuhalten. Aber jetzt zu dem Programm: im moment kann es eigentlich recht wenig, eine beliebige map aus tiles auf 3 ebenen zeichnen und NPCs mittels Sprites animieren. Es können jede menge Einstellungen vorgenommen werden (FramesPerSecond, Betrachterposition, Zielauflösung (also wieviele Tiles von 50x50 Pixeln der Bildschirm fassen soll), diverse verstellmöglichkeiten der NPCs etc).

      Das Programm ist sofort lauffähig, eine Beispielmap wird automatisch generiert - zum demonstrieren eben^^
      zum steuern eines NPCs (ich weiß - nonPlayerCharakter = spieler ist fragwürdig aber egal) einfach die Pfeiltasten nutzen und an "auffälligen Punkten" nicht davor zurückschrecken die Leertaste zu betätigen. Man beachte, dass die Textbox auf der Form den fokus haben muss.. um eine zeitgemäße steuerung sollen sich andere kümmern. es ist auch zu empfehlen "schritt für schritt" zu gehen, also den finger nicht auf den tasten ausruhen.

      Ebenfalls ist der gesamte Programmcode enthalten. Wer verbesserungsmöglichkeiten hat kann diese ja posten. Auch habe ich nichts gegen, wenn jemand an dem bestehenden code weiterarbeitet und ihn für sein spiel nutzt.

      Screenshot:


      Verwendete Programmiersprache:
      Visual Basic .NET (IDE: VB 2008 Express)

      Systemanforderungen:
      .NET Framework 2.0

      Download:
      Programm + Quellcode 08.07.11(145 KB)
      Programm + Quellcode 09.07.11(145 KB)


      Lizenz/Weitergabe:
      Freeware; OpenSource

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

      schreibe den folgenden sub in meinem beispiel so um:

      VB.NET-Quellcode

      1. Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
      2. With Engine.GameFigureList(0)
      3. If e.KeyCode = Keys.Left Then .Move(Engine, RPG_System.eMoveDirection.left, True)
      4. If e.KeyCode = Keys.Right Then .Move(Engine, RPG_System.eMoveDirection.right, True)
      5. If e.KeyCode = Keys.Up Then .Move(Engine, RPG_System.eMoveDirection.up, True)
      6. If e.KeyCode = Keys.Down Then .Move(Engine, RPG_System.eMoveDirection.down, True)
      7. If e.KeyCode = Keys.Space Then
      8. Interaktion()
      9. End If
      10. Engine.CamLoc = Engine.GameFigureList(0).Location'Das ist eigentlich schon alles was neu dazukommt...
      11. End With
      12. End Sub



      Ein problem, dass du jetzt lösen musst ist, wie schaffe ich es, dass es nicht so "ruckelig" aussieht. sie dir mal die klasse der Gamefigures an, dort habe ich etwas ähnliches realisiert. kann vllt hilfreich sein

      lg
      Hätte noch einen Vorschlag:

      Man ändert die MsgBoxen in z.B. eine neue TextBox und die nennt man bsp. weise txtDialog

      Dann ändert man überall wo die MsgBoxen waren (außer die Fehler nur NPCs etc ;) ) in txtDialog.Text um :D

      Danach noch einen Timer, der bei jedem Dialog gestartet wird zum Beispiel mit Intervall 6000 (á 6 Sekunden) und
      lässt die TextBox wieder leeren mit txtDialog.Text = ""


      Noch was:

      Die TextBox ReadOnly = True machen und über die andere (die fürs laufen benötigt wird) ziehen, dann wird nicht mehr die leere TextBox fürs laufen angezeigt ^^
      @seppi123
      also im "richtigen" spiel würde ich ein eigenes menü programmieren, dass dialoge unterstützt, verschiedene antworten etc. gerendert werden kann dieses einfach über die ganze szene. die engine ist ja bei weitem nicht fertig und kann nach belieben ausgebessert werden.

      hier ein kleiner patch der den fehler behebt wenn man an den rand der map geht:

      Spoiler anzeigen



      Vllt fallen euch ja noch stellen auf, wo eine solche if-bedingung erforderlich ist

      VB.NET-Quellcode

      1. Public Function GetTileIndex(ByVal Loc As Point, ByVal Ebene As eEbene) As Integer
      2. Dim TileIndex As Integer = -1
      3. If Loc.X >= 0 AndAlso Loc.Y >= 0 AndAlso Loc.X <= MapSize.X AndAlso Loc.Y <= MapSize.Y Then
      4. TileIndex = Map(Loc.X, Loc.Y).Ebenen(Ebene)
      5. End If
      6. Return TileIndex
      7. End Function






      Kann das sein, dass jetzt "Ungültiger Parameter" kommt ?(

      // Edit ist was anderes nicht dein Code ^^ habe schei** gebaut ;)


      // Schon wieder Edit

      Kann das sein, dass die Map schonmal nicht 5.000 sein darf?
      Weil da is dann die Fehlermeldung "Ungültiger Parameter" xD
      Habe es jetzt auf 500 gemacht.
      Naja dann werde ich mal ne neue Map anzeigbar machen :P

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

      @seppi
      also das beim betreten des randgebiets eine neue map geladen wird ist nicht so einfach...
      auch größen von 5000x5000 sollten kein problem sein. (hab ich aber noch nicht versucht^^)

      um dein problem zu lösen hätte ich folgenden ansatz:
      - du baust eine "map speichern/laden" funktion (die map ist ja in dem array Map(,) as Tile gespeichert, die NPCs in der GamefigureList)
      - du programmierst einen NPC, der wenn du ihn berührst, betrittst, was auch immer dich auf eine andere map "teleportiert"
      das teleportieren würde dann bedeutet, dass eine neue map geladen wird und du dort an einer bestimmten position startest (camlocation, spielerposition setzten, fertig)



      so, das ist aber noch nicht genug, ich habe eine kleinen verbesserungsansatz: ein menü (siehe downloads im 1. post)^^ die handhabungist etwas komplizierter...




      zu verwenden im code ist das ganze so:

      als einfache message um texte wiederzugeben

      VB.NET-Quellcode

      1. With Engine.Menü
      2. .Image = GesichtDesSprechenden 'Bitmap, 150x150 pixel
      3. .Message = "..die tür ist verschlossen"
      4. .MenüTyp = RPG_System.eMenüTyp.Message
      5. .Show()
      6. End With


      oder als dialog mit Itemauswahl

      VB.NET-Quellcode

      1. With Engine.Menü
      2. .Image = GesichtDesSprechenden 'Bitmap, 150x150 pixel
      3. .Message = "Wähle ein Item..."
      4. .Items(0) = "Item 1"
      5. .Items(1) = "Item 2"
      6. .Items(2) = "Item 3" ' "" wenn das item nicht verfügbar sein soll!
      7. .MenüTyp = RPG_System.eMenüTyp.Dialog
      8. .SelectedItem = 0
      9. .Show()
      10. End With



      lg
      Danke schonmal für das Menü - Bist echt Klasse :thumbup:

      Warum bin ich nicht gleich drauf gekommen mit der Map anstatt einen neuen Sub zu erstellen der dann iwie nur noch die Tür als Objekt anzeigt (warum auch immer) und das andere bis auf dem Player verschlingt ^^

      // Edit

      Ich mach es mit einem Teleporter ;) Den Randbereich mach ich wie z.B. den Stein nur als Wald oder Zaun oder Fluss ^^ dann kann man nicht mehr da ins weite "Nichts" laufen xD

      Naja jetzt schaue ich mir deinen Code erstmal genau an um zu verstehen was da abgeht (gut kommentiert) :)

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

      mach das, da gibts denke ich besonders viele stellen die ausgebessert oder komplett ersetzt werden müssen... ich bin da nich sooo zufrieden.
      es ist verdammt viel friemelarbeit einen spielmechanismus einzubauen. im moment "hängt" eigentlich alles an der grafik, der rest wird so irgendwie dazugebastelt. bei größeren projekten wird das nicht gut ausgehen..

      edit:

      Ich mach es mit einem Teleporter ;) Den Randbereich mach ich wie z.B. den Stein nur als Wald oder Zaun oder Fluss ^^ dann kann man nicht mehr da ins weite "Nichts" laufen xD


      würde ich nciht so machen. Der Stein ist ja ein NPC, das heißt du kannst mit ihm interagieren. Sinnvoller wäre es hier so vorzugehen:
      du lädst ja dein tileset (das ding mit allen grafiken). Außer der grafik kannst du für jedes Tile auch noch die Kollisionseigenschaften festlegen - für jede ebene!. Ein Baum z.B. ist über die ebenen Boden und Augenhöhe nicht betretbar, als z.B. vogel aber sehr wohl überfliegbar wenn er sich auf der ebene Himmel befindet. sieh dir mal die klasse TileGrafik an.
      weiterer vorteil ist, dass die verwendung von Tiles als Blockade (einfach alle ebene lösen kollision aus!) freisst keine weiteren Rechen-ressourcen da sie sowieso geprüft werden. ein NPC hingegen kostet immer mehr... je mehr du von ihnen verwendest, desto mehr rechenarbeit fällt an

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

      Was man hier draus machen könnte wäre eine Vb-Paradise RPG Engine.
      Jeder der eine Klasse hinzufügt, läd die neue Projektmappe hoch und setzt ein Screenshot mit der neuen "Funktion" drunter.

      Bin zwar ehr skeptisch ob es klappt, aber vielleicht steht am ende eine chaotisch-umfangreiche RPG Engine im Raum.

      Eistee schrieb:

      Was man hier draus machen könnte wäre eine Vb-Paradise RPG Engine.
      Jeder der eine Klasse hinzufügt, läd die neue Projektmappe hoch und setzt ein Screenshot mit der neuen "Funktion" drunter.

      Bin zwar ehr skeptisch ob es klappt, aber vielleicht steht am ende eine chaotisch-umfangreiche RPG Engine im Raum.

      Wär cool, aber endet dann wahrscheinlich wie andere Community Projekte auch...
      Außerdem fände ich dann ein dropbox Ordner besser...

      Ich wäre auf jeden Fall dabei...
      Am besten wäre es dann einfach los zu legen.
      Ohne das jetzt jeder erklärt, ob er mitmacht oder nicht.

      Wenn man mitmachen möchte, läd mann sich den Ordner und fängt an.

      Sobald man etwas hinzugefügt hat, läd man alles Hoch und stellt die neue Komponente vor.
      (Kleine Erklärung was welcher Code macht, Optional mit Screenshot).
      Planung ist ne wichtige Komponente, was Programmieren angeht. "Einfach draus los" wird das nichts, vor allem nicht bei einem Communityprojekt.

      MfG
      Also bis jetzt ging eig. jedes Communityprojekt welches geplant wurde den Bach herrunter.
      (Ok die XP Sidebar hat es fast geschafft).

      Was sollte mann da genau Planen?

      Eine fängt an und baut die erste Funktion einer RPG Engine.
      |
      V
      Der Nächste: --> Download --> Sieht sich den Code an --> Fügt eine neue (RPG Engine) Komponente hinzu. --> Upload.
      |
      V
      Der Nächste: --> Download --> Sieht sich den Code an --> Fügt eine neue (RPG Engine) Komponente hinzu. --> Upload.
      |
      V
      Der Nächste: --> Download --> Sieht sich den Code an --> Fügt eine neue (RPG Engine) Komponente hinzu. --> Upload.
      |
      V ....

      Zudem halt immer noch die Erklärung des neuen Codes zum Upload Posten.
      Mit Planung wird das nix da wenn gearbeitet wird, das ganze unregelmäßig ist.