Showroom - Aktuelle Arbeiten und Projekte

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Benutzeravatar
Krishty
Establishment
Beiträge: 8227
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Krishty »

Die Menüs sind super!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von xq »

Schrompf hat geschrieben: 25.11.2020, 08:09 Sieht schon sehr rund aus. Menüs und Transitionen und Rumlaufen... feine Sache!
Krishty hat geschrieben: 25.11.2020, 20:29 Die Menüs sind super!
Danke! Solche Details in Menüs wie die Transitions und kleinen Animationen sind wichtig und im aktuellen Stand der Entwicklung "nicht notwendig", aber ein guter Benchmark, um die Software-Architektur zu testen. Zudem ist der erste Eindruck halt auch 100 mal besser mit schön animierten Menüs statt einfach nur grauen Buttons und macht beim Entwickeln auch gute Laune.

Errungenschaft des Abends: Ich habe das Windows-Backend für ZWL vervollständigt und damit läuft das ganze Dinge jetzt auch auf Windows \o/

Klar, GDI ist nicht die modernste Tech, aber dafür läuft das auch garantiert überall, wahrscheinlich sogar noch auf Win9x
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Schrompf »

screenshot0006.png
Sieht aus wie immer, hm? Ist ein klein bisschen langsamer als der ursprüngliche Point Cloud Renderer, den ich im Jahr 2018 für ne ZfxAction gebastelt hatte. Aber dafür ist er jetzt auf 12+12 Hardwarethreads parallelisiert :-( Hat sich echt gelohnt, die Arbeit.

Die Parallelisierung war aber auch etwas ungeschickt angelegt - geht auf allen Cores jeweils alle Punkte durch, um für ein Bildsegment die betreffenden Punkte rauszusuchen. Hm. Das geht besser. Irgendwie nicht auf dem Screenshot gelandet, aber im Bild sichtbar: 40 bis 60fps, so um die 400k Punkte.

Das größte Problem ist laut Profiler tatsächlich das xfach parallele Durchackern der projezierten Punktewolken, um sie den Bildschirmsegmenten zuzuteilen. Was man hier jetzt bräuchte, ist eine grobe Vor-Aussortierung anhand irgendwelcher Beschleunigungsstrukturen. Und da ich am Ende eh durch ne Voxel-Welt raycasten will, habe ich also nicht angefangen, eine Bounding Volume Hierarchy einzuziehen, sondern mir stattdessen die Voxelstrukturen aus meinem alten VoxelSurvival-Spiel rüberkopiert. Damit kann ich auch gleich die alten Voxelwelten laden, die der Designer damals mühsam im InGame-Editor zusammengebaut hatte. Mit denen habe ich früher schon viele Screenshots gemacht, die sehen nicht schlecht aus.

Nächster Schritt also: Punktwolken aus Sparse Voxel Tree erzeugen. Dazu muss ich dem Renderer erstmal "bunt" beibringen - wegen vieler überlappender Punkte mit winzigen Gewichtsanteilen rechnet der nämlich bisher 24bit pro Kanal monochrom.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2348
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Jonathan »

Schrompf hat geschrieben: 07.12.2020, 22:30 Sieht aus wie immer, hm? Ist ein klein bisschen langsamer als der ursprüngliche Point Cloud Renderer, den ich im Jahr 2018 für ne ZfxAction gebastelt hatte. Aber dafür ist er jetzt auf 12+12 Hardwarethreads parallelisiert :-( Hat sich echt gelohnt, die Arbeit.
Hm, das klingt erstmal ein wenig frustrierend. Ist es denn immer langsamer? Skaliert es irgendwie anders als die unparallele Version? Vielleicht laufen jetzt ja zumindest sehr große Szenen flüssiger?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Schrompf »

Jonathan hat geschrieben: 08.12.2020, 11:38 Hm, das klingt erstmal ein wenig frustrierend. Ist es denn immer langsamer? Skaliert es irgendwie anders als die unparallele Version? Vielleicht laufen jetzt ja zumindest sehr große Szenen flüssiger?
Ich spekuliere hier bloß, aber:

vorher war es SingleThreaded, der ist genau einmal über die komplette Punktwolke drüber gegangen und hat die Punkte rausgesplattet. Das hab ich leider nie profiled, aber ich bin halbwegs sicher, dass der Großteil der Rechenzeit für das dutzendfache Überpinseln von Pixel drauf ging. War halt 2018, ist schon ein bisschen her.

Dann habe ich es parallelisiert, indem ich den Bildschirm in dutzende 40x32-große Kacheln unterteilt habe. Für jedes Bildsegment bin ich dann über die komplette Punktewolke drüber und habe nur die Punkte gesplattet, die den Bildbereich berühren. Das war trotz zwölffach paralleler Zeichnerei deutlich langsamer als die SingleThreaded-Version, weil jetzt das dutzendfache Durchackern der Punktwolken-Daten der Flaschenhals war.

Fast Forward to 2020. Ich hatte das noch diffus in Erinnerung und habe das "gelöst", indem ich noch vor der Tiefensortierung erstmal das Bildsegment sortiert habe. Weil es so viele klein- und großteilige Punktewolken gibt, schmeiße ich die relativ früh in einen riesigen Buffer und sortiere dann in-place. Jedes Bildsegment hat dann einen Range im Gesamt-Buffer, Punkte müssen dafür bisweilen mehrfach vorkommen. Dafür kann das Ausrendern dann schön autark passieren. Das hat ein bisschen geholfen - 20fps zu 50fps, so grob über den Daumen. Der Flaschenhals war aber immer noch das Zuteilen der Punkte zu den Bildsegmenten.

Wenn ich das jetzt richtig lösen wollen würde, würde ich pro Thread nur einen Teil der Punktewolke durchackern, dafür aber Punkt gleich in die Buffer aller Bildsegmente schreiben. Damit man da nicht syncen muss, kriegt jeder Thread seinen eigenen Satz an Ziel-Buffern, und am Ende werden die gemergt und dann erst nach Tiefe sortiert. Das würde wahrscheinlich drastisch was bringen... ich schätze Faktor 5. Aber es ist jetzt ne Speziallösung für Freiform-Punktewolken geworden, und eigentlich will ich doch gar keine Freiform-Punktewolken mehr zeichnen, sondern grid-basierte Punktewolken aus nem Sparse Voxel Tree. Und der Ansatz dafür würde sich halt entlang der Hierarchie des SVOs entlang hangeln und hätte damit einen komplett anderen Ansatz, um fix einen Großteil der Punkte bereits bei der Bildsegment-Zuordnung auszuschließen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Um auch mal wieder was zu zeigen: Ein kleiner Ausflug in Richtung Retrostyle.
Statt eines Textadventures im Stil "Nimm Schlüssel, Gehe Tür" kann man ja auch mal was im Stil "run program, analyze data" machen, mit verschiedenen grafischen Elementen/Aufgaben die dann zum Stil passen. Text im Screenshot war nur zum Testen des Umbruchs, wäre jetzt nicht spielrelevant ;)

Scheint auf den ersten Blick nicht viel Neues zu sein, aber technisch konnte ich einiges seit meinen bisherigen Prototypen weiterentwickeln und dazulernen. Neu u.a.:
- Textrendering mit einfachem Input, Typewriter-Effekt, dynamischem Zeilenumbruch u.a., natürlich im bisherigen adaptiven UI.
- Midi-Schnittstelle ziemlich Low-Level per Bytecommands über winmm.dll ansteuern. Kleiner Sequenzer zum Komponieren ist wieder im Bau, im Video gibts aber nur Typewriter- und Einsammel-Töne (seid froh ;))
- Erster Ansatz einer State-Machine für übergreifende Spiellogik und richtige Timing-Abstimmung der ganzen Komponenten.
- Kollision ist nun für Kugeln mit (nahezu) beliebiger Dreieckssuppe möglich. Der Tile-Level nur deshalb, weil ich ihn schnell in beliebiger Größe prozedural erstellen kann; die Kollision ist nicht an dieses Grid oder rechte Winkel gebunden.
- Nicht sichtbar: Entity-Component-System (ECS). Nur noch kein gutes Pooling eingebaut.
- Kollisionsabfrage verträgt sich nun endlich einigermaßen flexibel mit ECS-Eigenschaften, kann Events erzeugen (enter/leave) und geht bei Bedarf den Umweg über eine Custom-Logikverarbeitung, wo z.B. auch die Response beeinflusst werden kann.
- Prozedurale Ressourcendeko: Die ganzen Plättchen und Stäbchen auf dem Boden werden on-the-fly reproduzierbar generiert und gerendert. Können, müssen aber nicht ECS-Eigenschaften bekommen, in die Kollision mit eingehen etc. Für die Stäbchen sieht man im Video beispielhaft "thingie" im rechten Fenster bei Berührung, Plättchen dagegen sind nur grafische Deko. Das System ist damit neben Deko auch für Ressourcen geeignet, diese wird man noch einsammeln können und wächst dann heimlich nach, wenn der Spieler wieder weiter weg ist und eine bestimmte Zeit vergeht.

