{"id":388,"date":"2022-07-13T17:05:00","date_gmt":"2022-07-13T15:05:00","guid":{"rendered":"https:\/\/sora.fshcloud.de\/?p=388"},"modified":"2024-10-11T13:17:32","modified_gmt":"2024-10-11T11:17:32","slug":"pico-8-tutorial-9-verhindere-dass-deine-spielfigur-durch-gegenstaende-laeuft","status":"publish","type":"post","link":"https:\/\/sora.fshcloud.de\/?p=388","title":{"rendered":"Pico 8 Tutorial 9: Verhindere, dass deine Spielfigur durch Gegenst\u00e4nde l\u00e4uft"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einf\u00fchrung <\/h2>\n\n\n\n<p>Du hast nun eine fertige Map und eine Kamera, die deiner Spielfigur folgt. In diesem Tutorial lernst du, wie du verhinderst, dass deine Spielfigur einfach durch Gegenst\u00e4nde l\u00e4uft (als w\u00e4re es ein Gespenst&#8230;).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Videotutorial <\/h2>\n\n\n\n<p>Wie gewohnt schaue dir gerne das folgende Video an: <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 1: Markiere die Kacheln, durch die die Spielfigur nicht &#8222;hindurchgehen&#8220; darf<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2880\" height=\"1800\" src=\"https:\/\/sora.fshcloud.de\/wp-content\/uploads\/2024\/10\/Bildschirmfoto-2024-10-09-um-16.18.16.png\" alt=\"\" class=\"wp-image-389\"\/><\/figure>\n\n\n\n<p>Wir m\u00fcssen Pico 8 irgendwie mitteilen, durch welche Objekte bzw. Gegenst\u00e4nde die Spielfigur laufen darf und durch welche nicht. Gehe in den SPRITE-Editor und klicke auf einen Sprite (bzw. eine Kachel), durch die man NICHT durchlaufen soll. <\/p>\n\n\n\n<p>Rechts neben dem Bild der Kachel siehst du insgesamt 8 nebeneinanderliegende Kreise (siehe Mauszeiger auf dem Bild oben). Diese Kreise sind sogenannte &#8222;FLAGS&#8220;. Wenn du jetzt den Kreis ganz links anklickst, hast du die FLAG 0 f\u00fcr die ausgew\u00e4hlte Kachel gesetzt.<\/p>\n\n\n\n<p>Setze nun f\u00fcr alle Kacheln, durch die dein Spieler NICHT einfach so durchlaufen soll, die FLAG auf 0. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 2: \u00dcberpr\u00fcfe, wann eine Kachel mit gesetztem FLAG vom Spieler ber\u00fchrt wird <\/h2>\n\n\n\n<p>Die FLAG einer Kachel zu setzen, reicht leider nicht aus. Die Figur gleitet immer noch durch ausgew\u00e4hlten Kacheln. Wir m\u00fcssen Pico 8 genau sagen, was er tun soll, wenn der Spieler die gesetzte Kachel ber\u00fchrt. Hierf\u00fcr brauchen wir zwei insgesamt zwei Funktionen. Wie im letzten Tutorial mache ich es dir ein bisschen einfach(er). Du kannst dir die von mir erstellte Funktion in deinen Code kopieren, solltest aber ungef\u00e4hr verstehen, was genau der Code macht. <\/p>\n\n\n\n<p>Schauen wir uns zun\u00e4chst die Funktion <em>check_map_<\/em>flag an:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Funktion 1: check_map_flag<\/h4>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-5f1730ff423c1ad9c190fb815961b343\"><code>function check_map_kollision      &lt;--Name der Funktion\n(x, y, w, h, flag)                                     &lt;-- Hier werden  f\u00fcnf Werte f\u00fcr die Funktion \u00fcbergeben. \n\nlocal function tile_flag_at             &lt;-- In dieser Funktion gibt es eine zweite Funktion\n(px, py)                                                   &lt;-- Diese Funktion \u00fcberpr\u00fcft, ob f\u00fcr die Kachel, an die der Spieler st\u00f6\u00dft,\n                                                                   ein Flag gesetzt wurde\nlocal tile_x = flr(px \/ 8)\nlocal tile_y = flr(py \/ 8)\nreturn fget(mget(tile_x, tile_y), flag)\n\nend                                                           &lt;-- Hier endet die zweite Funktion \n    \nreturn tile_flag_at(x, y) or            &lt;-- Hier wird nun \u00fcberpr\u00fcft, ob der Spieler die gesetzte Kachel oben links...\ntile_flag_at(x + w - 1, y) or             &lt;-- ... oder oben rechts...\ntile_flag_at(x, y + h - 1) or              &lt;-- ... oder unten links...\ntile_flag_at(x + w - 1, y + h - 1)     &lt;-- ... oder unten rechts... ber\u00fchrt\n                                                                   &lt;-- Wenn der Spieler einer der Ecken der Kachel ber\u00fchrt, gibt die Funktion  \n                                                                   den Wert TRUE zur\u00fcck\nend                                                          &lt;-- Zum Schluss wird die Funktion beendet<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Was macht diese Funktion?<\/strong> <\/h4>\n\n\n\n<p>Diese Funktion \u00fcberpr\u00fcft, ob der Spieler eine Kachel ber\u00fchrt, f\u00fcr die ein FLAG gesetzt wurde. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 3: Die Kollisionsfunktion <\/h2>\n\n\n\n<p>Die zweite Funktion ist nun unsere eigentliche Kollisionsfunktion: <\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-93113407b310608d917b8ba1472dd3fa\"><code>function kollision(obj,flag,dirx,diry) &lt;-- Name der Funktion. Die Funktion erh\u00e4lt bei Auruf 4 Werte. Der erste \n                                                                                   Wert ist ein Objekt\n\nif check_map_flag(obj.x,                    &lt;-- Hier \u00fcberpr\u00fcfen wir, ob unsere erste Funktion (check_map_flag) ein  \nobj.y,obj.w,obj.h,flag)                          TRUE (Kachel ber\u00fchrt) oder FALSE (Kachel nicht ber\u00fchrt) ausgibt. An \n                                                                        unsere check_map_flag-Funktion m\u00fcssen wir wieder f\u00fcnf Werte \n                                                                         \u00fcbermitteln \nthen          \n\nspieler.speed = 0                                    &lt;-- Wenn check_map_flag TRUE ausgibt, wird die Geschwindigkeit des \n                                                                       Spielers auf 0 gesetzt (damit er nicht weiterlaufen kann)\n\nspieler.x += dirx                                      &lt;-- Diese beiden Zeilen sto\u00dfen den Spieler bei Kollision kurz zur\u00fcck, damit \nspieler.y += diry                                      er nicht an dem Objekt kleben bleibt\n\n\nelse\n\nspieler.speed = 1.5                              &lt;-- Sobald der Spieler vom kollidierten Objekt zur\u00fcckgesto\u00dfen wurde, soll \n                                                                    er sich wieder normal bewegen k\u00f6nnen. Deshalb m\u00fcssen wir spieler.speed \n                                                                    wieder auf 1.5 setzen\n\nend                                                           &lt;-- Hier endet der If-Befehl\n\nend                                                           &lt;-- Hier endet unsere Funktion <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 4: F\u00fcge die beiden Funktionen in deinen Code ein<\/h2>\n\n\n\n<p>Kopiere dir die beiden Funktion (cmd und c) und f\u00fcge sie in TAB 6 ein (cmd und v) <\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-f83fcc21e04a19fb8c8def555a347e96\"><code>function kollision(obj,flag,dirx,diry)\n\nif check_map_flag(obj.x,\nobj.y,obj.w,obj.h,flag)\nthen\n\nspieler.speed = 0\n\nspieler.x += dirx\nspieler.y += diry\n\n\nelse\n\nspieler.speed = 1.5\n\nend\n\nend\n\n\nfunction check_map_flag\n(x, y, w, h, flag)\n\nlocal function tile_flag_at\n(px, py)\n\nlocal tile_x = flr(px \/ 8)\nlocal tile_y = flr(py \/ 8)\nreturn fget(mget(tile_x, tile_y), flag)\n\nend\n    \nreturn tile_flag_at(x, y) or -- obere linke ecke\ntile_flag_at(x + w - 1, y) or -- obere rechte ecke\ntile_flag_at(x, y + h - 1) or -- untere linke ecke\ntile_flag_at(x + w - 1, y + h - 1) -- untere rechte ecke\n\nend<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 5: F\u00fcge deinem Spieler-Objekt zwei weitere Eigenschaften hinzu<\/h2>\n\n\n\n<p>Damit unsere Funktionen \u00fcberpr\u00fcfen k\u00f6nnen, ob ein Spieler mit einer markierten Kachel kollidiert, brauchen sie zwei weitere &#8222;Eigenschaften&#8220; unseres Spielerobjekts: H\u00f6he der Spielerfigur in Pixel und Breite der Spielfigur in Pixel.<\/p>\n\n\n\n<p>Gehe auf TAB 0 und f\u00fcge deinem Spielerobjekt die folgende Eigenschaften hinzu:<\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-d8d7850a9e69c040d25fe4b5331ca319\"><code>h=8,\nw=8<\/code><\/pre>\n\n\n\n<p>Dein Spielerobjekt sollte nun wie folgt aussehen: <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2880\" height=\"1800\" src=\"https:\/\/sora.fshcloud.de\/wp-content\/uploads\/2022\/07\/Bildschirmfoto-2024-10-09-um-17.06.26.png\" alt=\"\" class=\"wp-image-392\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Schritt 6: Rufe unsere Kollisionsfunktion in der Update-Funktion auf<\/h2>\n\n\n\n<p>Zu guter Letzt m\u00fcssen wir unsere Kollisionsfunktion an den richtigen Stellen aufrufen und ihm die korrekten Werte f\u00fcr den jeweiligen Fall \u00fcbermitteln. <\/p>\n\n\n\n<p>Gehe in TAB 2 <\/p>\n\n\n\n<p>F\u00fcge nun innerhalb des ersten IF-Befehls (if btn(0) then), direkt unter dem Funktionsaufruf _animation(false) die folgende Zeile ein: <\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-9dd923eaf3ec5c0c08be3dfb5d7e9b7f\"><code>kollision(spieler,0,1.5,0)<\/code><\/pre>\n\n\n\n<p>Dein Code sollte nun wie folgt aussehen: <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2880\" height=\"1800\" src=\"https:\/\/sora.fshcloud.de\/wp-content\/uploads\/2022\/07\/Bildschirmfoto-2024-10-09-um-17.10.37.png\" alt=\"\" class=\"wp-image-394\"\/><\/figure>\n\n\n\n<p>Wir \u00fcbermitteln unserer Funktion mit Namen &#8222;Kollision&#8220; 4 Werte:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wert: Spieler (unser Spieler-Objekt aus TAB0)<\/li>\n\n\n\n<li>0: Der Wert der FLAG, die unsere Kollisionsfunktion \u00fcberpr\u00fcfen soll (In unserem Fall ist es 0)<\/li>\n\n\n\n<li>1.5: Der X &#8211; Wert, um den die Spielfigur zur\u00fcckgesto\u00dfen werden soll, wenn es eine markierte Kachel links ber\u00fchrt. Verhindert, dass die Spielfigur an einem Objekt kleben bleibt <\/li>\n\n\n\n<li>0: Der Y-Wert, um den die Spielfigur zur\u00fcckgesto\u00dfen werden soll, wenn es eine markierte Kachel oben oder unten ber\u00fchrt. Da sich unsere Figur in diesem IF-BLOCK nach links bewegt, soll sie nicht nach oben oder unten zur\u00fcckgesto\u00dfen werden (sondern nach rechts). Deshalb \u00fcbermitteln wir hier den Wert 0. <\/li>\n<\/ol>\n\n\n\n<p>F\u00fcge nun f\u00fcr die folgenden If-Bl\u00f6cke die folgenden Codezeilen ein: <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>If Block:<\/td><td>Codezeile:<\/td><\/tr><tr><td>if btn(1) then<\/td><td>kollision(spieler,0,-1.5,0)<\/td><\/tr><tr><td>if btn(2) then<\/td><td>kollision(spieler,0,0,1.5)<\/td><\/tr><tr><td>if btn(3) then<\/td><td>kollision(spieler,0,0,-1.5)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Deine gesamte UPDATE-Funktion in TAB2 sollte nun wie folgt aussehen: <\/p>\n\n\n\n<pre class=\"wp-block-code has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-419148adda60fca90897f1cf1f5877f8\"><code>function _update()\n\n\nif btn(0) then \n\nspieler.x -= spieler.speed\n\n_animation(false)\n\nkollision(spieler,0,1.5,0)\n\nend\n\nif btn(1) then\n\nspieler.x += spieler.speed\n\n_animation(true)\n\nkollision(spieler,0,-1.5,0)\n\nend \n\nif btn(2) then\n\nspieler.y -= spieler.speed\n\n\n_animation2()\n\nkollision(spieler,0,0,1.5)\n\n\nend\n\nif btn(3) then\n\nspieler.y += spieler.speed\n\n_animation3()\n\nkollision(spieler,0,0,-1.5)\n\n\nend\n\n einfachekam()\n\nend<\/code><\/pre>\n\n\n\n<p>Starte das Spiel. Unsere Spielfigur l\u00e4uft nun nicht mehr durch die markierten Gegenst\u00e4nde \ud83d\ude42 <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung Du hast nun eine fertige Map und eine Kamera, die deiner Spielfigur folgt. In diesem Tutorial lernst du, wie du verhinderst, dass deine Spielfigur einfach durch Gegenst\u00e4nde l\u00e4uft (als&hellip;<\/p>\n","protected":false},"author":1,"featured_media":389,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,13],"tags":[],"class_list":["post-388","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pico-8","category-tutorial"],"_links":{"self":[{"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=\/wp\/v2\/posts\/388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=388"}],"version-history":[{"count":3,"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=\/wp\/v2\/posts\/388\/revisions"}],"predecessor-version":[{"id":395,"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=\/wp\/v2\/posts\/388\/revisions\/395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=\/wp\/v2\/media\/389"}],"wp:attachment":[{"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sora.fshcloud.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}