Spring Comfy Jam 2026 https://itch.io/jam/comfy-jam-spring-2026
I’ve reunited with Reina and Brian, the crew that built Sneaky Elementals in January. https://nielmclaren.itch.io/sneaky-elementals
We’re building a local two-player competitive farming game. The players are growing crops in a community garden so there’s the usual farming loop. But in addition to that you can also steal your opponent’s crops or throw vegetables at them to sabotage their farming.
The players grab seeds from the supply shed, plant them, water them, then harvest. Crops can be thrown at the other player to make them drop whatever they’re holding and they can also be tossed into the harvest basket.
I’m implementing most of the logic using the composition pattern. I’ve already got 19 components but the separation of responsibility has been working out well and attaching behaviours to other entities is super easy.
For example, both the seeds and the crops have a CarryableComponent.
Here’s an early iteration where seeds can be planted and plants can be harvested. The veggies can also be picked up and tossed.
A couple days ago we recruited Thu, an artist from Pixel Route (Discord). She has some amazing work. Here’s her portfolio: https://ongoreba.artstation.com/
Here are early sketches for the player characters from Thu.
And here they are embedded in an early version of the game.
Backdrop Distortion #
This image shows one of the issues I ran into. The background image being used here actually looks like this:
…but since it’s on the ground plane it gets distorted. It gets compressed vertically.
Initially I tried to solve this by placing a backdrop image further from the camera and enabling billboarding so that it automatically rotates to face the camera. That allowed the image to be rendered without stretching but then I lost the shadows (i.e., under the characters and the veggies and seeds).
So I tried creating an invisible mesh instance on the ground plane. Godot’s Standard Material has a flag called “Shadow to Opacity” which makes areas that don’t have shadows transparent. Exactly what I need!
Unfortunately, it doesn’t work. Apparently as of Godot 4.3. https://github.com/godotengine/godot/issues/91496
And the workaround listed here didn’t work for me either because I need it to run in Compatibility mode. https://github.com/godotengine/godot-docs-user-notes/discussions/318#discussioncomment-11850541
So back to the drawing board.
In the end the solution was much simpler than all of that. I just scaled the textures UV1 to compensate for the camera angle. They were nice whole numbers, too. (-3.0, -2.0, 3.0)
Here’s my super ugly test shot. No distortion.
Occlusion Confusion #
I also had an issue where a player standing infront of a plant would be drawn behind it. I even posted in the Godot forum asking for help after troubleshooting for a couple hours. Seems like something that should be pretty common.
https://forum.godotengine.org/t/occlusion-confusion-with-billboard-sprites-in-2-5d/136900/2
Exhibit A is the desired behaviour. Behind the tree? Tree drawn in front. Infront of tree? Player drawn infront.
Exhibit B is what I was getting.
There’s some weirdness with billboarding. I guess what it comes down to is that it’s hard to tell where the origin for its rotations is. And that makes it hard to tell what point is being used to determine the distance to the camera.
My early workaround for this issue was to use textures of the same size. That made the origin consistent and fixed the occlusion issues but it also meant I had textures with lots of wasted space.
In the end I ditched the billboard feature and just rotated the images myself. Since the camera is pointing down at a 45° angle I just rotate all the sprites around the x-axis by that amount. I can place the pivot exactly where I want it and occlusion works great!
My first 3D game so lots to learn.
Composition vs. Resources #
I’m at a fork in the road for the architecture. There will be four crops. That means four seeds, four plants with multiple growth stages, and four vegetables.
Initially I thought I’d use a CropResource to define each crop. The resource would have fields for the crop name, sell price, growth time, and image files for each plant stage. Then I can pass that resource to a Seed entity and to a Plant entity and a Fruit entity and they’ll take care of the actual behaviours.
Problem is, each crop has some weird logic like some of them can be harvested multiple times or some die after harvesting and others die in winter. The CropResource ends up with a bunch of flags that I’d have to use to enable / disable different bits of logic.
Not pretty.
Here’s a screenshot from Reina’s game design document.
Instead of using Godot Resources to do this, I could have separate entities for each crop.
TomatoSeed, PotatoSeed, CabbageSeed, GarlicSeed.
TomatoPlant, PotatoPlant, CabbagePlant, GarlicPlant.
Tomato, Potato, Cabbage, Garlic.
Then put different components inside depending on the behaviour of each crop.
There might be quite a lot of repeated code in the entity class but if I’m doing things properly the logic should be in the components.
At first I was thinking the art and collision boxes would be repeated as well but I might actually benefit from being able to adjust those in the editor for each crop rather than adding fields to the CropResource definition so I can make those adjustments in code.
Huh.
When I started writing this I thought I might go with an approach that combined resources and composition but maybe composition is all I need. Since I’m practicing that pattern I should at least try going with that first.