{"id":61011,"date":"2024-01-29T15:42:53","date_gmt":"2024-01-29T14:42:53","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=61011"},"modified":"2024-02-16T08:59:47","modified_gmt":"2024-02-16T07:59:47","slug":"storyworld-ii","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2024\/01\/storyworld-ii.htm","title":{"rendered":"Storyworld II"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ich habe erfolgreich prokrastiniert und dabei eine App in den Google Play Store gestellt. Und zwar <a href=\"https:\/\/www.herr-rau.de\/wordpress\/2017\/03\/storyworld-ein-java-projekt-fuer-die-10-klasse.htm\">ein altes Programmierprojekt, Storyworld<\/a>, bei dem ich mir schon l\u00e4nger gedacht habe, dass sich das doch leicht f\u00fcrs Smartphone umschreiben lassen m\u00fcsste.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"342\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_vorstellungsgrafik-700x342.png\" alt=\"\" class=\"wp-image-61228\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_vorstellungsgrafik-700x342.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_vorstellungsgrafik-300x146.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_vorstellungsgrafik-150x73.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_vorstellungsgrafik.png 1024w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Das Projekt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Im Blogeintrag oben und einigen anderen wird das Projekt vorgestellt. Der Kerngedanke: Es gibt eine Spielwelt mit Orten, zwischen denen man sich bewegen kann, und an den Orten kann es Geschichten geben. Diese Geschichten k\u00f6nnen nachtr\u00e4glich modular in die Welt eingef\u00fcgt werden. Aufgabe einer Klasse w\u00e4re es, diese Geschichten zu schreiben und zu implementieren, und dann kann ich sie zu dem Gesamtprojekt hinzuf\u00fcgen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorbereiten des alten Projekts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe das alte BlueJ-Projekt genommen und erst einmal &#8211; neben kleineren Bugfixes &#8211; sauber aufgeteilt in ein Projekt mit der eigentlichen Engine und einigen Beispielklassen, das ich als .jar-Archiv exportiert habe. Alle bisherigen L\u00f6sungen aus dem Unterricht kamen in ein zweites BlueJ-Projekt, das dieses Archiv als Library importiert hatte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieselbe .jar-Library ist auch die Grundlage f\u00fcr ein Android-Studio-Projekt, da habe ich dann nur einen neuen View f\u00fcr die bestehenden Controller- und Model-Elemente in der Library schreiben m\u00fcssen, und den nach und nach erweitert. Das ging \u00fcberraschend leicht und schnell, bis eben auf die vielen zus\u00e4tzlichen Ideen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jetzt sieht das so aus<\/h2>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"480\" style=\"aspect-ratio: 720 \/ 480;\" width=\"720\" controls src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_intro.mp4\"><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Das Spiel selber, sofern man es als solches bezeichnen kann, gibt es <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=com.herrrau.storyworld\">hier bei Google Play<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Beispielklasse f\u00fcr Sch\u00fcler und Sch\u00fclerinnen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">So sieht ein Minimalbeispiel aus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.herrrau.storyworld.examplesStories;\nimport storyworld.mvc.model.*;\n\npublic class Beispiel extends SingleLocationStory {\n\n    @Override public String getName() {\n        return \"Eine kurze Geschichte\";\n    }\n\n    @Override public String startStoryAt() {\n        return \"Hafen\";\n    }\n\n    @Override public Report createReport() {\n        Report r = new Report(\"Die Geschichte ist sehr kurz.\");\n        r.addOption(\"Das sehe ich.\", \"leave\");\n        return r;\n    }\n    @Override public void receiveMessage(String s) {\n        if (s.equals(\"leave\")) {\n            exit();\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Interessantere Geschichten sind aufwendiger, sowohl beim Programmieraufwand als auch von der Erz\u00e4hlkunst her. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Programmiert und getestet w\u00fcrde das weiterhin in BlueJ, mit der vereinfachten BlueJ-Spielweltoberfl\u00e4che, und wenn ein Schwung Klassen fertig ist, kommen werden die zu einer Welt hinzugef\u00fcgt und in die neue Android-Version als Auswahlm\u00f6glichkeit integriert. (Davor muss ich mir die urheberrechtliche Erlaubnis von Eltern und Minderj\u00e4hrigen holen, und nat\u00fcrlich nur, wenn die das \u00fcberhaupt wollen.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was noch nicht eingeschaltet ist, aber bereits funktioniert<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sinnvolle Zufallsbegegnungen beim Unterwegssein. Man m\u00fcsste nur welche schreiben.<\/li>\n\n\n\n<li>Kontinuierliche laufende leise Hintergrundmusik. Man m\u00fcsste nur welche suchen oder aufnehmen.<\/li>\n\n\n\n<li>Ger\u00e4uscheffekte, die in Location oder Story angelegt werden und dann in Zufallsabst\u00e4nden wiedergegeben werden; ich denke da an Vogelruf am Hafen und so etwas. Man m\u00fcsste nur welche suchen oder aufnehmen.<\/li>\n\n\n\n<li>Orte, die erst auf der Karte erscheinen, wenn man in ihre N\u00e4he kommt. Das lohnt sich erst, wenn markiert wird, wo \u00fcberall man bereits war.<\/li>\n\n\n\n<li>Verschiedene Zoom-Levels.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Was noch nicht geht<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fog of War: Dass die Landkarte erst nach und nach aufgedeckt wird.<\/li>\n\n\n\n<li>Tiling. Im Moment ist der Hintergrund eine einzige, mittelgro\u00dfe Bilddatei. F\u00fcr gr\u00f6\u00dfere Projekte und mehr Details wollte ich eine h\u00f6her aufgel\u00f6ste Datei in gleich gro\u00dfe St\u00fccke zerschneiden und jeweils nur die aktuell sichtbaren zeichnen lassen. Dazu habe ich mir erst eine Grafik erstellt mit 5&#215;5 solcher Tiles und einen roten, verschiebbaren Rahmen, der den Handybildschirm darstellt. Bei den dargestellten Gr\u00f6\u00dfenverh\u00e4ltnissen werden je nach Position des Rahmens sechs bis neun der Tiles angezeigt, meistens unvollst\u00e4ndig. Ich habe mir auf Papier, also am Rechner, notiert, wie der Algorithmus dabei wohl aussehen w\u00fcrde:<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"699\" height=\"405\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_tiling.png\" alt=\"\" class=\"wp-image-61012\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_tiling.png 699w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_tiling-300x174.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_tiling-150x87.png 150w\" sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Und den notierten Java-Code rechts habe ich dann ins Programm kopiert und er hat &#8211; von einem falschen Doppel- statt Strichpunkt &#8211; sofort und perfekt funktioniert. Da war ich dann schon stolz. (Allerdings l\u00e4uft das zu langsam. Double Buffering ist das erste, was mir dazu einf\u00e4llt, da muss ich mal reinschauen, und notfalls halt doch mal ein Buch dazu lesen.)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Didaktische Sinnhaftigkeit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Schwierig. Die Klassen, die Sch\u00fclerinnen und Sch\u00fcler beisteuern, k\u00f6nnten eigentlich auch in einer anderen Syntax notiert werden, andererseits schadet Java auch nicht, ist ohnehin Lernziel, und erm\u00f6glicht mehr M\u00f6glichkeiten bei Sonderf\u00e4llen. Allerdings wird man wenig Algorithmik \u00fcben, gar keine Schleifen, nur verschachtelte bedingte Anweisungen. Man modelliert halt einen Zustandsautomaten, das ist es schon. Ich suche nach einer Idee, wie man anspruchsvollere Aufgaben, also mit mehr Algorithmik oder Modellierung, in ein Framework integrieren kann. Also doch mal eine Art Core War?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(Arrays kann man einsetzen, wenn es um das Generieren von Zufallstext geht, aber auch daf\u00fcr braucht man keine Schleifen.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Design, Userfreundlichkeit und Aussehen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ich kann das nicht gut, und ich interessiere mich zu wenig daf\u00fcr. Ja, ich sehe, wenn ich am Kerning bei einem Schriftzug etwas \u00e4ndern muss. Und ich wei\u00df, dass ich mit einer Palette anfangen sollte. Aber die M\u00fche mache ich mir nicht; ohnehin rechne ich damit, dass die Sch\u00fcler und Sch\u00fclerinnen eigene Vorstellungen haben und Zeichnungen mitbringen werden.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"459\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_bilder-700x459.png\" alt=\"\" class=\"wp-image-61225\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_bilder-700x459.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_bilder-300x197.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_bilder-150x98.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_bilder.png 1400w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe erfolgreich prokrastiniert und dabei eine App in den Google Play Store gestellt. Und zwar ein altes Programmierprojekt, Storyworld, bei dem ich mir schon l\u00e4nger gedacht habe, dass sich das doch leicht f\u00fcrs Smartphone umschreiben lassen m\u00fcsste. Das Projekt Im Blogeintrag oben und einigen anderen wird das Projekt vorgestellt. Der Kerngedanke: Es gibt eine [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":61225,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-61011","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fundstuecke"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/storyworldii_bilder.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/61011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=61011"}],"version-history":[{"count":2,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/61011\/revisions"}],"predecessor-version":[{"id":61229,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/61011\/revisions\/61229"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/61225"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=61011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=61011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=61011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}