Making Sailing Feel Right in Sailswept
How small visual and feedback changes transformed the feel of sailing in my indie game.
Introducing Sailswept
This is Sailswept.
It’s a sailing game I’ve been working on in Godot, and this is the first point in development where the core mechanics feel solid enough that I’m genuinely proud of them.
My vision for Sailswept is a self-contained story about things ending, set across a chain of lakes during the height of summer. It’s a quiet, reflective experience where movement and atmosphere matter just as much as mechanics.
That said, it didn’t always look — or feel — like this.
The Starting Point
I started this build with a very basic (and honestly not very good) water shader, a quick island I whipped up in Blender, and a sailing system designed to loosely mimic real sailing. Your speed was determined by your boat and sail orientation relative to the wind.
While it technically worked, the experience felt off.
The boat looked like it was sliding across the water.
The island felt disconnected from its surroundings.
And the wave crests looked more like clouds than water.
This first devlog — and this post — is about the small steps I took that made a surprisingly big difference to how the game looks and feels.
Heeling: Giving Sailing Weight
The first thing I worked on was heeling — the way a boat leans when wind hits the sails at an angle. In real sailing, the faster you go, the more the boat heels, and I wanted to reflect that.
A common intuition is that sailing directly downwind with full sails is fastest. In reality, that relies mostly on drag, acting almost like a reverse parachute.
Sailing at roughly a 90-degree angle to the wind — known as a beam reach — allows the sail to behave more like an airplane wing, generating lift and producing much higher speeds.
Adding heeling helped communicate this intuitively. The boat now leans more when you’re sailing efficiently, giving immediate visual feedback about how well you’re trimming your sails.
Improving the Boat Wake
Once the boat itself felt better, I moved on to the wake.
Initially, I had a simple trail behind the boat. It actually looked quite nice, but it lacked energy and didn’t communicate speed or turning very well.
After experimenting with more complex approaches (and overcomplicating things), I went back to the simple trail and enhanced it instead. I added curvature and layered a particle emitter on top, which immediately made the wake feel more dynamic and responsive.
Sometimes simpler really is better.
Making the Water React to Wind
Next, I revisited the water shader. I wanted the surface of the lake to react to changing wind direction.
The solution was surprisingly straightforward: rotating the water texture based on wind direction. It’s a subtle effect, but it helps unify the environment and reinforces the idea that wind is a global force affecting everything, not just the boat.
Fixing Wispy Wave Crests
One thing that bothered me early on was how soft and cloud-like the wave crests looked.
To fix this, I sharpened the transition between water and crest, removing the soft blending entirely. I also changed the crest color from stark white to a softer blue, which immediately made the water feel more cohesive and less visually noisy.
This was a small tweak, but it had a huge impact on the overall look.
Adding a Shoreline Effect
The islands still felt like they were floating, which broke immersion.
To ground them, I added a shoreline effect where shallow water meets land. This turned out to be more difficult than expected. Following several Godot water shader tutorials didn’t produce usable results, so I dug through older forum posts instead.
Eventually, I found what I can only describe as “depth texture magic.” After plugging it in and adjusting for newer Godot shader changes, the effect finally worked — and the islands instantly felt anchored in the world.
Making Wind Visible
At this point, something was clearly missing: you couldn’t see the wind.
The game already used wind to affect movement, but the only indicator was a small UI arrow. That wasn’t enough. If wind is core to gameplay, players need to be able to read it.
I added wind particles to visualize gusts, direction changes, and strength. Making the invisible visible improved both the feel and the readability of sailing, and made the world feel far more alive.
There’s still room to refine this, but it was a major step forward.
Refining the Water Look
I still wasn’t happy with the water overall, so I kept iterating.
One surprisingly effective change was removing the normal map entirely. This gave the water a blockier, low-poly look that better matched the game’s aesthetic.
I experimented with Godot’s built-in noise options, but ultimately settled on using actual water textures after some trial and error. This struck a good balance between stylization and clarity.
Adding Depth to the Water
To further enhance the sense of place, I added a depth-based color effect to the water. Deeper areas now appear darker, helping define channels and lake beds.
This was relatively simple to implement, as I could reuse much of the shoreline logic.
Making the Water Wavy
A sailing game without waves wouldn’t feel right.
By adding a vertex displacement component to the water shader, I was able to form waves that move in the direction of the wind. Tying wave motion directly to the wind controller helped everything feel connected and consistent.
Temporary Terrain
With the sailing experience feeling solid, I added very basic terrain so there was something to explore.
I used Godot’s Terrain3D plugin, which made sculpting quick and intuitive. While it initially generated realistic terrain, I simplified the textures and settings to better match the game’s visual style.
I blocked out the main lakes, channels, and islands. This terrain is purely a proof of concept and will be heavily revised in the future.
Final Polish and Playtesting
The final step was polishing: tweaking boat speed, refining wind particles, and adjusting parameters until everything felt cohesive. At this point, it felt like all the pieces were finally coming together.
I then created a small scavenger hunt, exported the game, and let some friends play it. Seeing others interact with the game for the first time was incredibly rewarding — even if I had to reassure them that it wasn’t a virus after Windows Defender complained.
Conclusion and Next Steps
This is the current state of Sailswept.
I’m happy with how the sailing feels and with the overall aesthetic, though everything here is still preliminary and will continue to evolve.
Next up, I want to zoom out and focus on bigger picture decisions: defining the player character, exploring story elements, and adding sound effects — or even music.
I have more ideas than time, but I’m excited to keep pushing this project forward.
If you’d like to follow along, I’ll be posting more devlogs as development continues. And if you have thoughts or ideas, I’d love to hear them.
Thanks for reading — see you in the next update.