Aktuelle Zeit: 21.08.2018 23:31

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 117 Beiträge ]  Gehe zu Seite 1, 2, 3, 4, 5 ... 12  Nächste
Autor Nachricht
 Betreff des Beitrags: Roguelike-Diary (WIP ...)
BeitragVerfasst: 06.03.2018 23:25 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Hallöchen,
Ich habe heute den ersten Schrit zu meinem großen PureBasic-Projekt getan ... wie einige vielleicht mitbekommen haben, hatte ich bereits in Blitzbasic begonnen, ein Roguelike-RPG-Adventure zu programmieren, bin auch recht weit gekommen, bevor ich mich verzettelt habe und der Umstieg auf Windows-10 mir den Spaß an der Sprache endgültig verhagelt hat (Bugs/Glitches/keine Aussicht auf Besserung da OpenSource und kein offizieller Support mehr). Allerdings bin ich recht stolz auf einen umfangreichen Zufalls-Dungeon-Creator, in den mindestens ein halbes Jahr Gehirnschmalz und Finetuning geflossen ist, und den ich jetzt demnächst nach Pure-Basic übersetzen werde.

Auf ein Neues!
Bin voll motiviert!

Ich habe mir vorgenommen, diesen Thread als eine Art Entwickler-Tagebuch zu führen, einerseits um mich selbst zu motiveren, andererseits auch um gelegentliches Feedback zu erhalten und Projekt-spezifische Fragen zu stellen. Ich versuche regelmäßig Updates zu posten, mal Code-Snippets, mal kleine Youtube-Demos, mal Bilder, mal Notizen zu Gameplay-Konzepten; wenn mal längere Zeit nix kommt, dann dürft ihr gerne Publisher spielen und auf die Füße treten. <) Ich hoffe das geht so in Ordnung?

Der erste Schrit ist getan, mein Prototyp-Spielplatz steht (mit weniger als 300 Zeilen Code):
Viewport, Keyboard-Input, scrollende Map, rudimentäre Kollision, Line-of-Sight mit dem Bresenham-Algorithmus. Maus-Steuerung ist geplant, wird zu einem späteren Zeitpunkt implementiert. Was ich aus meiner Erfahrung in Blitzbasic mitgenommen habe, ist, daß es eine schlechte Idee ist, sich zu früh mit grafischen Spielereien und Details aufzuhalten. Werde stattdessen möglichst rasch versuchen, das so gerne zitierte "Minimum Viable Product" auf die Beine zu stellen - das muß nicht schön aussehen, aber es ist das essentielle Fundament, auf dem Gameplay-Mechaniken, Content, etc. erst so richtig gedeihen können.

Bild

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 07.03.2018 15:57 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
Ich finde deine Idee gut.
Ich bin auf deine weiteren, zukünftigen Ergebnisse und Fortschritte sehr gespannt.

_________________
BildBildBildBildBild
Bild | EnableExplicit ist kostenlos und vermeidet Fehler | Gib Goto keine Chance | Schneller als die Telekom erlaubt | Avira? Nein Danke
WinAPI forever | Bei Problemen bitte Beispielcode posten | Mit Adblock werbefrei, schneller und sicherer surfen | brain.exe ist der beste Schutz | Userlibrary ohne Source = NoGo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 07.03.2018 18:56 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
Schönes Projekt :allright:
Viel Erfolg :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 07.03.2018 22:59 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Danke für die positiven Vibes. :)

Mouse-Input is now a thing ...
War fast erschrocken, wie problemlos ich das implementiert bekommen habe! Da muß doch irgendwo noch ein Bug sein, oder überflüssiger Code?
Nee, läuft wie geschmiert! <)
War außerdem meine erste positive Erfahrung mit Static-Variablen ... sowas Tolles habe ich mir in Blitzbasic öfters gewünscht! Richtig elegante Sache; bin begeistert!
Endlich kein endloses Durchschleifen von Hilfsvariablen mehr, bzw. wieder eine Global gespart, yay!

Und so funktionierts:
Wenn man auf ein freies Feld klickt, berechnet meine A*-Suchroutine einen Pfad zum Zielfeld und speichert die entsprechenden Nodes in einer LinkedList (aStarPath()). Das erste Element wird direkt aufgerufen (identisch mit dem Spielerfeld). Solange man jetzt die Maustaste gedrückt hält, wird nach einem kurzen Timer-Delay die nächste Node in der Link aufgerufen und die Spielerposition aktualisiert. Währenddessen bleibt die Maus für weiteren Input "gesperrt", da die Map mitscrollt (also den Spieler immer in der Mitte des Viewports hält) und ansonsten nach jedem Schritt ein neuer Pfad berechnet werden würde, was ja nicht der Sinn der Sache ist. Sobald die Maustaste losgelassen wird, bleibt der Spieler stehen, die Maus wird wieder freigegeben man kann ein neues Feld anklicken und dorthin gehen.

//EDIT:
Ich sollte vielleicht noch festlegen, daß man nicht auf verdeckte Felder im Fog of War klicken kann.

Code:
Procedure processInput()
   #centerCamera_LIMIT = 500
   Define leftClick = MouseButton(#PB_MouseButton_Left)
   Define rightClick = MouseButton(#PB_MouseButton_Right)
   Static holdLeft
   Static centerCamera_TIMER

   If holdLeft And Not leftClick ;sobald die Maustaste losgelassen wird, MouseInput wieder freigeben
      holdLeft = 0
   EndIf
   
   xMouse = limit((MouseX()/#tileSize)+(xViewCenter-#xMaxView),0,#xMax)
   yMouse = limit((MouseY()/#tileSize)+(yViewCenter-#yMaxView),0,#yMax)
   
   If leftClick And Not holdLeft
      holdLeft = 1 ;während die Maustaste gehalten wird, MouseInput sperren, damit Pfad nach dem ersten Schritt nicht erneut aktualisiert wird
      If worldMap(xMouse,yMouse) = 1 And bresenMap(xMouse,yMouse) > 0
         translateWorld() ;worldMap() in binaryMap() "übersetzen"
         If getPath(xPlayer,yPlayer,xMouse,yMouse,#xMax,#yMax) > 0
            FirstElement(aStarPath())
         EndIf
      EndIf
   EndIf

   If leftClick And holdLeft ;solange die Maustaste gedrückt bleibt, die nächste PathNode im gefundenen Weg aufrufen
      If NextElement(aStarPath()) <> #Null
         xPlayer + ((xPlayer-aStarPath()\x)*-1)
         yPlayer + ((yPlayer-aStarPath()\y)*-1)
         calculateLOS() ;Line-of-Sight aktualisieren   
         ProcedureReturn
      EndIf
   EndIf

   If xMouse = xPlayer And yMouse = yPlayer
      If centerCamera_TIMER = 0
         centerCamera_TIMER = ElapsedMilliseconds()
      EndIf
      If ElapsedMilliseconds() - centerCamera_TIMER > #centerCamera_LIMIT
         ;wenn Mauszeiger 0.5 Sekunden auf Spielerfeld ruht, Viewport zentrieren
         centerCamera_TIMER = 0
         xViewCenter = xPlayer
         yViewCenter = yPlayer
         calculateLOS()
         MouseLocate(#xRes/2,#yRes/2)
         ProcedureReturn
      EndIf
   Else
      centerCamera_TIMER = 0
   EndIf
      
   If Not (leftClick+rightClick)   ;Wenn Mauszeiger an den Rand bewegt wird, Ansicht aktualisieren
      If MouseX() = 0
         xViewCenter = xPlayer - (#xMaxView-2)
         calculateLOS()
         ProcedureReturn
      EndIf
      If MouseX() = #xRes-1
         xViewCenter = xPlayer + (#xMaxView-2)
         calculateLOS()
         ProcedureReturn
      EndIf
      If MouseY() = 0
         yViewCenter = yPlayer - (#yMaxView-2)
         calculateLOS()
         ProcedureReturn
      EndIf
      If MouseY() = #yRes-1
         yViewCenter = yPlayer + (#yMaxView-2)
         calculateLOS()
         ProcedureReturn
      EndIf
   EndIf
EndProcedure

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Zuletzt geändert von diceman am 08.03.2018 20:43, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 08.03.2018 13:28 
Offline

Registriert: 23.06.2013 06:26
Kleine Anmerkung zur Mouse-Library:
Clicks etc. funktionieren zwar ganz gut, aber bei zu schnellen Bewegungen haken MouseX und Konsorten gerne mal.
Wenn das Problem bei dir auftauchen sollte, schau dir mal WindowMouseX/Y (grad am Telefon, keine Ahnung ob korrekt) an.

_________________
Wer braucht schon Unicode? PB5.24LTS


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 08.03.2018 14:19 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Dankeschön für den Hinweis. :-)
Gut zu wissen, auch wenn ich glaube, daß das momentan nur sekundäre Relevanz für mich hat ... ich plane kein schnelles Reaktions-Spiel, sondern ein rundenbasiertes Roguelike, und bis jetzt funktioniert das super-fluffig; konnte auch den Code mit der Abfrage, welches Feld gerade geklickt wurde, noch wesentlich optimieren: ich muß gar nicht das komplette World-Array durchlaufen - wenn ich die aktuelle Mausposition durch #tileSize teile und mit den Parametern für Kamera-Position und viewPort-Ausdehnung verrechne, habe ich direkt die entsprechenden Feld-Koordinaten.
Und, wie gesagt, Probleme mit hängenden Mauskoordinaten habe ich momentan keine; ich hoffe, das bleibt so. :)

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 08.03.2018 20:10 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Demo-Video:
Roguelike Diaries 01: Viewport, Navigation, Line-of-Sight

Bin jetzt ganz zufrieden mit meinem Fundament, denn eine intuitive, reibungslose Steuerung ist das A und O:

• Linksklick auf den Boden bewegt den Spielercharakter zum Zielfeld, solange man die Maustaste gedrückt hält.
• Man kann die Ansicht anpassen, in dem man den Mauszeiger an den Bildschirmrand bewegt.
• Lässt man den Mauszeiger für 0.5 Sekunden auf den Spieler-Koordinaten "hängen", wird der Viewport automatisch zentriert.

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Zuletzt geändert von diceman am 08.03.2018 20:44, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 08.03.2018 20:14 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
Danke für das Video, sieht gut aus. :allright:

_________________
BildBildBildBildBild
Bild | EnableExplicit ist kostenlos und vermeidet Fehler | Gib Goto keine Chance | Schneller als die Telekom erlaubt | Avira? Nein Danke
WinAPI forever | Bei Problemen bitte Beispielcode posten | Mit Adblock werbefrei, schneller und sicherer surfen | brain.exe ist der beste Schutz | Userlibrary ohne Source = NoGo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 08.03.2018 23:28 
Offline
Benutzeravatar

Registriert: 06.07.2017 12:24
Fullscreen/TaskSwitch/FullScreen funktioniert jetzt auch. 8)
Das war etwas kompliziert, hab's auch nur dank einem Code-Snippet gelöst, welches ich mit der Google-Suche im englischen Forum gefunden habe.
Anscheinend muß man sich das StandBy-Fenster in der Taskleiste selbst kreieren ... :?
Kann mir jemand erklären, was genau hier callFunctionFast(*standBy) leistet? :)
Ohne funktioniert's nämlich auch ...

Code:
;Abfrage in der Hauptschleife:
[...]
If Not IsScreenActive()
   fullScreenResume()
EndIf
[...]

Procedure fullScreenResume(*standBy = 0)
   CloseScreen()
   screen = OpenWindow(#PB_Any,0,0,0,0,"Roguelike-Project",#PB_Window_BorderLess | #PB_Window_NoActivate)
   Repeat
      Delay(16)
      If *standBy
         callFunctionFast(*standBy)
      EndIf
   Until WindowEvent() = #PB_Event_ActivateWindow
   CloseWindow(screen)
   screen = createScreen(#xRes,#yRes,32,"Roguelike-Project")
EndProcedure

_________________
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Roguelike-Diary (WIP ...)
BeitragVerfasst: 09.03.2018 00:36 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
diceman hat geschrieben:
Code:
Procedure fullScreenResume(*standBy = 0)
   ...
   Repeat
      Delay(16)
      If *standBy
         callFunctionFast(*standBy)
      EndIf
   Until WindowEvent() = #PB_Event_ActivateWindow
   ...
EndProcedure
Kann mir jemand erklären, was genau hier callFunctionFast(*standBy) leistet? :)
Ohne funktioniert's nämlich auch ...
Der If-Block wird nicht ausgeführt, wenn du kein Parameter bei der Procedure angibst, daher kannst du den gesamten If-Block weglassen.
CallFunctionFast() erwartet als Parameter eine Adresse zu einer Procedure, die ausgeführt werden soll. Du könntest also so etwas machen:
Code:
Procedure StandbyCallback()
  ; Diese Procedure wird alle 16 Sekunden ausgeführt (siehe "Delay(16)" im obigem Code),
  ; solange du im Standby (nicht im FullScreen) bist
EndProcedure
...
fullScreenResume(@StandbyCallback())
...

_________________
Bild
Warum OpenSource eine Lizenz haben sollte
PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!
Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 117 Beiträge ]  Gehe zu Seite 1, 2, 3, 4, 5 ... 12  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye