{"id":866,"date":"2023-09-04T06:44:59","date_gmt":"2023-09-04T06:44:59","guid":{"rendered":"https:\/\/research.swissdigitization.ch\/?p=866"},"modified":"2024-07-03T12:32:02","modified_gmt":"2024-07-03T12:32:02","slug":"entwicklung-der-dbls64-c64-gameengine-chludens","status":"publish","type":"post","link":"https:\/\/research.swissdigitization.ch\/?p=866","title":{"rendered":"Entwicklung der cry64engine &#8211; C64 GameEngine (CHLudens) [In Arbeit]"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p>Nutzung der C64 Architektur f\u00fcr eine GameEngine in Assembler.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1086 \/ 720;\" width=\"1086\" controls src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Screen-2023-09-04-091713.mp4\"><\/video><\/figure>\n\n\n\n<p><br><br>Prinzipiell stellt der C64 Bildschirminhalt (wie schon mehrfach beschrieben) im Textmode oder im Grafikmode dar. Es gibt verschiedenste Grafikmodi: 320*200 in 2 Farben oder 160*200 in <a href=\"https:\/\/research.swissdigitization.ch\/?p=338\">16 vordefinierten Farben<\/a> (Multicolormode). Wobei nur 4 Farben pro 8*8 oder 4*8 Block gesetzt werden k\u00f6nnen: 3 jeweils w\u00e4hlbare neben der allgemeinen Hintergrundfarbe. Dabei lassen sich diese Modi wie beim inspirierenden System Atari 400 hin und herschalten anhand des Rasters und damit Mischen. Sichtbar in unendlich vielen Spielen und auch Grund f\u00fcr die Teilung des Screens bei ManicMansion. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Das Problem: C64<\/strong><\/h2>\n\n\n\n<p>Betrachtet man die Spiele, die mit dem C64 entstanden sind, ist man einigermassen fasziniert, da wirklich alles aus dieser urspr\u00fcnglich als Gameconsole konzipierten Maschine rausgeholt wurde. Dabei ist der C64 alles andere als ein Paradies f\u00fcr Entwickler. Angefangen von den Text\/Grafikmodis, \u00fcber die Repr\u00e4sentation des Bildschirms als RAM in Bl\u00f6cken. Dann die maximale Aufl\u00f6sung von 320*200, die v\u00f6llig \u00fcberdimenstioniert ist f\u00fcr den Prozessor, der nur 8Bit ist (650x). Die Hardware und der Prozessor sind dabei eigentlich nicht aufeinanderabgestimmt und vieles ist einfach m\u00f6glich g\u00fcnstig gel\u00f6st. Als Entwickler* hat man zu keinem Zeitpunkt das Gef\u00fchl, dass auch nur einen Moment an die Entwickler* gedacht wurde. So fehlen elementarste Dinge f\u00fcr Gamedevs &#8211; etwa (und das haben alle Consolen nat\u00fcrlich eingebaut) die M\u00f6glichkeit Text in den Grafikmode zu rendern. Hier soll allen Ernstes mit Modis umgeschaltet werden. Dies f\u00fchrt dann auch zu der immer k\u00fcnstlichen Trennung von Bild und Text in C64 Games. Die Sprites k\u00f6nnen von 0-386(?) in X und 0-300 (?) gesetzt werden. Dadurch k\u00f6nnen sehr sch\u00f6n Sprites reinhuschen in den Screen, daf\u00fcr ist es die &#8222;H\u00f6lle&#8220;, die Sprites zu verwalten, da der Prozessor nur von 0-255 rechnet. Dann muss ein LowerByte hin. Wer dann auch noch eine eigene Kollisionsabfrage will, ja der hat viel &#8222;Spass&#8220;. Anders gesagt: <a href=\"https:\/\/research.swissdigitization.ch\/?p=714\">Der C64 ist ein Bolide<\/a> mit einem schwachen Herz. Zu erst sieht der Prozessor ja einigermassen schnell aus, bis man die Taktrate und die m\u00f6glichen Instruktionen runterrechnet auf eine Frame. Dann zeigt sich dann sehr schnell, dass ohne die Zuatz-Hardware f\u00fcr Sprites, Scrolling oder die Zusatzm\u00f6glicheiten des SIDs, der C64 recht langsam ist. Es ist dann auch verst\u00e4ndlich warum, der Apple II leider nie zum Gamecomputer avanzieren konnte in die Breite. Selbst mit den grossz\u00fcgigen 64KB RAM st\u00f6sst man sehr schnell auf Probleme bei der Entwicklung und es wird schnell klar, warum viele Spiel auf dem C64 so sind, wie sie sind.. <br><br>Man mag <a href=\"https:\/\/research.swissdigitization.ch\/?p=642\">Jack Tramiel<\/a> danken f\u00fcr sein &#8222;Computer to the masses and not classes&#8220;, aber dass darum die Programmier* dabei Unterklasse werden, das bleibt im Dunkeln und wird auch fast nicht thematisiert, wenn man* so gem\u00fctlich ein C64 Spiel spielt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>GameEngine: &#8218;Philosophie<\/strong>&#8218; (Designrules)<\/h2>\n\n\n\n<p>In der entwickelten GameEngine wurde versucht aus diesem &#8222;Unget\u00fcm C64&#8220; etwas zu machen, das keine Herausforderung in der Nutzung ist, sondern den Entwicklern* hilft. Es ist eine TopDown-Entwicklung. Die Engine wurde auch so entwickelt, dass sie f\u00fcr verschiedene Genres genutzt werden kann. Nicht implementiert sollte Scrolling werden, da dies immer eine je eigene Entwicklung ben\u00f6tigt (Playfieldgr\u00f6sse, vertikale oder horizontale Ausrichtung etc) und schwer abstrahierbar ist.<br><br>\/\/ ToDo: Vergleiche mit real entwickelten Spielen in jener Zeit und deren Ansatz &#8211; je eine eigene Engine f\u00fcr jedes Spiel oder eine Metaengine<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Technologie: KickAssembler<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>Als Sprache wurde <a href=\"http:\/\/theweb.dk\/KickAssembler\/Main.html#frontpage\">KickAssembler<\/a> benutzt. Dies ist ein scriptbare Assembler in Java mit der M\u00f6glichkeit klassische C\/Java-Kommentare zu machen \/\/ &amp; \/* *\/. Zus\u00e4tzlich gibt es vordefinierte Scripts. Durch Java als Grundsprache l\u00e4uft der Assembler auf allen Systemen. Eine Anforderung, die wichtig ist, weil Entwickeln auch auf Mac ein Goal des Projektes ist. Die meisten anderen Tools laufen vor allem auf Windows bzw. sind Plugins im Universum von Microsofts VisualStudio. <br><br>Das Compilieren ist (nach Installation von Java und dem Wechseln in den Ordner) simple:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java -jar KickAss.jar game.asm<\/code><\/pre>\n\n\n\n<p>Das generierte game.prg l\u00e4sst sich dann in jedem Emulator ausprobieren. Oft wurde in der Entwicklung aber der folgende Online-Emulator verwendet. <br><a href=\"https:\/\/c64emulator.111mb.de\/index.php?site=pp_javascript&amp;lang=en&amp;group=c64\">https:\/\/c64emulator.111mb.de\/index.php?site=pp_javascript&amp;lang=en&amp;group=c64<\/a><\/p>\n\n\n\n<p>Er funktioniert einfach mit Drag&amp;Drop, l\u00e4dt sehr schnell, die Joysticks etc sind Standard m\u00e4ssig installiert. Dinge die gerade beim Platzhirsch VICE (<a href=\"https:\/\/vice-emu.sourceforge.io\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/vice-emu.sourceforge.io<\/a>) konfiguriert werden muss. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">EngineArchitektur<\/h2>\n\n\n\n<p>Die Architektur der Engine orientiert sich an fr\u00fchen Engines (keine Eventengine) und basiert auf einem oder mehreren Loops (die linear angeordnet sind). Hier sind es: Titelbild-Loop, Menuloop, Submenloops und der Gameloop.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"842\" height=\"1010\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.01.36.png\" alt=\"\" class=\"wp-image-919\" style=\"width:347px;height:407px\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.01.36.png 842w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.01.36-250x300.png 250w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.01.36-768x921.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.01.36-624x749.png 624w\" sizes=\"auto, (max-width: 842px) 100vw, 842px\" \/><\/figure>\n\n\n\n<p>In der Organisation und Bewirschaftung der Daten wird auf die Eigenheiten\/Verteilung durch die Hardware eingeganen. Das heisst, es gibt nicht nur eine Klasse GameObjekte (wie etwa in Unity), die alles abbildet sondern zwei Teilsysteme: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"374\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.21-1024x374.png\" alt=\"\" class=\"wp-image-918\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.21-1024x374.png 1024w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.21-300x110.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.21-768x281.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.21-624x228.png 624w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.21.png 1368w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Diese zwei Objektkategorien sind bei Consolen und auch beim C64 als eigene Hardware\/Teilsysteme abgebildet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"897\" height=\"1024\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2024\/07\/Bildschirmfoto-2024-07-03-um-14.31.00-897x1024.png\" alt=\"\" class=\"wp-image-1978\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2024\/07\/Bildschirmfoto-2024-07-03-um-14.31.00-897x1024.png 897w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2024\/07\/Bildschirmfoto-2024-07-03-um-14.31.00-263x300.png 263w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2024\/07\/Bildschirmfoto-2024-07-03-um-14.31.00-768x877.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2024\/07\/Bildschirmfoto-2024-07-03-um-14.31.00-624x712.png 624w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2024\/07\/Bildschirmfoto-2024-07-03-um-14.31.00.png 1202w\" sizes=\"auto, (max-width: 897px) 100vw, 897px\" \/><\/figure>\n\n\n\n<p>Dies f\u00fchrt dann auch zu verschiedenen Interaktionen\/Events zusammen.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"472\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.25.png\" alt=\"\" class=\"wp-image-920\" style=\"width:351px;height:210px\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.25.png 790w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.25-300x179.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.25-768x459.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-04-um-09.00.25-624x373.png 624w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/figure>\n\n\n\n<p><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Aufl\u00f6sung und Playfield<\/strong> <\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>(Viele 8Bit-Consolen nutzen Playfields f\u00fcr den Background bzw. die Umgebung\/Architektur vgl. Intellivsion Ausnahmen nat\u00fcrlich Atari 2600 und Vectrex)<\/p>\n\n\n\n<p>F\u00fcr die entwickelte Engine wurde der Multicolormode genutzt. Damit l\u00e4sst sich am meisten rausholen aus den Grafikm\u00f6glichkeiten (Die meisten Games verwenden auch diesen Mode).    Anstelle des vermutlich gedachten Playgrounds mit einem Multicolorzeichensatz verwendet die Engine 8*16 Pixel grosse Bl\u00f6cke. Das sind pro Block 4 Bl\u00f6cke des C64 Grafiksystems. <\/p>\n\n\n\n<p>Die Nutzung eines so &#8222;Niedrig&#8220; aufgel\u00f6sten Rasters erlaubt es, dass das Playfield eine Liste  von 0-255 Feldern ist und so leicht manipuliert und abgespeichert werden kann. <\/p>\n\n\n\n<p>Die Engine nutzt dabei eine Liste mit den Bl\u00f6cken (Blocks) und ein aktuelles Playfield. Dieses kann gerendert werden in den Screen. Einzelne Bl\u00f6cken lassen sich updaten. Es gibt ein System zu Animationen der Bl\u00f6cke (synchron) f\u00fcr Gameplay wichtige Animation und ein System, das asynchron Animation bietet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"596\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-10.26.15-1024x596.png\" alt=\"\" class=\"wp-image-875\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-10.26.15-1024x596.png 1024w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-10.26.15-300x175.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-10.26.15-768x447.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-10.26.15-624x363.png 624w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-10.26.15.png 1368w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Die Menuszenen wie auch die einzelnen Szenen (alias Levels) sind als Levels im Speicher abgelegt. Dadurch muss nur ein System betreut werden und auch in Menuscenen kann etwa das Animationssystem benutzt werden.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Block &amp; Playfieldtool<\/strong><\/h3>\n\n\n\n<p><\/p>\n\n\n\n<p>Um dies nicht nur im Code nutzen zu k\u00f6nnen, wurde ein Tool entwickelt in <a href=\"https:\/\/processing.org\">Processing<\/a>. Dieses Tool ist zum einen ein Designtool f\u00fcr die Bl\u00f6cke und zum Anderen ein Tool zum Gestalten der Playfielder (Levels). <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"689\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.09.09-1024x689.png\" alt=\"\" class=\"wp-image-881\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.09.09-1024x689.png 1024w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.09.09-300x202.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.09.09-768x517.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.09.09-1536x1033.png 1536w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.09.09-2048x1378.png 2048w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.09.09-624x420.png 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Das Tool speichert die Daten als &#8222;rohe&#8220; JSON Daten bei den Blocks und einzelne Levels. Gleichzeitig werden die Daten per .asm File gespeichert und k\u00f6nnen dann eingezogen (include) werden.<\/p>\n\n\n\n<p>Das Tool ist so aufgebaut, dass man jeweils nach links Blocks designed und nach rechts die Levels. Im Bereich des Blockdesigns m\u00fcssen die Farben nicht ausgelesen werden, sondern werden automatisch aus den benutzten selektiert. Dies macht es einfacher zu designen. Eine farblich angeordnete Palette macht das Pixeln einfacher.<\/p>\n\n\n\n<p>\/\/ ToDo: Welche Spiele nutzten Leveleditoren und wer arbeitet Hardcore in den Listen\/Tables  oder nutzte einfach Files? Zumindest f\u00fcr die 16Bit Generation lassen sich Leveleditoren nachweisen (Bsp. WAR HELI) und sind sogar in die Games (KRACKOUT) eingebaut.  <br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Gestaltung von Blocks<\/strong>\/Szenen<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Das Gestalten von Blocks zur nachfolgenden Mehrfachverwendung ist eine Designsparte f\u00fcr sich. So m\u00fcssen die Bl\u00f6cke zwar unique aussehen, d\u00fcrfen aber auch nicht zu unique aussehen, damit sie nicht zu fest ausfallen. Das Umgekehrte gilt f\u00fcr den Hintergrund, dieser muss Regelm\u00e4ssig aber nicht zu regelm\u00e4ssig aussehen. <br>Die Limitation des C64 pro Tile\/Segment nur 4 Farben (Hintergrund nicht w\u00e4hlbar und 3 Vordergrundfarben) machen es sehr schwierig interessante Dinge zu gesalten. Erschwerend kommt die wirklich schwierige (weil einfach seltsame Farben) Farbpalette hinzu. Zu guter letzt ist erst auf dem C64 laufend, dann klar, wie es wirklich aussieht. Da liegen dann die eine oder andere Farbe schon gar eng beieinander. <\/p>\n\n\n\n<p>In die Blocks geh\u00f6rt auch ein Alphabet und Zahlen. So lassen sich Strings mit Zahlen ausgeben in der Grafik. Zus\u00e4tzlich verf\u00fcgt die Engine \u00fcber die M\u00f6glichkeite 1\/4 Blocks, klassische Tiles\/Bl\u00f6ckchen zu zeichnen. Dadurch lassen sich normale Texte in 4&#215;8 Pixeln rendern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Gestaltung von Levels<\/strong>\/Szenen<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p><br><br>Levels besitzen wie Bl\u00f6cke eine spielmechanische wie auch visuelle Funktion. Um Levels zu gesalten gibt es besondere &#8222;Commandsbl\u00f6cke&#8220;, diese Spawnen etwa den &#8222;<strong>S<\/strong>pieler&#8220; oder den Gegner etc. Diese werden dann umgewandelt in normale etwa Hintergrundbl\u00f6cke.<br><br>Die visuellen Designregeln transportieren die Mechanik, d\u00fcrfen aber auch nicht zu statisch sein und sollten irgendwie leben. Siehe dazu anderen Blogbeitrag. <br><br>Einige Beispiele:<br><br>Menuscene ohne Menupunkte<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"664\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.17.55-1024x664.png\" alt=\"\" class=\"wp-image-887\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.17.55-1024x664.png 1024w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.17.55-300x194.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.17.55-768x498.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.17.55-624x405.png 624w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.17.55.png 1268w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><br>Ein Level mit Spielerspwanpunkt und Enemyspawnpunkt<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"658\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.18.04-1024x658.png\" alt=\"\" class=\"wp-image-888\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.18.04-1024x658.png 1024w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.18.04-300x193.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.18.04-768x494.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.18.04-624x401.png 624w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-11.18.04.png 1254w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>GameObject bzw. Sprites<\/strong><\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p><br><br>Das problematischste Element ist die GameObject\/Spriteverwaltung. Diese besteht aus einer Liste von GameObjekten, die auch gerade Sprites abbilden. <\/p>\n\n\n\n<p>Ein Objekt hat jeweils die L\u00e4nge von 17 Bytes:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>0<\/td><td>1<\/td><td>2<\/td><td>3<\/td><td>4<\/td><td>5<\/td><td><strong>6<\/strong><\/td><td>5<\/td><td>6<\/td><td>7<\/td><td>8<\/td><td>9<\/td><td>10<\/td><td>11<\/td><td>12<\/td><td>13<\/td><td>14<\/td><td>15<\/td><td>16<\/td><\/tr><tr><td>x<\/td><td>xshift<\/td><td>y<\/td><td>yshift<\/td><td>w<\/td><td>h<\/td><td>state<\/td><td>statesub<\/td><td>arg<\/td><td>behaviour<\/td><td>animtodo<\/td><td>animindex<\/td><td>mina<\/td><td>maxa<\/td><td>animtype<\/td><td>animeoden<\/td><td><\/td><td><\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Positionen<\/strong><\/h3>\n\n\n\n<p>Die Sprites k\u00f6nnen in zwei Modis genutzt werden. Von 0-255 im Boxmode. Hier endet die Darstellung nach 256 Pixeln oder im 320 Pixel-Mode: Hier rechnet die Engine intern mit 2 Pixeln und dem Offset. 270 Pixel in X Richtung sind: 135 Pixel (x). M\u00f6chte man das Sprite auf 271 Pixel bewegen, so gibt es daf\u00fcr eine ShiftNumber (x-shift).  Da der C64 einen Rahmen von 20 px und 50 px hat, muss dies jeweils abgezogen werden f\u00fcr Vergleich oder Kollisionen mit dem Playfield.<br><br>320 Pixel-Mode (0-160, 0-250):<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"710\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.43.31-1024x710.png\" alt=\"\" class=\"wp-image-899\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.43.31-1024x710.png 1024w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.43.31-300x208.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.43.31-768x532.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.43.31-624x432.png 624w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.43.31.png 1362w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><br><\/strong><br><strong>Animationssystem<\/strong><\/h3>\n\n\n\n<p>Das Animationssystem ist simpel. Jedes Gameobject hat einen Animationstyp (Endlos,einmal,einmal&amp;destroy). Per MinAnimation und MaxAnimation definiert man die Animation. Und los geht es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>GameObject-GameObject-Collision<\/strong><\/h3>\n\n\n\n<p><\/p>\n\n\n\n<p>Die Engine f\u00fchrt eine Kollision von jedem Objekt mit jedem anderen durch. Kollisionen k\u00f6nnen in der Schleife abgefragt werden. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><br><br><strong>Avatar-Playground-Collision<\/strong><\/h3>\n\n\n\n<p><br><br>Die Engine pr\u00fcft per Default Avatar-Playground-Kollisionen und ist damit in der Lage Objekte aufzunehmen. Objekte k\u00f6nnen dadurch einfach Objekte &#8218;auflesen&#8216; aus dem Playfield.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><br><strong>Spritetool<\/strong><\/h3>\n\n\n\n<p><br>Das SpriteTool arbeitet \u00e4hnlich wie das Blockeditor-Tool. Geht aber auf die Eigenheiten von Sprites ein. Das heisst es k\u00f6nnen zwei Grundfarben ausgew\u00e4hlt werden und dann pro Sprite jeweils eine Zeichenfarbe.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"694\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.35.26-1024x694.png\" alt=\"\" class=\"wp-image-897\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.35.26-1024x694.png 1024w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.35.26-300x203.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.35.26-768x521.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.35.26-1536x1041.png 1536w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.35.26-2048x1388.png 2048w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/09\/Bildschirmfoto-2023-09-01-um-17.35.26-624x423.png 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Anwendung<\/strong><\/h2>\n\n\n\n<p>Die GameEngine wurde bis anhin in 3 Projekten angewendet:<br>&#8211; <strong>Squarez<\/strong> &#8211; ein einfaches Spiel, das im Rahmen des <a href=\"https:\/\/chludens.ch\">CHLudens<\/a>-Projekts durch die Geschichte der Computer nachprogrammiert wird.<br>&#8211; <strong>TheHolyCube<\/strong> &#8211; eine OneButtonSpiel von la1n ein OneButton JumpAndRun mit Animationen und vielen Levels<br>&#8211; &#8218;Z\u00fcri br\u00e4nnt&#8216; &#8211; ein einfaches Adventure im Rahmen des CHLudens-Projektes zur Frage der Machbarkeit und Einschr\u00e4nkungen der Hardware\/Medium: Game(HardwareC64)  (In Entwicklung)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Fazit<\/strong><\/h2>\n\n\n\n<p>Die GameEngine umfasst die meisten genutzten Funktionalit\u00e4ten in Spielen mit Ausnahme des Scrollings und des Sounds. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Files<\/h2>\n\n\n\n<p>Engine (TheHolyCube.asm, alle Json-Files etc)<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-fcf96d31-11ca-4d07-92ff-6525e9c890f7\" href=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/10\/TheHolyCube.zip\">TheHolyCube<\/a><a href=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/10\/TheHolyCube.zip\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-fcf96d31-11ca-4d07-92ff-6525e9c890f7\">Herunterladen<\/a><\/div>\n\n\n\n<p>Processing-Editoren:<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-69ed2d91-9ee4-49f7-a78f-bc7c8b1a06bd\" href=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/10\/EditorsProcessing.zip\">EditorsProcessing<\/a><a href=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2023\/10\/EditorsProcessing.zip\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-69ed2d91-9ee4-49f7-a78f-bc7c8b1a06bd\">Herunterladen<\/a><\/div>\n\n\n\n<p><br>\/\/ ToDo: Thematisierung des RAM Problems etc. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nutzung der C64 Architektur f\u00fcr eine GameEngine in Assembler. Prinzipiell stellt der C64 Bildschirminhalt (wie schon mehrfach beschrieben) im Textmode oder im Grafikmode dar. Es gibt verschiedenste Grafikmodi: 320*200 in 2 Farben oder 160*200 in 16 vordefinierten Farben (Multicolormode). Wobei nur 4 Farben pro 8*8 oder 4*8 Block gesetzt werden k\u00f6nnen: 3 jeweils w\u00e4hlbare neben [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[38,27,15,8,42,1],"tags":[],"class_list":["post-866","post","type-post","status-publish","format-standard","hentry","category-8bit","category-c64","category-coding","category-game","category-gameengine","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=866"}],"version-history":[{"count":42,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/866\/revisions"}],"predecessor-version":[{"id":1979,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/866\/revisions\/1979"}],"wp:attachment":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}