Ob ich dazu ernsthafte Projektabsichten hege oder obs nur beim Rumspielen bleibt, sei dahingestellt.
Viele Einzelheiten sind noch relativ experimentell in den Code gehackt, da wäre jetzt Aufräumen der nächste sinnvolle Punkt.

Bild

Benutzeravatar
Krishty
Establishment
Beiträge: 8227
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Krishty »

Cool! Ich finde den Text allerdings weitaus retro-mäßiger als die 3D-Grafik.

IMO dürften im Wireframe keine Pixel sichtbar sein, weil das zu der Zeit Vektor- statt Pixelgrafik war. Also: Linien viel dicker machen (etwa so dick wie den Stroke des Textes) und mit Gauss-Querschnitt versehen, so dass keine Pixel mehr erkennbar sind!

Schau mal in die Gallerie hier ganz unten: https://www.hp9845.net/9845/software/sc ... /wargames/
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von xq »

Krishty hat geschrieben: 13.12.2020, 23:15 Cool! Ich finde den Text allerdings weitaus retro-mäßiger als die 3D-Grafik.
Die 3D-Grafik ist durchaus angemessen, die Frage ist nur, wie viel Budget man hatte. Wenn man richtig viel Kohle hatte, konnte man sich durchaus auch ein grafisches Terminal von Tektronix kaufen, mit gigantischen 4096x3078 Bildpunkten:



