{"id":918,"date":"2024-10-14T19:47:10","date_gmt":"2024-10-14T17:47:10","guid":{"rendered":"https:\/\/wesleydegraaf.com\/?page_id=918"},"modified":"2024-10-14T19:47:10","modified_gmt":"2024-10-14T17:47:10","slug":"ivannio-ivre","status":"publish","type":"page","link":"https:\/\/wesleydegraaf.com\/en\/ivannio-ivre\/","title":{"rendered":"Ivannio Ivre, The Painter&#8217;s Struggle"},"content":{"rendered":"\n<div class=\"wp-block-cover\" style=\"min-height:280px;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-palette-color-1-background-color has-background-dim-100 has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<p class=\"has-text-align-center has-x-large-font-size wp-block-paragraph\"><strong>Ivannio Ivre, The Painter&#8217;s Struggle<\/strong><\/p>\n<\/div><\/div>\n\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"316\" height=\"205\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-17.png\" alt=\"\" class=\"wp-image-1124\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-17.png 316w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-17-300x195.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-17-18x12.png 18w\" sizes=\"auto, (max-width: 316px) 100vw, 316px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Met een klein team deed ik mee aan de GMTK 2024 gamejam. Het thema was &#8220;Built to Scale&#8221;. Na een lange brainstorm kwamen we uit bij een painting game, waarbij je brush constant van grote veranderde. We hadden ook andere modifiers bedacht die met scale te maken hadden alleen waren deze niet te implemeteren. Het verhaal is dat Ivannio een schilder is die bezopen is en dat ie geen steady brush size kan houden. Je moet 6 prompts tekenen op basis van de klant. Na het tekenen mag je zelf kiezen op welke plek je je schilderij plaatst in de gallerij. Als je 6 tekeningen gemaakt hebt kan je je gallerij uploaden en laten raten door andere spelers. Je kan ook ander mans gallerijen raten.<br><br>Het eind resultaat is best leuk geworden en we zijn ook op een mooie overall plek geeindigd die we niet verwacht hadden 345e (van de 7.605). Dat is een goede top 500. Ons doel was om minimaal in de top 2.000 te komen. Dat is dus gelukt. Elke categorie zit ook nog eens in de top 1.000.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-1-color\">Project Info:<\/mark><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Teamleden: Floris Koelemaij, Andrich Laker, Tristan Laman<br>Project tijd: 16-08-2024 t\/m 20-08-2024<br>Engine: Unity<br>Code Languages: C#, PHP<br>Game Jam: GMTK 2024<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"1132\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-21-1024x576.png\" alt=\"\" class=\"wp-image-1132\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-21-1024x576.png 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-21-300x169.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-21-768x432.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-21-1536x864.png 1536w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-21-18x10.png 18w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-21.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"1129\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-18-1024x576.png\" alt=\"\" class=\"wp-image-1129\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-18-1024x576.png 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-18-300x169.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-18-768x432.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-18-1536x864.png 1536w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-18-18x10.png 18w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-18.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" data-id=\"1131\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-20-1024x576.png\" alt=\"\" class=\"wp-image-1131\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-20-1024x576.png 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-20-300x169.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-20-768x432.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-20-1536x864.png 1536w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-20-18x10.png 18w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-20.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<div style=\"height:104px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-palette-color-1-color has-text-color has-link-color wp-elements-944a7e6a24b589578eec49a4fdccad9a\">Painting<\/h2>\n\n\n\n<figure class=\"wp-block-image alignright size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-23-1024x576.png\" alt=\"\" class=\"wp-image-1138\" style=\"width:365px;height:auto\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-23-1024x576.png 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-23-300x169.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-23-768x432.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-23-1536x864.png 1536w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-23-18x10.png 18w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2024\/10\/image-23.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">De speler krijgt een random prompt van de klant die hij moet tekenen. Het tekenen werkt doormiddel van een Texture2D. Verschillende modifiers kunnen ook de canvas bewerken, daarom wordt eerst alle draw data ontvangen en de modifier edits om vervolgens verwerkt te worden. De wetpaint en wind koste de game nog best wat performance aangezien deze elke pixel moest updaten om het gewenste effect te krijgen. Na veel optimalisatie lagte de game niet meer hard als de wetpaint kwam. Nadat de speler klaar was met tekenen kon hij op done klikken om naar de gallerij te gaan en de painting een plekje te geven.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"dm-code-snippet light dm-normal-version no-background no-background-mobile\" snippet-height=\"\" style=\"background-color:#abb8c3\"><div class=\"control-language\"><div class=\"dm-buttons\"><div class=\"dm-buttons-left\"><div class=\"dm-button-snippet red-button\"><\/div><div class=\"dm-button-snippet orange-button\"><\/div><div class=\"dm-button-snippet green-button\"><\/div><\/div><div class=\"dm-buttons-right\"><a id=\"dm-copy-raw-code\"><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\" style=\"display:none\">Copied<\/span><span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a><\/div><\/div><pre class=\" line-numbers\"><code id=\"dm-code-raw\" class=\" no-wrap language-clike\">private void WetPaint()\n    {\n        Color32[] pixels = currentDrawing.GetPixels32();\n\n        for (int y = 1; y &lt; currentDrawing.height; y++) \n        {\n            for (int x = 0; x &lt; currentDrawing.width; x++)\n            {\n                int index = y * currentDrawing.width + x;\n                Color32 newColor = pixels[index];\n\n                if(IsSameColor(newColor, backgroundColor)) continue;\n\n                if (!QuickRandom()) continue; \n\n                int aboveIndex = index - currentDrawing.width;\n                if (aboveIndex >= 0)\n                {\n                    Color32 checkColor = pixels[aboveIndex];\n                    if (IsSameColor(newColor, checkColor)) continue;\n\n                    pixels[aboveIndex] = newColor;\n                }\n            }\n        }\n\n        currentDrawing.SetPixels32(pixels);\n        currentDrawing.Apply();\n    }<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Wetpaint functie. Gaat door alle pixels heen en checkt of er een kleur is. Ja? Als de random value ook goed is update dan de pixel er onder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-palette-color-1-color has-text-color has-link-color wp-elements-d69a7d6cf517d73a28ae1f0b811f9fc8\">API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">De game maakt gebruik van een API om paintings te uploaden en te gallerijen te bekijken. Deze api staat op de api variant van deze website (<a href=\"https:\/\/api.wesleydegraaf.com\/\">https:\/\/api.wesleydegraaf.com<\/a>). Deze api is volledig door mij gemaakt en kan de volgende dingen: Gallerije uploaden (inc images.), Gallerijen lijst, Gallerij bekijken, Gallerij raten Gallerij reporten en voor de developer een gallerij report viewer. <\/p>\n\n\n<div class=\"dm-code-snippet light no-background  dm-normal-version\" style=\"background-color:#abb8c3;\" snippet-height=\"600px\">\n\t\t\t<div class=\"control-language\">\n                <div class=\"dm-buttons\">\n                    <div class=\"dm-buttons-left\">\n                        <div class=\"dm-button-snippet red-button\"><\/div>\n                        <div class=\"dm-button-snippet orange-button\"><\/div>\n                        <div class=\"dm-button-snippet green-button\"><\/div>\n                    <\/div>\n                    <div class=\"dm-buttons-right\">\n                        <a id=\"dm-copy-raw-code\">\n                        <span class=\"dm-copy-text\">Get the Code!<\/span>\n                        <span class=\"dm-copy-confirmed\" style=\"display:none\">You have it!<\/span>\n                        <span class=\"dm-error-message\" style=\"display:none\">Use a different Browser<\/span><\/a>\n                    <\/div>\n                <\/div>\n                <pre class=\"line-numbers\"><code id=\"dm-code-raw\" class=\"wrap language-php\">\n<pre>\nrequire_once(\"GMTKconnection.php\");\n\n$galleryId = $_GET['id'] ?? null;\n\nif ($galleryId) {\n    $sql = \"SELECT GalleryName, Rating \n            FROM Gallery \n            WHERE ID = ?\";\n    \n    $stmt = $conn->prepare($sql);\n    $stmt->bind_param(\"i\", $galleryId);\n    $stmt->execute();\n    $result = $stmt->get_result();\n    \n    $response = new stdClass();\n    $response->gallery = null;\n    $response->status = \"FAILED\";\n    \n    if ($result->num_rows > 0) {\n        $row = $result->fetch_assoc();\n        \n        $gallery = new stdClass();\n        $gallery->galleryId = $galleryId;\n        $gallery->galleryName = $row[\"GalleryName\"];\n        $gallery->rating = $row[\"Rating\"];\n        \n        $sqlPhotos = \"SELECT ID, Name, ImgDir, Modifier \n                      FROM Paintings \n                      WHERE GalleryID = ?\";\n        \n        $stmtPhotos = $conn->prepare($sqlPhotos);\n\n        if ($stmtPhotos === false) {\n            die('Prepare failed: ' . $conn->error);\n        }\n\n        $stmtPhotos->bind_param(\"i\", $galleryId);\n        $stmtPhotos->execute();\n        $photosResult = $stmtPhotos->get_result();\n        \n        $gallery->photos = array();\n        while ($photo = $photosResult->fetch_assoc()) {\n            $photoObj = new stdClass();\n            $photoObj->paintingName = $photo[\"Name\"];\n            $photoObj->imgDir = $photo[\"ImgDir\"];\n            $photoObj->modifier = $photo['Modifier'];\n            $gallery->photos[] = $photoObj;\n        }\n        \n        $response->gallery = $gallery;\n        $response->status = \"OK\";\n        $response->customMessage = \"Gallery and photos retrieved successfully.\";\n    } else {\n        $response->customMessage = \"Gallery not found.\";\n    }\n    \n    $stmt->close();\n    $conn->close();\n} else {\n    $response = new stdClass();\n    $response->status = \"FAILED\";\n    $response->customMessage = \"No gallery ID provided.\";\n}\n\necho json_encode($response);\n<\/pre>\n<\/code><\/pre>\n\t\t\t<\/div>\n        <\/div>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Krijg de gallerij met het opgegeven ID. Return: GallerijID, GallerijNaam, Rating, en foto&#8217;s [fotonaam, imglocatie, modifier]\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<p><iframe loading=\"lazy\" frameborder=\"0\" src=\"https:\/\/itch.io\/embed\/2903459?link_color=00ab06\" width=\"552\" height=\"167\"><a href=\"https:\/\/double-gezicht.itch.io\/ivannio-ivre-the-painters-struggle\">Ivannio Ivre, The Painter&#8217;s Struggle by Double_Gezicht, RitchiDev, dekaaspro, Kat9_123<\/a><\/iframe><\/p>\n\n\n<p><iframe loading=\"lazy\" frameborder=\"0\" src=\"https:\/\/itch.io\/embed-upload\/11259581?color=000000\" allowfullscreen=\"\" width=\"970\" height=\"610\"><a href=\"https:\/\/double-gezicht.itch.io\/ivannio-ivre-the-painters-struggle\">Play Ivannio Ivre, The Painter&#8217;s Struggle on itch.io<\/a><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Met een klein team deed ik mee aan de GMTK 2024 gamejam. Het thema was &#8220;Built to Scale&#8221;. Na een lange brainstorm kwamen we uit bij een painting game, waarbij je brush constant van grote veranderde. We hadden ook andere modifiers bedacht die met scale te maken hadden alleen waren deze niet te implemeteren. Het [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-918","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/comments?post=918"}],"version-history":[{"count":49,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/918\/revisions"}],"predecessor-version":[{"id":1161,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/918\/revisions\/1161"}],"wp:attachment":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/media?parent=918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}