<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Viktor de Pomian Sandell</title>
    <description>The latest articles on DEV Community by Viktor de Pomian Sandell (@depoco).</description>
    <link>https://dev.to/depoco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3768955%2F31a05f13-a9a3-406a-bc7f-56ee39ce58a4.jpg</url>
      <title>DEV Community: Viktor de Pomian Sandell</title>
      <link>https://dev.to/depoco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/depoco"/>
    <language>en</language>
    <item>
      <title>Game is done...kinda</title>
      <dc:creator>Viktor de Pomian Sandell</dc:creator>
      <pubDate>Fri, 27 Mar 2026 12:37:58 +0000</pubDate>
      <link>https://dev.to/depoco/game-is-donekinda-329g</link>
      <guid>https://dev.to/depoco/game-is-donekinda-329g</guid>
      <description>&lt;h3&gt;
  
  
  Where we are?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://depoco.itch.io/holy-carp" rel="noopener noreferrer"&gt;https://depoco.itch.io/holy-carp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, so the game is mostly done. I've uploaded it to itch.io. It's still missing a few elements, but I'll be adding more as I go.&lt;/p&gt;

&lt;p&gt;This is only my second game ever, and honestly, I'm pretty happy with how it turned out. Of course, I wanted it to have tons of features and amazing gameplay, but those will come, step by step.&lt;/p&gt;

&lt;p&gt;In this post, I'll dive deeper into my GameManager and some refactoring I did, the good stuff that keeps the project tidy and manageable.&lt;/p&gt;

&lt;h3&gt;
  
  
  What needs to be added
&lt;/h3&gt;

&lt;p&gt;Some of the pixel sprites needs to be fixed, it seems that they got messed up when I imported it into Godot, no idea why.&lt;/p&gt;

&lt;p&gt;Sort out the menu and make it look prettier and at the same time add the audio I have + the settings window.&lt;/p&gt;

&lt;h3&gt;
  
  
  GameManager stuff
&lt;/h3&gt;

&lt;p&gt;So this is my final script for the GameMananger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt;

&lt;span class="k"&gt;signal&lt;/span&gt; &lt;span class="n"&gt;lives_changed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_lives&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;signal&lt;/span&gt; &lt;span class="n"&gt;score_changed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;lives&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;current_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;# KEEPING SCORE ---------------------------------&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_update_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fish_score&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;current_score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;fish_score&lt;/span&gt;
  &lt;span class="n"&gt;score_changed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#------------------------------------------------&lt;/span&gt;

&lt;span class="c1"&gt;# HEALTH ----------------------------------------&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_decrease_life&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lives&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;lives&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;lives_changed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lives&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lives&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;_game_over&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;#------------------------------------------------&lt;/span&gt;

&lt;span class="c1"&gt;# GAME UI STUFF ---------------------------------&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;_game_over&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;game_over_scene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;preload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"uid://behejrhw6wlo7"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;game_over_instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;game_over_scene&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instantiate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;GameOverCanvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"/root/MainScene/GameOverCanvas"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;GameOverCanvas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;game_over_instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;get_tree&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;paused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;

&lt;span class="c1"&gt;#------------------------------------------------&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;reset_game&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;lives&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="n"&gt;current_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="n"&gt;lives_changed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lives&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;score_changed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It keeps track of score, lives and game over. &lt;/p&gt;

&lt;p&gt;This is just a quick update. I'm starting a new game and have a lot on my plate right now, so progress on this post will be occasional.&lt;/p&gt;

&lt;p&gt;I'll be adding more to it from time to time. Also, keep an eye out for new posts about my new game. I plan to release Part 1 next week.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My dear readers. Remember that everything I write is not always 100% correct. I do mistakes and I'm a novice at this. So if you find a mistake or just have some random feedback on anything. Please comment!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>godot</category>
      <category>godotengine</category>
      <category>gamedev</category>
      <category>gdscript</category>
    </item>
    <item>
      <title>More sprites, GameManager and refactoring</title>
      <dc:creator>Viktor de Pomian Sandell</dc:creator>
      <pubDate>Mon, 23 Feb 2026 13:43:55 +0000</pubDate>
      <link>https://dev.to/depoco/more-sprites-gamemanager-and-refactoring-2gmj</link>
      <guid>https://dev.to/depoco/more-sprites-gamemanager-and-refactoring-2gmj</guid>
      <description>&lt;h3&gt;
  
  
  More Sprites
&lt;/h3&gt;

&lt;p&gt;We're making real progress now.&lt;/p&gt;

&lt;p&gt;In the last post, I showed the fish and the boat. But that's not all, I've also made a cloud and some water… or rather, the waves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl69w1jjyz8u98ckqzx4l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl69w1jjyz8u98ckqzx4l.png" alt="Pixel image of a boat and some waves" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I pushed the boat down slightly so it looks like it’s actually sitting in the water instead of hovering awkwardly above it.&lt;/p&gt;

&lt;p&gt;I thought about animating the waves to move back and forth, but I ran into some weird bugs. Instead of fighting that battle, I parked it for later and moved on.&lt;/p&gt;

&lt;p&gt;To make things feel more alive, I added a subtle bobbing effect to the ship. I did this by adding an AnimationPlayer to the Player scene, creating a new animation, and animating the Y position from 0 -&amp;gt; -2 -&amp;gt; 0. Then I set it to loop.&lt;/p&gt;

&lt;p&gt;It's a tiny movement, but it makes a big difference. The boat no longer feels static, it gently floats, like it's actually resting on water instead of glued to the screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@onready var animation = $AnimationPlayer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get the animation reference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func _ready() -&amp;gt; void:
    animation.play("bopp")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is just to make sure the animation loads and fires once when the game starts.&lt;/p&gt;

&lt;p&gt;Yes, I misspelled the name, "bopp."&lt;/p&gt;

&lt;p&gt;It works. It does its job. I ain't touching it right now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsu5d20hmx5xysuszic0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsu5d20hmx5xysuszic0.gif" alt="Gif that shows a bobbing boat" width="266" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the waves, I added a TileMapLayer as a child node in my Main Scene. I'm not sure if I should have made it its own scene and instantiated it instead, but I’ll figure that out later.&lt;/p&gt;

&lt;p&gt;I created a spritesheet specifically for the wave tiles. Going forward, though, I'm planning to move everything into spritesheets instead of having single images scattered all over the project.&lt;/p&gt;

&lt;p&gt;This is the spritesheet for the waves(so far):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dse80gzkz7rkpwcxrrv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dse80gzkz7rkpwcxrrv.png" alt="A spritesheet image of waves" width="286" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  GameManager and some refactoring
&lt;/h3&gt;

&lt;p&gt;I made some major changes to the code.&lt;/p&gt;

&lt;p&gt;Instead of having important logic scattered across multiple places, I decided to centralize most of what I need into a single script called GameManager.&lt;/p&gt;

&lt;p&gt;It's very simple. One place to handle shared data and global behavior, things like score, game state, and other logic that multiple scenes depend on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extends Node

signal lives_changed(new_lives)
signal score_changed(new_score)


var lives = 3
var current_score = 0

# KEEPING SCORE ---------------------------------

func _update_score(fish_score):
  current_score += fish_score
  score_changed.emit(current_score)

#------------------------------------------------

# HEALTH ----------------------------------------

func _decrease_life():
  if lives &amp;gt; 0:
    lives -=1
    lives_changed.emit(lives)

  if lives == 0:
    _game_over()

#------------------------------------------------

# GAME UI STUFF ---------------------------------

func _game_over():
  var game_over_scene = preload("uid://behejrhw6wlo7")

  var game_over_instance = game_over_scene.instantiate()
  var GameOverCanvas = get_node("/root/MainScene/GameOverCanvas")

  GameOverCanvas.add_child(game_over_instance)

  get_tree().paused = true

#------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The health and game-over systems will come in a future post, they're not fully finished yet, so no point pretending they are.&lt;/p&gt;

&lt;p&gt;But the score system? That part is working.&lt;/p&gt;

&lt;p&gt;To explain it properly, I need to show parts of the fish script again, specifically the section where the fish interacts with the GameManager.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@export var fish_score = 1

func _on_body_entered(body):
    if body.is_in_group("Player"):
        GameManager._update_score(fish_score)
        queue_free()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I set it up so that when a fish comes into contact with the Player, it calls a function inside the GameManager to calculate the score.&lt;/p&gt;

&lt;p&gt;Inside GameManager, the _update_score function updates the total and then emits a signal. That signal is picked up by the UI, which updates the score counter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow looks like this:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Player catches fish -&amp;gt; call _update_score in the GameManager singleton -&amp;gt; current score (starting at 0) gets increased by the fish's value (normal or gold) -&amp;gt; signal is emitted.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;It took a while to figure out, mostly because I hadn't really worked with singletons in Godot before. Watched a short video, experimented a bit, and eventually it clicked.&lt;/p&gt;

&lt;p&gt;In the next post, I'll go deeper into the GameManager, how I connected it to the UI, the health system, and the bomb I added to the game.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My dear readers. Remember that everything I write is not always 100% correct. I do mistakes and I'm a novice at this. So if you find a mistake or just have some random feedback on anything. Please comment!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>godot</category>
      <category>gdscript</category>
      <category>beginners</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Enemies, spawns and escalating chaos</title>
      <dc:creator>Viktor de Pomian Sandell</dc:creator>
      <pubDate>Mon, 16 Feb 2026 15:54:03 +0000</pubDate>
      <link>https://dev.to/depoco/enemies-spawns-and-escalating-chaos-o2m</link>
      <guid>https://dev.to/depoco/enemies-spawns-and-escalating-chaos-o2m</guid>
      <description>&lt;h3&gt;
  
  
  Enemies
&lt;/h3&gt;

&lt;p&gt;Hmm. They're not really enemies, are they? We're not fighting anything. We're collecting fish.&lt;/p&gt;

&lt;p&gt;That reminds me, there's an awesome podcast called No Such Thing as a Fish. Completely unrelated. Anyway.&lt;/p&gt;

&lt;p&gt;Back to the game.&lt;/p&gt;

&lt;p&gt;The so-called "enemies" are fish falling from the sky, and our job is to gather them. I've made two versions:&lt;/p&gt;

&lt;p&gt;Normal fish - worth 1 point&lt;br&gt;
Gold fish - worth 3 points&lt;/p&gt;

&lt;p&gt;Yes, I know I mentioned this in the first post. Repetition builds character. Or at least reinforces game mechanics.&lt;/p&gt;

&lt;p&gt;I made two fish sprites in Aseprite. Amazing software. &lt;a href="//www.aseprite.org/"&gt;Aseprite&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknnyxisg00uer8uwbf6f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknnyxisg00uer8uwbf6f.png" alt="A image of two pixel fishes" width="225" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I decided to split them into two scenes: normal_fish and gold_fish.&lt;/p&gt;

&lt;p&gt;Both scenes use an Area2D as the root node, with a Sprite2D and a CollisionShape2D as children. I went with Area2D because I want the fish to disappear the moment they're collected by the Player.&lt;/p&gt;

&lt;p&gt;I also attached a script to each fish.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extends Area2D

@export var fall_speed = 200

func _ready() -&amp;gt; void:
    body_entered.connect(_on_body_entered)

func _process(delta: float) -&amp;gt; void:
    position.y += fall_speed * delta

func _on_body_entered(body):
    if body.is_in_group("Player"):
        queue_free()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script simply sends a signal and connects to it on the same object, meaning it handles its own collision instead of notifying another node.&lt;/p&gt;

&lt;p&gt;So when something enters the Area2D (basically touches it), the script checks if that body belongs to the &lt;strong&gt;Player&lt;/strong&gt; group. If it does, it deletes itself, the fish removes its own node from the scene.&lt;/p&gt;

&lt;p&gt;Flow is simple:&lt;/p&gt;

&lt;p&gt;Fish falls down -&amp;gt; touches the boat -&amp;gt; script verifies it's the Player -&amp;gt; fish gets deleted from the viewport.&lt;/p&gt;

&lt;p&gt;Clean and self-contained.&lt;/p&gt;

&lt;p&gt;One important detail: in the Player scene, I added the &lt;strong&gt;CharacterBody2D&lt;/strong&gt; (the root node) to a Group called &lt;strong&gt;Player&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That way, checking collisions becomes simple. Instead of hard-referencing a specific node, the fish just asks:  &lt;/p&gt;

&lt;p&gt;“Is this body in the &lt;strong&gt;Player&lt;/strong&gt; group?”&lt;/p&gt;

&lt;p&gt;If yes -&amp;gt; delete fish.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Spawn Logic
&lt;/h3&gt;

&lt;p&gt;The spawn logic took me a while to figure out. It's not 100% polished yet, but it works, and working beats perfection.&lt;/p&gt;

&lt;p&gt;I created a &lt;strong&gt;Marker2D&lt;/strong&gt; node called SpawnPoint, and gave it a &lt;strong&gt;Timer&lt;/strong&gt; node as a child, renamed to SpawnTimer.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;br&gt;
The SpawnPoint decides &lt;strong&gt;where&lt;/strong&gt; things appear.&lt;br&gt;
The SpawnTimer decides &lt;strong&gt;when&lt;/strong&gt; they appear.&lt;/p&gt;

&lt;p&gt;Position + timing. That's the whole trick.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faut51eqtr5rzsjpdi3hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faut51eqtr5rzsjpdi3hn.png" alt="Image of Godot node tree" width="266" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I moved the SpawnPoint to the middle of the screen and pushed it straight up, just outside the visible area. That way, the fish spawn off-screen and fall into view.&lt;/p&gt;

&lt;p&gt;On the SpawnTimer, I only changed one thing: &lt;strong&gt;Wait Time = 3.0 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then I attached a script to SpawnPoint, because a timer that just sits there politely counting to three doesn't actually spawn anything on its own.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extends Marker2D

var marker_pos = self.global_position.x
var viewport_size_x

const GOLD_FISH = preload("uid://cr8ekydc55yid")
const NORMAL_FISH = preload("uid://b0uukpf476i0q")

@onready var spawn_timer: Timer = $SpawnTimer
@onready var spawn_objects_group: Node = $"../SpawnObjectsGroup"

func _ready():
    viewport_size_x = get_tree().root.get_visible_rect().size.x
    spawn_timer.start()

func _on_spawn_timer_timeout() -&amp;gt; void:
    _spawn_random_object()

func _spawn_random_object() -&amp;gt; void:
    var spawn_random_position = randf_range(32, viewport_size_x - 32)
    var gold_fish_chance = 0.2 # This means a 10% chance
    var object
    if randf() &amp;lt; gold_fish_chance:
        object = GOLD_FISH.instantiate()
    else:
        object = NORMAL_FISH.instantiate()
    object.position.x = spawn_random_position
    spawn_objects_group.add_child(object)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var marker_pos = self.global_position.x&lt;/code&gt;&lt;br&gt;
This grabs the X position of the Marker2D in global space.&lt;/p&gt;

&lt;p&gt;We need that value so we know exactly where to spawn the fish horizontally in the world. Since the marker is positioned just above the screen, its global position becomes the reference point for where new objects appear.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;var viewport_size_x&lt;/code&gt;&lt;br&gt;
This creates a variable called viewport_size_x.&lt;/p&gt;

&lt;p&gt;Its job is to store the width of the viewport so we can use that value later.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const GOLD_FISH = preload("uid://cr8ekydc55yid")&lt;/code&gt;&lt;br&gt;
&lt;code&gt;const NORMAL_FISH = preload("uid://b0uukpf476i0q")&lt;/code&gt;&lt;br&gt;
These are simply references to the two scenes I created earlier. By preloading them, I can quickly instantiate either the gold fish or the normal fish without repeatedly typing long paths.&lt;/p&gt;

&lt;p&gt;It also makes the code cleaner and easier to read.&lt;/p&gt;

&lt;p&gt;Small tip: in Godot, you can hold CTRL and drag the scene file directly into the script, and it will automatically create the correct preload reference for you.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@onready var spawn_timer: Timer = $SpawnTimer&lt;/code&gt;&lt;br&gt;
&lt;code&gt;@onready var spawn_objects_group: Node = $"../SpawnObjectsGroup"&lt;/code&gt;&lt;br&gt;
Same idea here. Instead of manually typing node paths and hoping you don't mess them up, you can CTRL + drag the nodes directly from the Scene Tree into the script.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;viewport_size_x = get_tree().root.get_visible_rect().size.x&lt;/code&gt;&lt;br&gt;
&lt;code&gt;spawn_timer.start()&lt;/code&gt;&lt;br&gt;
The first line grabs the exact width of the viewport (X axis). I don’t bother with Y because the spawn position is always off the top of the screen, we only care about horizontal placement.&lt;/p&gt;

&lt;p&gt;The second line starts the timer so spawning actually begins when the game launches. That's why it's in _ready(), it only needs to fire once, right at the start.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func _on_spawn_timer_timeout() -&amp;gt; void:`
    `_spawn_random_object()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function is connected to the timeout signal of SpawnTimer.&lt;/p&gt;

&lt;p&gt;When the timer hits 3 seconds, it fires _on_spawn_timer_timeout(), which then calls _spawn_random_object().&lt;/p&gt;

&lt;p&gt;That _spawn_random_object() function is where the real magic happens, this is where the fish actually appear in the world.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func _spawn_random_object() -&amp;gt; void:
    var spawn_random_position = randf_range(32, viewport_size_x - 32)
    var gold_fish_chance = 0.2 # This means a 20% chance
    var object
    if randf() &amp;lt; gold_fish_chance:
        object = GOLD_FISH.instantiate()
    else:
        object = NORMAL_FISH.instantiate()
    object.position.x = spawn_random_position
    spawn_objects_group.add_child(object)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function randomly spawns either a normal fish or a gold fish somewhere along the screen width. The gold fish is rarer, appearing only about 20% of the time.&lt;/p&gt;

&lt;p&gt;Once a fish is chosen and its horizontal position is set, it's added to the game world, specifically into spawn_objects_group. This node acts as a container for all spawned fish, keeping the scene organized instead of scattering fish everywhere in the root.&lt;/p&gt;

&lt;p&gt;Oh, and by the way. I also finished the sprite for my boat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floc2154w82r1yuburd2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floc2154w82r1yuburd2p.png" alt="A sprite of my pixel boat" width="122" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My dear readers. Remember that everything I write is not always 100% correct. I do mistakes and I'm a novice at this. So if you find a mistake or just have some random feedback on anything. Please comment!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>beginners</category>
      <category>gdscript</category>
    </item>
    <item>
      <title>From empty scene to playable prototype</title>
      <dc:creator>Viktor de Pomian Sandell</dc:creator>
      <pubDate>Fri, 13 Feb 2026 17:17:36 +0000</pubDate>
      <link>https://dev.to/depoco/from-empty-scene-to-playable-prototype-1gkc</link>
      <guid>https://dev.to/depoco/from-empty-scene-to-playable-prototype-1gkc</guid>
      <description>&lt;h3&gt;
  
  
  Creating scenes
&lt;/h3&gt;

&lt;p&gt;First thing first. Create my project.&lt;/p&gt;

&lt;p&gt;Holy Carp! Baaam. An absolutely legendary name for my soon-to-be amazing game.&lt;/p&gt;

&lt;p&gt;Now we've got our very first scene, let's call it main_scene. This is the mothership. The place where I'll instantiate all the other scenes.&lt;/p&gt;

&lt;p&gt;Oh, and by the way. Godot works with scenes instead of traditional objects. A very simplified explanation from my part.&lt;/p&gt;

&lt;h3&gt;
  
  
  Main Scene
&lt;/h3&gt;

&lt;p&gt;I changed the window size of my game by going to &lt;strong&gt;Project -&amp;gt; Project Settings -&amp;gt; Display (Window)&lt;/strong&gt; and setting the viewport width and height to 720×1280. It's a vertical game, after all.&lt;/p&gt;

&lt;p&gt;But since I'm developing on my laptop, that resolution doesn't exactly fit on my screen. The viewport would stretch beyond my screen height, which is… not ideal.&lt;/p&gt;

&lt;p&gt;So I did what any reasonable developer does, I googled it.&lt;/p&gt;

&lt;p&gt;Turns out, in Godot you can use Window Width Override and Window Height Override. Basically, you keep your actual game resolution at 720×1280, but tell the editor to display it smaller while you're working.&lt;/p&gt;

&lt;p&gt;So for now, I set the override to 360×640. Same aspect ratio. Half the size. Much less pain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6effzoh9kduaqed3u8h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6effzoh9kduaqed3u8h.png" alt="Image of the Godot Editor" width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's pretty much everything I did for the main scene.&lt;/p&gt;

&lt;p&gt;Wait. Not everything.&lt;/p&gt;

&lt;p&gt;I also added a Camera and positioned it over the viewport. Do I actually need it? Not entirely sure. So I had to google this as well.&lt;/p&gt;

&lt;p&gt;In Godot, a Camera2D controls what part of the world you see. If your game is static and nothing moves outside the screen, you technically don't need one. But the second you want scrolling, following a player, zooming, or any kind of movement? You'll want that camera there.&lt;/p&gt;

&lt;p&gt;So I'm going to keep it for the future, or just pretending I know what I’m doing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node Structure &amp;amp; Project Structure
&lt;/h3&gt;

&lt;p&gt;For this part, I actually did a little homework on what's considered "best practice", basically, how to set things up now so I don't hate myself later.&lt;/p&gt;

&lt;p&gt;I really want to keep my project tidy, and a few people suggested breaking scripts into smaller Nodes as children of the root node. At first, I had no clue what that even meant, but after some Googling, it clicked. I'll dive deeper into this when I cover my Player scene.&lt;/p&gt;

&lt;p&gt;When it comes to my project structure, its very straight forward, at least for a small project like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwiv29b48u6iuqugoktnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwiv29b48u6iuqugoktnl.png" alt="Project structure in Godot" width="252" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the Player
&lt;/h3&gt;

&lt;p&gt;Now it's time for the Player scene.&lt;/p&gt;

&lt;p&gt;I started with a CharacterBody2D(CB2) node, because I don't need physics for this game. If I did, I'd probably go with a Rigidbody2D… I think. For now, CB2 is plenty. I didn't mess with any of its settings at the start, mostly because I had no idea what things did.&lt;/p&gt;

&lt;p&gt;Next, I added a CollisionShape2D as a child of the Player node(CB2). This is crucial, without it, I can't "catch" the falling fish or get pummeled by the bad stuff.&lt;/p&gt;

&lt;p&gt;Finally, I added a Sprite2D node and the default icon.svg as its sprite, just so something actually shows up while I'm working.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvsgvoy58ytbq5migwige.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvsgvoy58ytbq5migwige.png" alt="Icon from the Godot Editor" width="765" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is coming along nicely.  &lt;/p&gt;

&lt;p&gt;But now we actually need to move the Player. And this is where key inputs and scripts does its thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Movement
&lt;/h3&gt;

&lt;p&gt;I went to Project -&amp;gt; Project Settings -&amp;gt; Input Map at the top, and added a few actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;left&lt;/strong&gt; - triggered by the A key and the left arrow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;right&lt;/strong&gt; - same as left but opposite keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;helper&lt;/strong&gt; - triggered by the Space key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that the key mapping is done, I should be able to move this bad boy around the viewport, right?&lt;/p&gt;

&lt;p&gt;Nope. Not that easy. We still have to tell this mess what to do. Scripts, people. Scripts.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;GDScript&lt;/strong&gt; and the appointed scripts.&lt;/p&gt;

&lt;p&gt;Like I mentioned earlier, we need to break our scripts up. I don't want one giant 10,000+ line monstrosity, that's a nightmare to manage.&lt;/p&gt;

&lt;p&gt;So, I made a simple node called &lt;strong&gt;MovementScriptNode&lt;/strong&gt; and made it a child of the Player node. On this node, I attached a script to handle movement.&lt;/p&gt;

&lt;p&gt;But there's a catch, this script doesn't automatically know that it's supposed to move the Player, because right now it's just a lonely node floating in space.&lt;/p&gt;

&lt;p&gt;We need to tell the Player node to use the info in the script attached to &lt;strong&gt;MovementScriptNode&lt;/strong&gt;. We do this by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extends CharacterBody2D

@onready var movement = $MovementScriptNode

func _physics_process(delta: float) -&amp;gt; void:
    movement.move_player(self, delta)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So what this code means is, in very short terms: "Whattup MovementScriptNode, please move me." the move_player is a function in MovementScriptNode. As you can see below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;extends Node

@export var speed = 400