Mehr realistische Fotos und Infos findet man auch hier:
http://computermuseum.informatik.uni-st ... index.html
http://computermuseum.informatik.uni-st ... k_art.html
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Schon klar, dass ich jetzt nicht wegen dem Renderer gepostet habe, oder? ;)
Aber ja, um eine Vektor-Röhre grafisch zu simulieren, würde ich da noch einiges tun. Glow-Effekte habe ich schon öfter gemacht, zwar mehr in PSD als in Shadern, aber prinzipiell gleicher Vorgang. SW rendern, Gauss, mit Original adden, Tonemap. Signalverzerrungen. Oder für ein altes Pixeldisplay noch Scanlines. Vignette, Ghosting, etc. Hab das z.B. schonmal für Stills in ner ZFX-Action eingesetzt (WDF).
Aktuell möchte ich mich noch nicht in Pixelkosmetik verzetteln, da mir selbst noch nicht ganz klar ist was genau das Ziel sein wird.
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Ach was solls. Jetzt habt ihr mir die Made in den Kopf gesetzt. Wenigstens ne simple Lösung bis auf Weiteres:
Bild
Benutzeravatar
Krishty
Establishment
Beiträge: 8227
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Krishty »

joeydee hat geschrieben: 14.12.2020, 10:02Schon klar, dass ich jetzt nicht wegen dem Renderer gepostet habe, oder? ;)
joeydee hat geschrieben: 15.12.2020, 11:08Ach was solls. Jetzt habt ihr mir die Made in den Kopf gesetzt.
:D Ich konnte wieder meine Klappe nicht halten. Sieht aber sweeeeeeeet aus. Ich könnte dran arbeiten!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

joeydee hat geschrieben: 08.05.2017, 17:41 Das ist auch, worauf ich außerdem hinauswill: dynamisch Sequenzen austauschen/zusammensetzen können bei Änderung der Stimmung. Irgendwann ;)
Puh, 2017, schon so lange her mein erstes Sequenzer-Projekt (eigentlich nur eine Gamejingle-Komponierhilfe) :D Aber das damals angesprochene "irgendwann" ist genau jetzt. Das Prinzip Harmonielehre als Schablone habe ich kürzlich für Midi ausgebaut. Diesmal ein In-Code-Sequencer, der Midi-Commands im richtigen Timing ausspuckt. Code sieht inzwischen anders aus, aber so ähnlich:
Bild

Das Prinzip: Noten werden nicht absolut angegeben, sondern relativ zu einer Akkordvorgabe zum Abspielzeitpunkt. Diese Vorgabe (Tabline) gilt dann für alle aktuellen Kanäle. Wird sie ausgetauscht, richten sich auch die Keys danach. Werden Keys ausgetauscht, passen sie sich der Tabline an.
Damit kann man nun direkt das laufende Stück gezielt ändern, auch innerhalb von Takten, nicht erst wenn ein Loop komplett fertig ist. Man kann manche Instrumente aus dem nächsten Part vorzeitig einsetzten und noch 1,2 Takte bei der alten Melodie "mitspielen" lassen, bevor alles in die neue Melodie übergeht. Oder umgekehrt.
Damit lassen sich nahtlose Übergänge in untermalender Musik dynamisch realisieren. Eben die Ingame-Mood-Wechsel, von denen ich vor >3 Jahren geträumt habe.
Wird man auch fertige Midi-Stücke laden und überblenden können? Nein. Wie gesagt: Noten werden hierzu nicht absolut angegeben. Man muss schon gezielt dafür komponieren, und das ist auch genau das was ich haben wollte.
Es ist zwar noch viel zu tun, auszubauen und Code besser zu organisieren. Aber Proof-of-Concept ist für mich hiermit erfolgreich :)

