{"id":1378,"date":"2025-12-29T17:52:06","date_gmt":"2025-12-29T15:52:06","guid":{"rendered":"https:\/\/wesleydegraaf.com\/?page_id=1378"},"modified":"2025-12-29T17:52:06","modified_gmt":"2025-12-29T15:52:06","slug":"reel-or-be-gilled","status":"publish","type":"page","link":"https:\/\/wesleydegraaf.com\/en\/reel-or-be-gilled\/","title":{"rendered":"Reel or be Gilled"},"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\"><strong>Reel or be Gilled<\/strong><\/p>\n<\/div><\/div>\n\n\n\n<figure class=\"wp-block-image alignright size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"692\" height=\"1024\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC-692x1024.png\" alt=\"\" class=\"wp-image-1402\" style=\"object-fit:cover;width:271px;height:auto\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC-692x1024.png 692w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC-203x300.png 203w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC-768x1137.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC-1037x1536.png 1037w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC-1383x2048.png 1383w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC-8x12.png 8w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/ZVGQoC.png 1400w\" sizes=\"auto, (max-width: 692px) 100vw, 692px\" \/><\/figure>\n\n\n\n<p>Tijdens Project Vrij II hebben we gewerkt aan een local multiplayer game genaamd Reel or be Gilled. De game is een fast paced collection game waarin spelers het tegen elkaar opnemen om zo snel mogelijk zoveel mogelijk vissen te vangen en deze in te leveren om punten te scoren.<br><br>In tegenstelling tot traditionele, rustige visgames zijn de vissen in Reel or be Gilled allesbehalve onschuldig. Ze bijten niet alleen aan de haak, maar kunnen ook terugbijten, spelers stunnen of zelfs exploderen. Deze chaotische elementen zorgen voor een competitieve en humoristische gameplay-ervaring.<br><br>Spelers kunnen elkaar actief dwarszitten door gebruik te maken van verschillende powerup-vissen, die strategisch ingezet kunnen worden om tegenstanders te vertragen of op te blazen. Het doel is niet alleen om zelf effici\u00ebnt te vissen, maar ook om ervoor te zorgen dat je vrienden het minstens zo moeilijk hebben als de vissen die je uit het water trekt.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-embed alignright is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Reel or be Gilled Trailer\" width=\"1290\" height=\"726\" src=\"https:\/\/www.youtube.com\/embed\/uq_uylstwRo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\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>Teamleden: 10 teamleden zie de <a href=\"https:\/\/ritchidev.itch.io\/reel-or-be-gilled\" target=\"_blank\" rel=\"noreferrer noopener\">itch.io<\/a> projectpagina<br>Project tijd: HKU Jaar 2 Periode 4 (14-04-2025 t\/m 12-06-2025)<br>Engine: Unity<br>Code Languages: C#<br>Design Patterns: Observer, Singleton &amp; FlyWeight<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-2 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=\"1411\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/LdioZ2-1024x576.png\" alt=\"\" class=\"wp-image-1411\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/LdioZ2-1024x576.png 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/LdioZ2-300x169.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/LdioZ2-768x432.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/LdioZ2-1536x864.png 1536w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/LdioZ2-18x10.png 18w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/LdioZ2.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=\"1413\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/N7lY2l-1024x576.png\" alt=\"\" class=\"wp-image-1413\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/N7lY2l-1024x576.png 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/N7lY2l-300x169.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/N7lY2l-768x432.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/N7lY2l-1536x864.png 1536w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/N7lY2l-18x10.png 18w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/N7lY2l.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=\"1412\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/JFh0ok-1024x576.png\" alt=\"\" class=\"wp-image-1412\" srcset=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/JFh0ok-1024x576.png 1024w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/JFh0ok-300x169.png 300w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/JFh0ok-768x432.png 768w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/JFh0ok-1536x864.png 1536w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/JFh0ok-18x10.png 18w, https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/JFh0ok.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=\"517\" height=\"291\" data-id=\"1414\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/hKUDU.gif\" alt=\"\" class=\"wp-image-1414\"\/><\/figure>\n<\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Hier onder deel ik wat relevanten systemen die ik heb uitgekozen (dit is maar een fractie van het werk wat ik gedaan heb)<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-palette-color-2-color has-text-color has-link-color wp-elements-fbf96d26f1e5b75c906fd049b29697ca\">Character Selection<\/h2>\n\n\n\n<figure class=\"wp-block-image alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/Playerselect-ezgif.com-video-to-gif-converter-1.gif\" alt=\"\" class=\"wp-image-1486\" style=\"width:542px;height:auto\"\/><\/figure>\n\n\n\n<p>Ik heb gewerkt aan het volledige local multiplayer systeem, waaronder het character select systeem. Speler kunnen op elk moment joinen door een specifieke input te geven. Zodra een speler karakter selecteert, wordt deze vergrendeld en is hij niet meer beschikbaar voor andere spelers. Wanneer alle deelnemende spelers een karakter hebben gekozen, start het spel automatisch een countdown van drie seconden, waarna de game begint. Als een speler zijn selectie ongedaan maakt of de lobby verlaat, wordt de countdown direct gestopt.<\/p>\n\n\n\n<div style=\"height:0px\" 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-javascript\"> public CharacterSelection GetNextSelectionPoint(CharacterSelection currentCharacter, int direction, out float yOffset)\n    {\n        List&lt;CharacterSelection> selections = characterPoints.Where(i => !i.IsSelected).ToList();\n\n        int currentIndex = 0;\n\n        if (selections.Contains(currentCharacter)) currentIndex = selections.IndexOf(currentCharacter);\n        else currentIndex = characterPoints.IndexOf(currentCharacter);\n\n        currentIndex += direction;\n        if (currentIndex &lt; 0) currentIndex = selections.Count - 1;\n        else if (currentIndex > selections.Count - 1) currentIndex = 0;\n\n        yOffset = GetSelectionOffset(selections[currentIndex], null);\n\n        return selections[currentIndex];\n    }\n\n    public float GetSelectionOffset(CharacterSelection characterSelection, CharacterSelectPlayer player, float offsetStart = 3.7f)\n    {\n        float yOffset = offsetStart;\n        List&lt;CharacterSelectPlayer> selections = playerSelectors.Where(p => p != null &amp;&amp; p.GetCurrentSelection() == characterSelection).ToList();\n\n        int offsetIndex = 0;\n\n        if (player != null)\n        {\n            offsetIndex = selections.IndexOf(player);\n\n            if (offsetIndex &lt; 0) offsetIndex = 0;\n        }\n        else offsetIndex = selections.Count;\n\n        yOffset += offsetIndex * .6f;\n\n        return yOffset;\n    }<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"has-text-align-center\">De functies om de hoogte van de player cursor te bepalen en de vollegende. Met deze manier kunnen we zonder code edits nieuwe karakters toevoegen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-palette-color-2-color has-text-color has-link-color wp-elements-0040863217d4aa0c415aa57d50ef761d\">Vissen<\/h2>\n\n\n\n<figure class=\"wp-block-image alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/wesleydegraaf.com\/wp-content\/uploads\/2025\/12\/Fishing-ezgif.com-video-to-gif-converter.gif\" alt=\"\" class=\"wp-image-1490\" style=\"width:542px\"\/><\/figure>\n\n\n\n<p>Spelers kunnen hun hengel uitwerpen om vissen te vangen. Omdat het een fast paced game is, mocht de vis mechanic niet te lang duren. Daarom is gekozen voor een compacte fishing minigame waarin de speler de stick moet bewegen naar een doelpunt binnen een radius en dit bevestigt met een knop.<br><br>Wanneer de speler drie keer mist, faalt de fishing minigame en ontsnapt de vis. Het systeem ondersteunt technisch gezien meerdere inputtoetsen voor deze minigame, zodat het mechanisme flexibel is en eenvoudig aanpasbaar. Deze optie is uiteindelijk niet gebruikt in de game, omdat dit de complexiteit zou verhogen en mogelijk verwarrend kan zijn voor beginnende spelers.<\/p>\n\n\n\n<div style=\"height:0px\" 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-javascript\">    public void UsePressed()\n    {\n        \/\/Blocks first input (Preventing an unfair strike).\n        if (initTime == Time.time || initTime == 0 || playerInput == Vector2.zero) return;\n\n        FishingPoint fishPoint = CheckLocations();\n\n        if (fishPoint == null)\n        {\n            strikeCount++;\n\n            if (strikeCount >= maxStrikes) CancelFishing();\n\n            return;\n        }\n\n        fishingPoints.Remove(fishPoint);\n        Destroy(fishPoint.gameObject);\n\n        if (fishingPoints.Count == 0)\n        {\n            OnCompleteCallback?.Invoke(owner, transform.position - Vector3.one * 2);\n            OnFishingComplete?.Invoke();\n            CancelFishing();\n        }\n    }\n\n    private FishingPoint CheckLocations()\n    {\n        for (int i = 0; i &lt; fishingPoints.Count; i++)\n        {\n            float pointAngle = fishingPoints[i].FishingAngle;\n            float wrappedPlayerAngle = (playerAngle + 360f) % 360f;\n            float wrappedPointAngle = (pointAngle + 360f) % 360f;\n\n            float angleDifference = Mathf.Abs(wrappedPlayerAngle - wrappedPointAngle);\n            angleDifference = Mathf.Min(angleDifference, 360f - angleDifference);\n\n            if (angleDifference &lt;= collectionRadiusDistance)\n            {\n                fishingPoints[i].ShowHighlight(true);\n                return fishingPoints[i];\n            }\n        }\n\n        return null;\n    }<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"has-text-align-center\">Fishing Point location checking<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<p><iframe loading=\"lazy\" frameborder=\"0\" src=\"https:\/\/itch.io\/embed\/3479370?linkback=true&amp;link_color=0b8909\" width=\"552\" height=\"167\"><a href=\"https:\/\/ritchidev.itch.io\/reel-or-be-gilled\">Reel or be Gilled by RitchiDev, maefii, Double_Gezicht, y1zejin, Traan, Doodle Birb, SolarFlare, Zwimpie<\/a><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tijdens Project Vrij II hebben we gewerkt aan een local multiplayer game genaamd Reel or be Gilled. De game is een fast paced collection game waarin spelers het tegen elkaar opnemen om zo snel mogelijk zoveel mogelijk vissen te vangen en deze in te leveren om punten te scoren. In tegenstelling tot traditionele, rustige visgames [&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-1378","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/1378","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=1378"}],"version-history":[{"count":75,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/1378\/revisions"}],"predecessor-version":[{"id":1491,"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/pages\/1378\/revisions\/1491"}],"wp:attachment":[{"href":"https:\/\/wesleydegraaf.com\/en\/wp-json\/wp\/v2\/media?parent=1378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}