{"id":6232,"date":"2025-10-20T10:09:18","date_gmt":"2025-10-20T10:09:18","guid":{"rendered":"https:\/\/research.swissdigitization.ch\/?p=6232"},"modified":"2025-11-17T10:13:45","modified_gmt":"2025-11-17T10:13:45","slug":"von-klassischer-spielprogrammierung-macos-zu-java-applet-1996-virtualmaschines","status":"publish","type":"post","link":"https:\/\/research.swissdigitization.ch\/?p=6232","title":{"rendered":"Von klassischer Spielprogrammierung (MacOS) zu Java Applets 1996+ (VirtualMaschines) [Erfahrungsbericht]"},"content":{"rendered":"\n<p>Erfahrungsberichte dazu:<br>Applets (VM) sind da \u2013 Programmierung mit Events \u2013 1996+ [Erfahrungsbericht]<br> <a href=\"https:\/\/research.swissdigitization.ch\/?p=1860\">https:\/\/research.swissdigitization.ch\/?p=1860<\/a><br>Flash &amp; JavaApplets \u2013 die Idee von einer Zukunft jenseits von Plattformen [Erfahrungsbericht Zukunft 1996+] <br><a href=\"https:\/\/research.swissdigitization.ch\/?p=4994\">https:\/\/research.swissdigitization.ch\/?p=4994<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das neue Framework Java-Serverseitig und JavaApplet-Front-End<\/h2>\n\n\n\n<p>Java Applets erweiterten wie andere Plugins ab 1996 das Web. Dadurch wurde das Web um ein interaktives unpropriert\u00e4res offenes Format erweitert. Es war mit einer &#8217;normalen&#8216; Programmiersprache gemacht und nicht wie FLASH oder Director mit etwas &#8218;abstraktem&#8216;. Zus\u00e4tzlich liessen sich mit Java auch Serverseitige Dinge realaisieren. Die Idee war damit klar: Java konnte die umfassende neue klammer werden und schloss das Webfrontend auch f\u00fcr &#8217;normale&#8216; Programmiersprachen aus der C-Familie (extended) auf. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konkreter<\/h2>\n\n\n\n<p>Sie waren wie ein Bild aber mit der M\u00f6glichkeit der Interaktion. Allgemein beschrieben etwa hier: <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>A Java applet is a Java program that is launched from HTML and run in a web browser. It takes code from server and run in a web browser. It can provide web applications with interactive features that cannot be provided by HTML. Since Java&#8217;s&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Bytecode\">bytecode<\/a>&nbsp;is platform-independent, Java applets can be executed by browsers running under many platforms, including&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Microsoft_Windows\">Windows<\/a>,&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Unix\">Unix<\/a>,&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/MacOS\">macOS<\/a>, and&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Linux\">Linux<\/a>. When a Java technology-enabled web browser processes a page that contains an applet, the applet&#8217;s&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Code\">code<\/a>&nbsp;is transferred to the client&#8217;s system and executed by the browser&#8217;s&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_virtual_machine\">Java virtual machine<\/a>.<sup><a href=\"https:\/\/en.wikipedia.org\/wiki\/Applet#cite_note-5\">[5]<\/a><\/sup>&nbsp;An HTML page references an applet either via the&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Deprecation\">deprecated<\/a>&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/HTML_element#applet\"><code>&lt;applet&gt;<\/code>tag<\/a>&nbsp;or via its replacement, the&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/HTML_element#object\"><code>&lt;object&gt;<\/code>&nbsp;tag<\/a>.<sup><a href=\"https:\/\/en.wikipedia.org\/wiki\/Applet#cite_note-6\">[6]<\/a><\/sup><br><a href=\"https:\/\/en.wikipedia.org\/wiki\/Java_applet\">https:\/\/en.wikipedia.org\/wiki\/Java_applet<\/a><\/p>\n<\/blockquote>\n\n\n\n<p>Mehr dazu auch hier: <a href=\"https:\/\/medium.com\/@BitrockIT\/java-the-world-wide-web-the-beginnings-d186cb0d381\">https:\/\/medium.com\/@BitrockIT\/java-the-world-wide-web-the-beginnings-d186cb0d381<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HTML<\/h2>\n\n\n\n<p>Im HTML-Text sah dieses Objekt dann direkt so aus: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;HTML&gt;               \n&lt;BODY&gt;               \n&lt;APPLET CODE=SimpleApplet.class WIDTH=200 HEIGHT=100&gt;               \n&lt;\/APPLET&gt;               \n&lt;\/BODY&gt;               \n&lt;\/HTML&gt;\n<a href=\"https:\/\/www.oracle.com\/java\/technologies\/jpl1-building-applet.html\">https:\/\/www.oracle.com\/java\/technologies\/jpl1-building-applet.html<\/a><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">CodeStructure<\/h2>\n\n\n\n<p>Das Konzept der Applets unterscheidet sich grunds\u00e4tzlich von normaler Gameprogrammierung damals. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CodeStructure MacOS (Klassische Spielprogrammierung)<\/h3>\n\n\n\n<p>Die Programmierung eines Macspiels wie etwa breakIn (Imp89) sah folgendermassen aus in C(++). Dabei kamen letztlich die genau gleichen Code-Paradigmen wie in Assembler \/ BASIC \/ Pascal zum Einsatz: Es war letztlich ein File &#8211; ein MainPrg, das den Prozessor nutzte. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1096\" height=\"866\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-2025-10-17-um-11.50.16-Kopie.jpg\" alt=\"\" class=\"wp-image-6250\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-2025-10-17-um-11.50.16-Kopie.jpg 1096w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-2025-10-17-um-11.50.16-Kopie-300x237.jpg 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-2025-10-17-um-11.50.16-Kopie-768x607.jpg 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/Bildschirmfoto-2025-10-17-um-11.50.16-Kopie-624x493.jpg 624w\" sizes=\"auto, (max-width: 1096px) 100vw, 1096px\" \/><figcaption class=\"wp-element-caption\">Screenshot<\/figcaption><\/figure>\n\n\n\n<p>Das heisst, der ganze Code wurde von Oben nach Unten abgearbeitet, dann wurde falls n\u00f6tig auf den Vsync gewartet und es ging von vorne los. Das Resultat waren etwa die Spiele von Imp89.<\/p>\n\n\n\n<!--more-->\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"455\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/breakin2.png\" alt=\"\" class=\"wp-image-6236\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/breakin2.png 644w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/breakin2-300x212.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/breakin2-624x441.png 624w\" sizes=\"auto, (max-width: 644px) 100vw, 644px\" \/><\/figure>\n\n\n\n<p>Anders gesagt: Es gab eine &#8222;Funktion&#8220; und die durchlief ewig bis zum &#8222;Exit&#8220; eine Schlaufe. Der bekannte Gameloop. <\/p>\n\n\n\n<p>Mehr zu diesen Games siehe hier: <a href=\"https:\/\/www.la1n.ch\/macosclassic\/\">https:\/\/www.la1n.ch\/macosclassic\/<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CodeStructure JavaApplets<\/h2>\n\n\n\n<p>JavaApplets hingegen funktionierten prinzipiell anders. Sie hatten Events. Der Code war also schon von Beginn an aufgest\u00fcckelt in verschiedene Bereiche, die von der VirtualMaschine dahinter aufgerufen wurden. <\/p>\n\n\n\n<p>Der SourceCode wurde hier nicht mehr in eine EXE f\u00fcr ein System \u00fcbersetzt sondern f\u00fcr eine JavaVirtualMaschine, die bei jedem System dann anders implementiert war. Diese JavaVM war schon abstrakt oder transparent f\u00fcr den Nutzer. Auf einer Webseite lief das Applet also dann in der VM des Browsers.  <\/p>\n\n\n\n<p> Dabei entzog sich dem Developer, wie und was dahinter passierte. Die Events gab es nun einfach so, als Minimum der Ausf\u00fchrung. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.applet.Applet;\nimport java.awt.Graphics;\nimport java.awt.Color;\n\npublic class SimpleApplet extends Applet{\n\n  String text = \"I'm a simple applet\";\n\n  public void init() {\n        text = \"I'm a simple applet\";\n        setBackground(Color.cyan);\n  }\n  public void start() {\n        System.out.println(\"starting...\");\n  }\n  public void stop() {\n        System.out.println(\"stopping...\");\n  }\n  public void destroy() {\n        System.out.println(\"preparing to unload...\");\n  }\n  public void paint(Graphics g){\n        System.out.println(\"Paint\");\n        g.setColor(Color.blue);\n        g.drawRect(0, 0,\n                   getSize().width -1,\n                   getSize().height -1);\n        g.setColor(Color.red);\n        g.drawString(text, 15, 25);\n  }\n}\n<a href=\"https:\/\/www.oracle.com\/java\/technologies\/jpl1-building-applet.html\">https:\/\/www.oracle.com\/java\/technologies\/jpl1-building-applet.html<\/a><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HTML-Umgebung &#8211; eine unsichere dynamisierte Welt<\/h2>\n\n\n\n<p>Die klassische Umgebung von MacOS\/Finder oder dann Win95 war klar: Ein Programm wird gestartet, l\u00e4uft und wird dann wieder beendet. Ausnahmefall: Taskmanager. Aber sonst war das Programm f\u00fcr seinen Lebenszyklus zust\u00e4ndig.<\/p>\n\n\n\n<p>Bei HTML war das ganz anders. Die Webseite wurde geladen HTML. Dann wurde die Webseite gerendert und die Zusatzinhalte wie Bilder oder etwa auch Applets hinzugeladen. All das konnte das Layout wieder ver\u00e4ndern. Oder der User machte das Fenster gr\u00f6sser oder kleiner. Anders gesagt: Ein Applet existierte in einem sehr dynamischen Umfeld oder pragmatischer: Applets mussten anpassungsf\u00e4hig sein. <\/p>\n\n\n\n<p>Und dies findet sich dann auch in den &#8222;Events&#8220; und deren Parametern eines Applets. Wobei nie klar war wie die verschiedenen Umgebungen alias Browser genau damit umgingen. <\/p>\n\n\n\n<p>Dazu sind folgende Events einigermassen klar: init() &gt; start() &gt; stop() &gt; destroy() <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">OOP und AppletEvents<\/h2>\n\n\n\n<p>Diese Methoden sind selbstverst\u00e4ndlich schon vordefiniert in der Grundklasse Applet, auf die der Browser und die Virtual Maschine dann zugreift.  <\/p>\n\n\n\n<p>public class SimpleApplet extends Applet{ }<\/p>\n\n\n\n<p>Hier wird dann \u00fcberschrieben, was gebraucht wird und der Rest wird so belassen, wie es ist. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paint()<\/h2>\n\n\n\n<p>Die seltsamste Methode bleibt f\u00fcr das alte Paradigma die Methode Paint. Diese wird an verschiedenen Orten benutzt (println zeigt das). Wird etwa das Applet zuerst gezeichnet oder wird ein Bild dar\u00fcber geschoben, dann wird diese Methode ebenfalls aufgerufen. Das heisst, Paint wird nicht immer wieder aufgerufen. Es ist mehr eine Funktion.<\/p>\n\n\n\n<p>Deswegen eignet sie sich auch nicht als Gameloop-Funktion wie etwa bei Processing. Es muss also eine andere Methode benutzt werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GameLoop<\/h2>\n\n\n\n<p>Aus diesem Grund wird oft in der Start Methode ein Thread konstruiert, der dann immer wieder aufgerufen wird und eine eigene Methode aufruft, die der GameLoop etwa update() ist. Darin wird dann die Grafik &#8222;repainted()&#8220;. Und so entsteht dann das interaktive Spiel, das sich immer selbstupdated. Dabei l\u00e4uft dann das Spiel in einem Browser in einer VirtualMaschine. Ist also maximal weit weg von der Hardware.<\/p>\n\n\n\n<p>Dies war nat\u00fcrlich auch die Idee dahinter. Der Vor- und auch gleichzeitig sein Nachteil: Es war langsamer. Daf\u00fcr gab es aber auch keine Probleme mehr mit Speichermangagement und verschiedenen Versionen &#8211; es gab ja Java (Garbage Collector). <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zerst\u00fcckelung von Algorithmen\/Code &#8211; das Update\/GameLoop<\/h2>\n\n\n\n<p>Neu war allerdings auch, dass der Code irgendwie nicht mehr jener AssemblerCode war, der ein Methode war sondern eher ein Spiel war eher nun eine Ansammlung von Methoden, die ineinander griffen. Paint war getrennt vom Gameloop. Es entstand so eine Unabh\u00e4ngigkeit und Beil\u00e4ufigkeit im besten Fall. Datenstrukturen bedienten die Spielmechanik wie auch die Grafikgenerierung. Eine Tendenz, die auch bei den GameEngines  zu beobachten war: Das Spiel sollte nicht an der Ausgabe h\u00e4ngen.    <\/p>\n\n\n\n<p>Eines der wenigen \u00fcberlebten Beispiele findet sich hier. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HotArkanoid<\/h2>\n\n\n\n<p>Ein Arkanoid mit den Grafiken von BreakIn. Im EditorMode. Die meist Neuprogrammierung war dabei (fast zu) einfach. Statt Komplexem C++ Code gerade f\u00fcr Visuelle Dinge, war Java einfach als Sprache mit einer grossen Grundausstattung, meist keine Zusatzlibraries, besass einen Garbage Collector und all das visuelle war wirklich simple. Die Grafiken etwa konnten direkt vom Web geladen werden. Auch das Abfragen von Keys oder Maus war simpel und auf allen Systemen selbstverst\u00e4ndlich dasselbe. Es gab in diesem Sinn keine Portierprobleme. Gr\u00f6sstes Mankos: Ladezeiten, man muss in das Applet klicken, damit man \u00fcberhaupt es \u00fcberhaupt spielen konnte und anfangs waren die JavaApplet Welten auch nicht besonders schnell.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1018\" height=\"776\" src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/6951.png\" alt=\"\" class=\"wp-image-7077\" srcset=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/6951.png 1018w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/6951-300x229.png 300w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/6951-768x585.png 768w, https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/10\/6951-624x476.png 624w\" sizes=\"auto, (max-width: 1018px) 100vw, 1018px\" \/><\/figure>\n\n\n\n<p>Mehr dazu hier: <a href=\"https:\/\/vintagecomputing.ch\/?browseid=2820\">https:\/\/vintagecomputing.ch\/?browseid=2820<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Microsofts Zerst\u00f6rungswerk<\/h2>\n\n\n\n<p>Die Java-Applets waren ein interessantes Framework im Gegensatz zu Shockwave oder Flash oder Active X (nur MicrosoftPlatform). Java war &#8222;offen&#8220; als Programmsprache damals von SUN. Und Java h\u00e4tte sich entwickeln k\u00f6nnen, leider versucht dann Microsoft den Standard f\u00fcr sich zu &#8222;gewinnen&#8220; und seine eigene Version daraus zu machen. Damit lief eigentlich nur JavaApplet 1.1 maximal auf ihren Browsern und damit entwickelte sich das Plugin dann leider nicht fl\u00e4chendeckend und starb geradezu an Inkompatibilit\u00e4t auf der Mainstreamplatform Windows.<\/p>\n\n\n\n<p>Im Anwendungsbereich auf dem Desktop entwickelt sich Java ebenfalls nicht schnell genug und die Performance war immer hinter native Applicationen zur\u00fcck. Besser war es auf der Serverseite, hier konnte Java sich durchsetzen &#8211; gerade weil es \u00fcberall lief. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C# <\/h2>\n\n\n\n<p>Microsoft entwickelt dann ein eigenes Framework und eine Programmiersprache dazu: .NET. Dieses nutzt letztlich ein VM mit einer Java\u00e4hnlichen aber nun an C orientierten Sprache C#. Die Mono-Version davon kommt in vielen platform\u00fcbergreifenden Projekten zum Einsatz. Bestes Beispiel ist etwa Unity. Das dann so schnell funktionierte compiliert, dass es keine Scriptsprache mehr braucht f\u00fcr Unity 2003+. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erfahrungsberichte dazu:Applets (VM) sind da \u2013 Programmierung mit Events \u2013 1996+ [Erfahrungsbericht] https:\/\/research.swissdigitization.ch\/?p=1860Flash &amp; JavaApplets \u2013 die Idee von einer Zukunft jenseits von Plattformen [Erfahrungsbericht Zukunft 1996+] https:\/\/research.swissdigitization.ch\/?p=4994 Das neue Framework Java-Serverseitig und JavaApplet-Front-End Java Applets erweiterten wie andere Plugins ab 1996 das Web. Dadurch wurde das Web um ein interaktives unpropriert\u00e4res offenes Format erweitert. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6232","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/6232","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=6232"}],"version-history":[{"count":30,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/6232\/revisions"}],"predecessor-version":[{"id":7080,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/6232\/revisions\/7080"}],"wp:attachment":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}