Ich habe mal ne kleine exe angehängt mit einem experimentellen Stück und 4 umschaltbaren "Moods". C#, Windows. Weiß nicht ob das direkt überall läuft, habe mit C#-Distribution noch keine Erfahrung. Darf ich winmm.dll als Standard vorausetzen? Findet mein Programm die automatisch? Oder müsste ich die mit in die zip packen?
(Klingt noch alles gleich hart, da ich mit den ganzen Midi-Commands erst experimentiere, bisher nur noteOn, noteOff und instrument)
Dateianhänge
mididemo.zip
(6.68 KiB) 97-mal heruntergeladen
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Spiele Programmierer »

Hört sich doch schon ganz nett an. :)
Die Übergänge dürften für meinen Geschmack aber sogar noch etwas ausgedehnt werden.

Sowas ähnliches kenne ich vor allem von einem alten PowerPoint-Addin: https://cmpct.info/~calvin/Articles/Pow ... oundtracks.
Das ist glaub ich relativ nahe daran, was dir vorschwebt. Dabei gab es auch dynamische und relativ lang andauernde Übergänge.

winmm.dll solltest du übrigens eher nicht mitliefern. Das ist eine Standardkomponente von Windows seit Windows 95. Es ist also eher unwahrscheinlich, dass du die Bibliothek nicht vorfindest. Im Gegenteil: Was die DLL macht, könnte am Ende sogar zwischen Betriebssystemen unterschiedlich sein, sodass die von dir ausgewählte Version der Datei nicht überall funktioniert.
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Danke für die Erklärung mit der dll, dachte ich mir fast, in diesem Fall.
Was die Übergänge angeht: gerade wenn auch schnelle Übergänge möglich sind, hat ein System seine Stärken gerade für Games, wie ich finde. Schnell das Thema wechseln bei unerwarteten Ereignissen, solche Switches kennt man z.B. auch vom Stummfilm.
Übergänge kann man grundsätzlich auch anders lösen, z.B. mehrere Alternativspuren, die immer hintereinanderpassen und an gleichen Zeitpunkten umgeblendet werden. Das passt dann auch immer. Geht dann auch mit wav, es gibt ja speziell CDs mit solchen Spuren.
Ich fand das aber mal faszinierend, die einzelnen Spuren sich selbst anpassen zu lassen nach Vorgaben, es werden zwischenzeitlch Noten gespielt, die man nie geschrieben hat. Der Mathematiker in mir ...
Ganz unabhängig davon, die eigentliche Stärke für mich ist aber die Komponierhilfe als Nicht-Musiker. Sprich, ich persönlich könnte praktisch nicht auf handelsüblichen Sequenzern komponieren, bzw. nur mit viel Zeit, Geduld und Abzählen. So kann ich jetzt direkt beim Coden damit experimentieren und umbauen und muss nicht etliche Ressourcen neu anpassen wenn ich Melodien ändere, für meine Zwecke reichts. Ohne besonderes Projekt in Entwicklung würde sich die Beauftragung eines echten Musikers für mich nicht lohnen.
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Ein 3D Retro Maze Game in süßen 250 Codezeilen (HTML-Canvas und JavaScript). Just for Fun gestern zusammengefrickelt.
Es können prinzipiell Dungeons generiert werden, die nicht lösbar sind. Mit x kann man cheaten. Die ersten 30 oder so müssten aber lösbar sein.
Sowas hätte ich mal zu C64-Zeiten können müssen, da konnte man mit sowas Geld verdienen ... ^^

Glaube nicht dass der Link überall direkt geht, da ich nichts für https eingerichtet habe. Hier jedenfalls der Quellcode:

Code: Alles auswählen

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>retro 3D maze game</title>
</head>
<body style="background-color:#000800;">
    <div align="center"><canvas id="img" width="1024" height="768"></canvas></div>
    <script>

        //simple retro 3D maze game, joeydee 2020

        var c=document.getElementById("img");
        var inf=document.getElementById("info");
        var ctx=c.getContext("2d");
        var cx=c.width*0.5;
        var cy=c.height*0.5;
        var scale=Math.min(cx,cy);
        var maze="";
        var width=0;
        var px=0;
        var py=0;
        var dir=0;
        var dlt=[-1,0,0,-1,1,0,0,1];
        var dfd=[0,-1,1,0,0,1,-1,0];
        var drt=[1,0,0,1,-1,0,0,-1];
        var dirs=["north","east","south","west"];
        var numCoins=0;
        var coins=0;
        var findExit=false;
        var newMaze=true;
        var dungeonNr=0;
        var initialSeed=1;
        var seed=1;
        var name="";
        var myAlert="";

        var names={};
        names["$0"] = ["$2$2, the $1 $3 of $4", "the $1 $3 of $2$2$2\n($6 $5)", "$2$2$9$2$7, $3 of $2$2", "$1 $8 $2$2-$2 $3", "$2$2$2 $3\n(home of these $1 $5)"];
        names["$1"] = "old,spooky,mindgrabbing,dark,wandering,neverending,crying,hollow,wet,scary,pink,hairy,crusty,dangerous,deadly,egypt,forgotten,derelict,buried,lost,undead,endless,slimy".split(",");
        names["$2"] = "o',$2ke,ta,ro,ba,ko,no,pan,hel,bar,kof,dil,men,sor,fat$2,gol,gos,wee,had,mor,fur,kos,lor,fee,ton,dra,mork,nask,prom".split(",");
        names["$3"] = "dungeon,maze,tunnels,rooms,caves,graves,tombs,catacombs,basement,mines,nexus,nemesis,ruins".split(",");
        names["$4"] = "darkness,sorrow,howling,doom,apocalypse,horror,perdition,infinity,fear".split(",");
        names["$5"] = "harmless ghosts,werewolf drawings,hallucinations,grapping hands,old indian spirits,restless spiders,speaking walls,irrational deep traps,masked mummies,black cats,chinese ghosts,headless warriors,tame scorpions,insane souls".split(",");
        names["$6"] = "don't be scared of,beware of,avoid,run away from,hide in case of,good luck with,there might be".split(",");
        names["$7"] = "berg,bach, valley,burgen, castle, creek".split(",");
        names["$8"] = "upper,lower,st.,great,ol'".split(",");
        names["$9"] = "-$2,".split(",");

        document.addEventListener("keydown",kdown);

        var fontSize=16;
        ctx.font=fontSize+"px Courier";

        randomMaze();
        redraw();

        function rnd(id){
            id = (id * id * id * 9301 + 49297) % 233280;
            return Math.abs(id / 233280);
        }

        function randomMaze(){
            dungeonNr++;
            seed=rnd(dungeonNr*4564689+129)*463278+623;
            initialSeed=rnd(seed*452356+23452)*5349+124;
            if(dungeonNr==18||dungeonNr==25)seed+=5223;
            maze="";
            width=6;
            numCoins=coins=0;
            for(var y=0;y<6;y++){
                var a="";
                var b="";
                for(var x=0;x<width/2;x++){
                    var r=rnd(seed++);
                    if(r<0.2){
                        a+="# ";
                        b+="# ";
                    }
                    else if(r<0.4){
                        a+="##";
                        b+="  ";
                    }
                    else if(r<0.8){
                        a+="# ";
                        b+="  ";
                    }
                    else {
                        a+="#C";
                        b+="  ";
                        numCoins++;
                    }
                }
                maze+=a+b;
            }
            maze+="#X";
            px=width;
            py=1;
            dir=3;
            findExit=false;
            newMaze=false;
            name=mazeName("$0",initialSeed);
            myAlert=name+"\n\n"+"you are trapped in this dark dungeon!\nfind all magic coins and then the exit (X)\n\nuse cursor keys to navigate\npress any key to start";
        }

        function mazeName(txt, mazeSeed){
            var res=txt;
            for(var s in names){
                var s2=s;
                var arr=res.split(s2);
                res=arr[0];
                for(var i=1;i<arr.length;i++){
                    mazeSeed=rnd(mazeSeed*123456);
                    var id=Math.floor(mazeSeed*names[s2].length);
                    res+=mazeName(names[s2][id]+arr[i],mazeSeed++);
                }
            }
            return res;
        }

        function kdown(event){
            if(event.key=="x")newMaze=true;
            if(newMaze){
                randomMaze();
                redraw();
                return;
            }
            if(event.key=="ArrowUp") goto(px+dfd[dir*2], py+dfd[dir*2+1]);
            if(event.key=="ArrowDown") goto(px-dfd[dir*2], py-dfd[dir*2+1]);
            if(event.key=="ArrowRight")dir+=1;
            if(event.key=="ArrowLeft")dir+=3;
            dir%=4;
            redraw();
        }

        function goto(nx,ny){
            var t=getTile(nx,ny);
            if(t!="#"){
                px=nx;
                py=ny;
                if(t=="C"){
                    setTile(px,py,".");
                    coins++;
                    myAlert="you found a magic coin!";
                }
                if(t=="X"){
                    if(findExit){
                        myAlert="congrats!\nyou escaped "+name.split("\n")[0]+".\npress any key to fall into another dungeon.";
                        newMaze=true;
                    }
                    else myAlert="find all magic coins first.\n"+(numCoins-coins)+" magic coin(s) remaining.";
                }       
            }            
        }

        function getTile(tx,ty){
            if(tx<0 || tx>=width)return "#";
            var id=ty*width+tx;
            if(ty<0 || id>=maze.length)return "#";
            return maze.substr(id,1);
        }

        function setTile(tx,ty,char){
            if(tx<0 || tx>=width)return;
            var id=ty*width+tx;
            if(ty<0 || id>maze.length)return;
            maze=maze.substr(0,id)+char+maze.substr(id+1);
        }

        function draw(x,y,zoom){
            lt=getTile(x+dlt[dir*2],y+dlt[dir*2+1]);
            fd=getTile(x+dfd[dir*2],y+dfd[dir*2+1]);
            rt=getTile(x+drt[dir*2],y+drt[dir*2+1]);
            drawLayer(zoom,lt!="#",rt!="#");
            if(fd=="C")drawCircle(0,zoom*scale/3,zoom*0.1);
            if(fd=="X"){
                var a=zoom*scale*0.5;
                drawLine(-a,a,a*0.5,a*0.5);
                drawLine(a,a,-a*0.5,a*0.5);
            }
            if(fd!="#" && zoom>0.01)draw(x+dfd[dir*2],y+dfd[dir*2+1],zoom*0.5);
            ctx.fillText("dungeon #"+dungeonNr+" - "+name,10,1*fontSize*1.2);
            var cns="magic coins: "+coins+"/"+numCoins+(coins==numCoins?" find exit (X)!":"");
            ctx.fillText(cns+" - "+"compass: "+dirs[dir],10,2*fontSize*1.2);
            if(coins==numCoins && !findExit){
                myAlert="you found all magic coins!\nnow find the exit (X)";
                findExit=true;
            } 
        }

        function redraw(){
            ctx.clearRect(0,0,cx*2,cy*2);
            ctx.fillStyle="#000000";
            ctx.fillRect(0,0,cx*2,cy*2);
            ctx.strokeStyle="#00AA00";
            ctx.fillStyle="#00FF00";
            draw(px,py,1.7);
            if(myAlert!=""){
                var arr=myAlert.split("\n");
                ctx.fillStyle="#003000A0";
                var w=scale*1.4;
                var h=scale*0.5;
                ctx.fillRect(cx-w*0.5,cy-h*0.5,w,h);
                ctx.fillStyle="#00FF00";
                for(var i=0;i<arr.length;i++){
                    ctx.fillText(arr[i],cx-w*0.5+10,cy-h*0.5+fontSize*(i+1)*1.2);
                }
            }
            myAlert="";
        }

        function drawLayer(zoom, leftWay, rightWay) {
            col = Math.min(255, Math.floor(zoom * 100+10)).toString(16);
            ctx.strokeStyle = "#00"+col+"00";
            var a=zoom*scale;
            var b=a*0.5;
            drawLine(-a,-a,-b,-b);
            drawLine( a,-a, b,-b);
            drawLine( a, a, b, b);
            drawLine(-a, a,-b, b);
            if(leftWay){
                drawLine(-a,-b,-b,-b);
                drawLine(-a,b,-b,b);
            }
            if(rightWay){
                drawLine( a,-b,b,-b);
                drawLine( a,b,b,b);
            }
            ctx.beginPath();
            ctx.rect(-b+cx,-b+cy,a,a);
            ctx.stroke();            
        }

        function drawLine(ax,ay,ex,ey){
            ctx.beginPath();
            ctx.moveTo(ax+cx,ay+cy);
            ctx.lineTo(ex+cx,ey+cy);
            ctx.stroke();            
        }

        function drawCircle(x,y,r){
            ctx.beginPath();
            ctx.arc(x+cx,y+cy,r*scale,0,2*Math.PI);
            ctx.stroke();
        }
    </script>
</body>
</html>
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Schrompf »

Im IRC schon besprochen: niedliches kleines Spiel. Und es beansprucht Neuronen in meinem Hirn, die zuletzt in Dungeon Master auf dem Amiga 1993 gefordert wurden. Ich will endlich ein neues Grimrock :-/

http://www.splitterwelten.info/privat/v ... ined_2.png
voxelcone_refined_2.png
Frohes Neues euch allen. Ich baue in Halb-Stunden-Portionen an meinen aktuellen Verschrompfungen weiter. Aktuell mein Voxel Cone Tracer, bzw. ein Zwischenstand. Ich sammle pro 64²-Bildsegment alle SparseVoxelTree-Nodes, die einen Kreiskegel berühren, der das Bounding Volume zu diesem Bildsegment durch die Szene darstellt. Dann verfeinere ich diese Liste zu 16², dann zu 4². Was jetzt fehlt, ist das finale Ausrendern der Voxelauswahl in 1²-Pixeln. Im Bild sieht man erstmal nur die Anzahl Nodes in der Vorauswahl pro Bildsegment, einige Hundert. Release-Build, nur auto-vektorisiert, single-threaded, ~12fps. Bei gerade mal 320x256 :-(

Ich hatte ursprünglich gehofft, dass ich groß was rausholen kann. Ein Raytracer hat ja O(log n)-Komplexität bezogen auf die Anzahl Primitives, weil für jeden Strahl die BoundingVolumeHierarchy durchgegangen wird, um den finalen Treffer zu ermitteln. Ich dachte, ich kann was rausholen, indem ich für Gruppen ähnlicher Rays (und von ner Kamera aus ein Bild zu tracen ist so ähnlich, wie es nur wird) eine Vorauswahl der zu betrachtenden BVH-Nodes bestimme. Damit machen quasi alle Rays einer Gruppe die ersten Schritte durch die BVH gemeinsam, und ich kann portionsweise immer feiner detaillieren, bis ich am Ende pro Pixel bei nur noch ganz wenigen zu betrachtenden Primitives rauskomme.

Ich bin auch immer noch überzeugt, dass das bei nem echten Triangle Raytracer wirklich was bringen würde. Typische Triangle Scenes sind halt eine Sammlung von Oberflächen, da kriegt man mit einem Schnitt durch die Szene vielleicht ein paar Dutzend Oberflächensegmente. Meine Voxelwelt dagegen ist volumetrisch, da sammelt ein Blick Richtung Erdboden potentiell viele hundert Meter an zu betrachtenden Nodes, weil er ja nicht wissen kann, dass nach den ersten Zentimetern 100% Abdeckung erreicht wären.

Einer der nächsten Schritte müsste also sein, dass ich wie beim VoxelSurvival-Renderer erstmal die Oberflächenvoxel bestimme. Das brauche ich eh, wenn ich dann pro Voxel auch noch eine Normale brauche und Beleuchtungsdaten sammeln will. Aber erstmal muss ich meine Parallelisierung reparieren. Aktuell klingelt ne Assertion, wenn ich Jobs zu tief verschachtele. Das ist auch der Grund, warum die Framerate-Angabe oben nur SingleThreaded ist.

[edit] Nach Fix einer sehr dummen Race Condition, bei der ein Job auf sich selbst gewartet hat, geht jetzt auch die Parallelisierung. 160fps anstatt 12fps, also quasi perfektes Scaling, wie man es erwarten würde. In Nahezu-Full-HD (1536x1024) noch 25fps.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
scheichs
Establishment
Beiträge: 845
Registriert: 28.07.2010, 20:18

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von scheichs »

@Joeydee: Nettes kleines Spiel!
@Schrompf: Glückwunsch zur Lösung des Bugs. Zeig doch mal die höher aufgelöste Version.
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Ein wenig allgemeiner Framework-Fortschritt aus den Feiertagen. Ein paar Prototypen der letzten Monate unter einem Hut: Die Stickman-Animationen, statisches Vertex-AO, Landschaft mit kleinem Cube-Dungeon und obligatorischen Zufalls-Boxen.
Die einzelnen Prototypen (AO, Ani) waren damals alle noch AIR, dazwischen liegt also auch eine Portierung nach C# mit OpenTK. Einiges ist noch rudimentär zusammengefrickelt und schreit nach mehr Code-Organisation und besserer Usability. Die Stickman-Animation ist noch die alte, etwas asymmetrisch, und als Standpose dient nur die Nullpose. Den Editor dazu habe ich noch nicht portiert. Die Kamera hat noch keinen Collider, mit der 3rd-Person-Intelligenz bin ich erst ganz am Anfang.
AO ist nur mal zur Präsentation eingebaut, eigentlich bin ich nach wie vor hauptsächlich hinter wiederverwendbarer und gut erweiterbarer allgemeiner Spielmechanik her. Wovon im Video außer herumlaufen allerdings nicht viel zu sehen ist.
a_walk.jpg
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Schrompf »

Der Boxen-Screenshot macht schon echt was her. Sehr cool
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
starcow
Establishment
Beiträge: 522
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von starcow »

joeydee hat geschrieben: 05.01.2021, 11:47 Ein wenig allgemeiner Framework-Fortschritt aus den Feiertagen. Ein paar Prototypen der letzten Monate unter einem Hut: Die Stickman-Animationen, statisches Vertex-AO, Landschaft mit kleinem Cube-Dungeon und obligatorischen Zufalls-Boxen.
Bin einmal mehr sehr beeindruckt! Wie hast du die Kollision realisiert? Ist das ein Eigenbau? (-:
Freelancer 3D- und 2D-Grafik
mischaschaub.com
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Ja, Eigenbau, Detection ist prinzipiell genau so wie zuletzt gezeigt.
Nur eben Dreiecke statt Linien, und Kugeln statt Kreise.
Landschaft, Dungeon und alle Boxen sind hier zu einem einzigen Mesh-Kollider (Dreiecks-Suppe) zusammengefasst. Die Dreiecksliste wird über ein einfaches Grid optimiert.
Benutzeravatar
Hannes
Beiträge: 36
Registriert: 11.06.2008, 06:04

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Hannes »

Hab ein wenig sichtbaren Fortschritt in mein Dungeon Spiel.
Ich kann jetzt Vertexposition und Normalen aus einer Modelldatei laden und darstellen.
Und ich habe Punktlichter hinzugefügt.
dungeon5.png
Mich würde mal interessieren, ob noch jemand hier MonoGame nutzt?
Benutzeravatar
Jonathan
Establishment
Beiträge: 2348
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Jonathan »

Haha, mir gefällt auch der Sonderzeichentest oben links in der Ecke. Etwas ganz ähnliches hatte ich bei mir auch mal ein paar Monate drin.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
scheichs
Establishment
Beiträge: 845
Registriert: 28.07.2010, 20:18

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von scheichs »

Hach ja, XNA/Monogame... Schöne Zeiten warn das. Instant-Startup, kleine Dateien, Edit&Continue im Debugger... geil! Viel Spass und gutes Verankommen!
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Schrompf »

Schon sehr cool! Aber dass Du noch so weit von den 60fps entfernt bist, macht mir ein bissl Sorgen. XNA scheint doch nicht so performant zu sein, wie ich immer dachte...
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
scheichs
Establishment
Beiträge: 845
Registriert: 28.07.2010, 20:18

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von scheichs »

Schrompf hat geschrieben: 17.01.2021, 20:24 Schon sehr cool! Aber dass Du noch so weit von den 60fps entfernt bist, macht mir ein bissl Sorgen. XNA scheint doch nicht so performant zu sein, wie ich immer dachte...
<3
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »

Sehr schön :)
joeydee
Establishment
Beiträge: 1036
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von joeydee »


Anfänge einer einfachen Verfolger-KI, mal in einem nicht-tilegebundenen Dungeon.

Aus dem Nähkästchen:
Die KI basiert einfach nur auf dem Prinzip "gehe zum letzten Punkt, an welchem du einen Gegner (Spieler) gesehen hast". Das reicht, um den Spieler auch um eine Ecke herum zu verfolgen. Ohne Wegnetz und Pathfinding. Es gibt noch keine Unterscheidung z.B. zwischen "idle" und "alarmed" oder "patrol" - wenn vom erreichten Punkt in der aktuellen Blickrichtung kein Spieler mehr gesehen wird, bleibt der NPC einfach stehen. Sieht man im Video vor allem an der letzten Begegnung: der NPC dreht sich nicht herum und sucht die Gegend ab, da der letzte Sichtungspunkt praktisch sofort erreicht war, aber die Kamera bereits aus dem Blickfeld. Da fehlt jetzt "wenn erreicht, schaue dich um, zuerst in der Richtung, in welche der Gegener gegangen ist." Und: "wenn nichts gefunden, kehre zu deinem Spawnpunkt/Patrol-Weg zurück" oder "suche dir eine Nische" o.ä.

Die Geometrie wird prozedural (aber nicht zufallsgebunden) erzeugt, mit einer Turtle-Grammatik in der Form crossing="FD 20; FD 10; [RT 20;] [LT 20;] FD 20;", und dann Einzelteile zu einem größeren Level zusammengesetzt. Es gibt auch UP/DN und einige andere Modifier um in allen Dimensionen und Winkeln zu bauen. Innenliegende Papierwände werden automatisch entfernt und Vertices geteilt.

Physik (Beschleunigung) gibt es nicht, Kollision ist ein kombinierter Sphere- und Ray-Test (Kameraposition, Strahl nach unten). Da ich per SDF teste, kann ich den Strahl einfach zu einer Capsule "verdicken" (bzw. der Level bekommt einen Radius), die Response ist aber kein echter physischer Capsule-Test, sondern lediglich eine Höhenkorrektur. Bisher ist die Korrektur nur linear, das merkt man am Sprung am Ende des Videos. Engstellen, Stufen, Rampen etc. funktionieren aber ziemlich gut damit.

Und, weil ich auch mal ein klein wenig Atmo sehen wollte, Depth-Fog und Auto-Texcoords mit 2 Flat-Texturen (nicht überall sinnvoll, aber ich habe ganz einfach noch keinen Editor geschrieben). Leider noch keine Lichtquellen. Rendern ist aber eigentlich eine ganz andere Baustelle bei der ganzen Sache.
indoor06.jpg
indoor03.jpg
indoor05.jpg
indoor08.jpg
indoor01.jpg
Benutzeravatar
Schrompf
Moderator
Beiträge: 4831
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Showroom - Aktuelle Arbeiten und Projekte

Beitrag von Schrompf »

Wow, sehr cool. Die KI tatsächlich nicht so, aber KIs finde ich eh schwer zu demonstrieren. Ich mag diese leichte Schieflage, wenn man die Kamera dreht - das wirkt irgendwie menschlich. Die Helligkeitsunterschiede in den Wandflächen wirken ein bissl komisch - es sieht manchmal so aus, als wären die Normalen verbogen bzw. würden über Kanten hinweg zusammengefasst. Die Test-Texturierung ist dagegen bereits sehr fett.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten