Self-imposed constraints in Godot

One of the main reasons I chose Pixel Vision 8 for the Snow Game is the purposeful limitations that came with it, like the resolution, color palette, and tile sizes. Having constraints like these does help in coming up with small-scoped ideas, but because PV8 isn’t a full-blown engine, like Unity or Godot, you do have to deal with some repetitive boilerplate code. Although you can make yourself a library of things that you often find yourself coding over and over again, sometimes it’s nice to have the features that a complete game engine offers. This got me thinking, what if I simply give myself these fantasy console-like limits in a game engine?

I have the most experience with Godot, and I really like its flexibility, so I’m going with that engine. When making a new Godot project, you can change the project settings for various things such as rendering, memory, and physics. Although there is the option of going through every setting possible to closely simulate some imaginary 8-bit hardware, I’m mainly focusing on the settings that I’ve worked with the most.

Resolution

The resolution is very easy to change in Godot. You can change the size under Display -> Window in the project settings. By making the resolution small, you’re also indirectly affecting how the art should be in order to fit the resolution. You might want to stick to 8×8 or 16×16 sprites/tiles, for example, if choosing a small resolution.

One specific thing to keep in mind is making sure the aspect ratio stays the same when the window resizes. Otherwise you’ll sometimes have very blurry stretched-out pixels.

Color Palette

On the art side of things, while you can simply limit yourself to a color palette whenever you make any sprites, it’s a good thing to keep in mind the various different ways that Godot can affect the color of an object. For example, any CanvasItem node, like a Sprite, has a “Modulate” and “Self Modulate” property, which is a way of applying a tint to the canvas. While this is a pretty nice feature, it’s easy for me to forget that the resulting colors probably won’t be part of the color palette for this project.

There are various other things in Godot that may accidentally create colors outside of your chosen color palette. When importing sprites, you’ll have to turn off flags that might blur the pixels. Some UI nodes, like buttons for example, have several different settings that visually affect the node, like shadows, anti-aliasing, on-hover effects, etc. Knowing where in your project there may be colors outside of your palette is a bit tedious to figure out, but becomes easier with more experience. I still don’t know all the nodes that exist in Godot, and I’m still learning about new ways of using the nodes I already know of.

Physics

This is more Godot-specific, but while Godot has its own physics system with RigidBody2D nodes, I often avoid using them because sometimes I’d rather have more control over the movement of objects and how the player interacts with them, so KinematicBody2D nodes and StaticBody2D nodes are enough most of the time. There’s also the small issue of rotation, where the pixels of a sprite may look jagged or rough when rotated, although you can easily disable rotation by changing a RigidBody2D’s mode to “Character”.

Input/Controls

The Input Map tab in Project Settings allows you to create any input mapping you want. While this is really good for things like rebindable keys and complex controls, it’s sometimes helpful to just limit yourself to less. PICO-8 has only the arrow keys and 2 buttons for input, and Pixel Vision 8 offers its own “controller” settings for input too.

Controller configuration in Pixel Vision 8

I like to think of the controls as being limited to a joystick (4-directional) + 2 buttons. That tends to be enough for many of my game projects.

While there are tons of other things to keep track of in Godot, the limits I mentioned here are good enough for me to narrow down game ideas and mechanic into a small scope.

Leave a Reply

Your email address will not be published. Required fields are marked *