An idea I've had for a long time is making a video game. I feel like it's a wonderful medium for telling stories- how much more immersive can a story get, you know? And as a story teller and artist, I figured it was time to try it out.
As I daydreamed and sketched environments for a potential horror game, I consistently found myself imagining these tight, uncomfortable 1 point perspective scenes, and wondered how I could fiddle with the camera to get some really unique gameplay and visuals.
It wasn't until I saw this video of someone hand drawing 2D sprites for their remake of Zelda that I got a real vision of how such a thing could actually look. I got inspired thinking of this as more of an art project than purely a game- a way to ease into game development doing something I'm familiar with.
I did think about learning blender, changing the art style to be more simple, anything to avoid having to use my brain on coding this. It would be easier to just make a model and adjust the camera to get all of these weird angles right? That way I could avoid the work of having to draw everything by hand..! But no, I decided there's no way I could realistically learn blender by myself over the summer, and enjoy it enough to get good at it the way I'm good at 2D art, so I decided to stick with the idea of a 2D game. I'm still undecided on just how detailed or stylized the art style will be, but I knew that I wanted the art style of the game to feel like me, like it was something only I could create, so 2D was the way to go.
I started by trying to think of how to get realistic movement in a forced perspective.
First I made the character get bigger as it came closer to the "camera". Unlike isometric perspective, or top down or side scroller, a 1 point perspective pushes the perspective. This meant that things closer the vanishing point would be smaller, and things farther away- aka closer to your view point- would be bigger.
I achieved this by aligning my background's horizon with the x axis, so the "highest" point the character could be is y=0. As the character moves downward on the screen, aka the y-value grows, increase the scale accordingly.
![]() | |
|
I tried a million different ways of making the character follow these lines of perspective. I didn't want to hand calculate how the character would walk given the exact coordinates and edges and corners and lines of perspective of my exact image- I wanted to be able to apply this logic to many different scenes and different view points and vanishing points.
First I tried using a Line2D node to illustrate a single line of perspective, and set the initial point to the vanishing point and the the 2nd point to where the line meets the screen. I tried calculating an "offset" by hand that basically scooches the character to the left as it moved downward, but this only worked for one line of perspective and not for if the character was far to the left or right of the Line2D.
I tried using a PathFollow2D and a Path2D node, thinking I could have the character follow the path along the y direction, but shift the 2nd point- the one that meets the bottom of the screen- to the left or right as the character moves to the left or right. This probably could have worked, but I got frustrated trying to learn how to use the PathFollow2D node and gave up, lol.
A problem I sometimes have with Godot is there is a simple solution, and I could probably implement it by just looking up a tutorial. But then when I implement it and it breaks, how to fix it? It's not enough for there to be a cheap and easy solution to a problem if you don't understand the how and why the solution works. A challenge I am very aware of is the learning curve of learning a new program. So I have to do things within reason, not solely relying on tutorials online but using my own knowledge and actually learning the functions and tools available to me using the docs.
Finally I reread the vector math section of the Godot Docs, and using that I figured out how to get a really convincing character movement. The character uses vectors to move towards the vanishing point when hitting the up key and moving the opposite direction when hitting the down key. Yep, it was really that simple. It may have taken me too much trial and error, but I feel like I learned a lot about different functions of Godot, and I really like how simple my final design is. And I can feel proud too, because I thought of it myself instead of using a tutorial. Yay!
Next, I adjusted my original scale function to actually use the 2nd point on the line, so that as the character got closer to the y-value of p1, then the scale would increase. This is the exact same logic as before, but using the Line2D node made it so I could easily adjust the vanishing point and the value given as the bottom of the screen. I also made export variables so I can control the scale manually as well, for example a more foreshortened scene would have a more extreme minimum and maximum scale values. In the future, I'd like to calculate this given the line length, but this works well for now.
![]() |
| Hitting the up and down arrows triggers a diagonal movement across screen. |
As I draw more art and perspectives, I am thinking about how I will have to cut the scenes up to get the character going in front of and behind things. For example, they may be able to walk in front of and behind a wall or table. I will have to make a separate asset for that object to be able to check when which should be rendered on top.
My next steps are drawing my own assets, including background and character animations, adding more functionality like interacting with elements, and designing a UI. In the future I will add things like monsters and cut scenes, but for now, I'm just happy to have figured out how to make the character walk.
Thank you for reading!
- Miz
Temporary Game Assets used:
GIFs made using LICEcap