func move_player(character, _delta):
    var input_direction = Input.get_axis("left", "right")
    character.velocity.x =  input_direction * speed

    if character.velocity.x &amp;gt; 0:
        character.get_node("Sprite2D").flip_h = true
    elif character.velocity.x &amp;lt; 0:
        character.get_node("Sprite2D").flip_h = false

    character.move_and_slide()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I could go line by line here, if you want, let me know in the comments.&lt;/p&gt;

&lt;p&gt;Basically, the movement script does this: reads input, sets the Player's velocity, flips the sprite, and then tells the Player to actually move. It uses a parameter called &lt;strong&gt;character&lt;/strong&gt;, which in the Player script is passed as &lt;strong&gt;self&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xnull5m7y40m0fzuh1y.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xnull5m7y40m0fzuh1y.gif" alt="Gif of the Godot sprite moving back" width="400" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the Player moves like it should… except it can wander off the viewport. I'll fix that later, once I figure out how. (ignore the size of the Player node.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My dear readers. Remember that everything I write is not always 100% correct. I do mistakes and I'm a novice at this. So if you find a mistake or just have some random feedback on anything. Please comment!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>godot</category>
      <category>gdscript</category>
      <category>beginners</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>My f...second game</title>
      <dc:creator>Viktor de Pomian Sandell</dc:creator>
      <pubDate>Thu, 12 Feb 2026 15:28:18 +0000</pubDate>
      <link>https://dev.to/depoco/my-fsecond-game-935</link>
      <guid>https://dev.to/depoco/my-fsecond-game-935</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Hello there! and welcome!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I originally planned to start documenting my journey when I made my first game. You can check it out here: &lt;a href="https://depoco.itch.io/hostbound" rel="noopener noreferrer"&gt;Hostbound&lt;/a&gt;. I built it for a horror game-jam. It’s not exactly terrifying, but making it was meaningful.&lt;/p&gt;

&lt;p&gt;The problem is… I barely remember what I learned. The game was uploaded on November 5th, 2025, and I haven’t looked at Godot or GDScript since. Real life happened.&lt;/p&gt;

&lt;p&gt;Anyway. Enough nostalgia.&lt;/p&gt;

&lt;p&gt;I need a new idea. And I hate learning purely through tutorials. Small stuff is fine, but listening to the same guy explain the same thing for 36 hours feels like psychological torture. So I’m doing this the only way I know how and that is by actually making something.&lt;/p&gt;

&lt;h3&gt;
  
  
  The idea
&lt;/h3&gt;

&lt;p&gt;A simple 2D game. Mostly because I can handle intermediate pixel art without losing my sanity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The core concept:&lt;/strong&gt;&lt;br&gt;
Fish fall from the sky. You catch them with your boat. You avoid bad stuff. Simple, slightly stupid. Perfect. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Normal fish(lets just do medium size)&lt;/li&gt;
&lt;li&gt;Rare fish(golden fish? treasure chest with a fish icon?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cans&lt;/li&gt;
&lt;li&gt;Knifes&lt;/li&gt;
&lt;li&gt;Spiky sea urchins?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Power-ups?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clock -&amp;gt; slow motion for 6 seconds&lt;/li&gt;
&lt;li&gt;Magnet -&amp;gt; pulls fish toward your boat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Health system: hearts.&lt;br&gt;
Max 3 hearts. Falling hearts can restore lost health.&lt;/p&gt;

&lt;h3&gt;
  
  
  So the game goes like this(for now):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You start with 3 lives.&lt;/li&gt;
&lt;li&gt;Catch fish -&amp;gt; +1 score.&lt;/li&gt;
&lt;li&gt;Rare fish, special objects -&amp;gt; +3 score.&lt;/li&gt;
&lt;li&gt;Catch trash -&amp;gt; Lose 1 life.&lt;/li&gt;
&lt;li&gt;If a fish hits the water... not decided this yet.&lt;/li&gt;
&lt;li&gt;Spawn rate increases over time -&amp;gt; more chaos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I might add a helper later on. For example a seagull that swoops in when you press Space. But first we are making a MVP&lt;/p&gt;

&lt;p&gt;That's the plan. Thanks for reading, and stay tuned for more to come. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0lmaxjlt4votv0d1ubr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0lmaxjlt4votv0d1ubr.png" alt="AI IMAGE of a fish with a hat" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>beginners</category>
      <category>gdscript</category>
    </item>
  </channel>
</rss>
