Hey guys. I’ve compiled a list of general advice for getting started on game programming. This should be especially useful if you’re about to enter a junior role or go into education. Let me know what you think in the comments below, I’m happy to answer any questions and I’m happy to listen to your perspectives.
P.S: Everything I say here is my own opinion. This article ended up being far longer than I thought it would be.
You as a person, working in a team
This is something that doesn’t apply to everyone, but particularly may apply to younger people coming from a school environment into a work or further-education environment (such as college or university).
You need to be patient with yourself, because programming takes time.
Games development is often glamorized outside of the field. People have an idea in their head that it means relaxing at a desk, drinking caffeine, playing games like you’re a bad stock photo and typing magical words that make things happen. It is for this reason that people I know tell others they work in ‘creative software’, as opposed to games development.
Programming, at times, can really appear to be something magical.. but programming is just rules and logic. Syntax is different, that’s something that takes time to learn, but as long as you begin to understand the basics behind a programming language you can more or less apply it anywhere else, depending on the language.
All of this is not something that will come to you immediately. Programming is hard. It’s a life skill. Sometimes you’ll feel like you have a great grasp of it, then read a book about the language or read an article and understand that you don’t know as much as you thought. That’s okay. It’s just time and practice that are needed. I often hear horror stories of people who are content to sit through their degrees, do the absolute bare minimum, who don’t program in their own time, read books, game jam or work on projects. In programming, you literally learn by failing over and over until you figure out the right way to do it. There is no shame in googling the solution, (unless it’s coursework and you’re cheating) but you also need to understand it. Copying and pasting code from stackoverflow or a YouTube tutorial will not make you understand it. You need to write it by hand, go through it, ensure that you know what each line is doing.
Be understanding of others you work with and be humble
Again, this doesn’t apply to everyone but it’s something that’s generally important. In your career you’ll likely work with lots of different people with lots of different backgrounds. Not everyone learns the same way. Not everyone will learn at the same speed. Not everyone has the same level of comprehension. This is not a problem that getting angry or annoyed at will solve. Take time to help them out if they need it and mind their space if they don’t want help. On the opposite side of this, if you need help, don’t be too stubborn to ask someone around you. Most of the time just talking about the problem with someone else will lead you to solve it. Check out the ‘rubber duck’ method.
The being humble element to this is also important. You might have a solution to the problem, but that’s not always the best solution (it’s certainly not always the only solution). Listen to others, explain your case, explain your ideas, take everything into consideration. Otherwise people may start to dislike you, as a person and a leader.
Look after yourself
Seriously. I can’t shout this loud enough. You only have one body, it’s important to take breaks, to stretch your legs, to free your mind from programming when you rest. A lot of programmers I know stay up until 2 or 3 in the morning programming, then go to bed and find themselves unable to rest or they find that their sleep is haunted with dreams of bit shifting and “why didn’t that work?”. It’s important to turn off. Overdoing it is understandable when you have immediate deadlines, but a lot of the time you’ll solve a problem in half an hour by taking a break from the screen and thinking it through, rather than two hours of staring at the screen and getting frustrated.
It’s also very important that you look after yourself mentally as well as physically. Working at computer all day can take its mental toll on you. It’s important to make sure that you’re able to step away when you need to.
Lastly, I recommend downloading flux. Blue light stimulation is super bad for you. Make sure your room is lit properly. This is coming from someone who used to be a chronic insomniac. No, this post isn’t sponsored.
Find motivation, learn to give and take feedback
I see this kind of thing a lot. I had (and occasionally still have) issues with the motivation needed to work on or complete a project. This is some basic life advice, get off YouTube/Netflix/Facebook/Dark Souls and spend one to two hours a day, in the morning, afternoon, over lunch, working on your project. Motivated or not, push yourself into doing it. If you sit around waiting to be in the zone, progress will be very slow.. which will likely demotivate you even more. It’s about discipline as well as motivation.
Giving and taking feedback is important. Learn to be critical in the right way. Constructive criticism is important. Saying, “dude this game fucking sucks” isn’t going to help anyone. Learn to give feedback in a constructive manner: for example “I think this game needs a lot of improvements if you’re going to sell it. First you could do X and then Y”.
It’s also important to learn to take feedback in the right way. It isn’t uncommon for people to be defensive of their hard work in the feedback stages, (which is completely normal), but in this industry you will be criticized by your peers and your community frequently. The sooner you can learn to deal with it and use it as a way to improve yourself and your product – the better for you and your consumers.
Learning to program, picking an engine/framework to use
Picking an engine/framework
Before I go into the list, I’ll tell you what these terms mean.
Engine: An engine has almost everything you need to make games out of the box. It’ll come with a front-end editor, systems for collision, animation, physics and a scripting system of some sort. This is what you need to get started.
Framework: A framework is usually more bare bones then that. Commonly (but not always) a framework will come with no editor, some basic helpers for drawing, no scripting system, etc. Frameworks are really more for people who want to control of how the entire game works. It’s not uncommon for people to build an ‘engine layer‘ in a framework, which is an extension onto the base framework that they use to build games.
There is a range of options for you here, so let’s quickly outline the most popular and commonly used ones.
- Unity3D (Engine), probably the most popular game engine in the world. I’ve worked in this for nearly five years. I like it for 3D games, I’m not huge on it for 2D games, but it has a huge community (which makes it easy to learn, as there are many tutorials, available assets on their asset store, etc) and it’s well known. Popular games such as Hearthstone, Rimworld (although that has a custom architecture) and Enter the Gungeon use Unity3D. Using Unity, you’ll likely be programming in C#, which is a popular programming language that is used in the games and software industry frequently.
- Godot (Engine), this is one that I’m not really familiar with. I’ve not made a game with Godot yet, but it is becoming popular fast and a lot of people have good things to say about it. Godot has its own scripting language that was made specifically for their engine. It seems similar to python. There are lots of tutorials and resources (more everyday) to help learn Godot. It has an editor, it’s programmer friendly and its executables are tiny. The engine itself is also tiny, and can be downloaded through Steam.
- Unreal Engine 4 (Engine), another very popular engine. Great for making 3D games. Coded in C++, but it has blueprints which is a visual coding system that designers and programmers alike can use. UE4 has a learning curve, it’s probably the most complex engine I’ve ever used, but it’s also incredibly feature-rich. Honestly, I don’t think UE4 is a great place to start, but it is definitely on the study path for anyone who wants to program games professionally, or use C++. Popular games include Fortnite, Player Unknowns Battlegrounds and a plethora of AAA games.
- GameMaker (Engine), I’m just quickly doing a shout-out for GameMaker. For making 2d games it’s a pretty great tool, with a native scripting system, front-end editor, big community, tons of tutorials and assets. I’ve not had much of an opportunity to use it extensively, so I can’t say much more than that – but there are plenty of popular games made in it, such as Undertale, Nuclear Throne, Hyper Light Drifter and more.
- MonoGame (Framework), this is a popular open source framework which was modelled after XNA, a Microsoft framework for making games on PC/XBOX that was abandoned in 2010. Personally, I have a soft spot for MonoGame as I have made a lot of games with it in class and in my own time. It’s easy to learn, it’s friendly and it uses C# which is a great language. It deploys to almost all platforms and has an active userbase on their GitHub and forums. Popular games made with MonoGame/XNA include Braid, Stardew Valley, Magicka and Owlboy. However, unlike Unity it doesn’t have an editor – which means everything is done inside of code.
- LibGDX (Framework), this is a very well written framework for making games in Java. It has a mid-size community, lots of people praise it, it deploys to lots of different platforms, and the owner and community are both very active in improving it. There are many popular extensions for it as well, including Ashley which is a well written entity-component-system. Great for anyone with experience in Java. Popular games made in LibGDX include Five Nights at Freddy. You can check out the gallery on their website for more.
- SFML (Framework), I have a soft spot for SFML. A 2d framework that provides common utilities such as loading textures, playing sounds, sprites, etc but leaves the majority of the control of the game to the programmer. It’s a C++ framework, although it has bindings to almost every other popular language (including C#), so you can use those too. SFML also provides native control for handling OpenGL, and those of us with graphics programming experience appreciate that.
If you’re looking to make a game and you’re getting started, I’d recommend using an Engine. If you’re familiar with the concepts of an engine, and you’re looking to learn more in-depth areas of programming then I’d say use a Framework. Personally I’m more of a framework guy, but that’s because I like making my life difficult and I love the low-level control of the game.
Making a game vs making an engine
This is a trap that I myself have fallen into, multiple times, and I expect that everyone in their programming career will fall into at least a few times. It’s called “Scope creep”. Here is an example of scope creep:
- You want to make a 2D game with a team of people.
- The designers and artists of the team have no knowledge of C++ or whatever language you’re using.
- The programmers agree to build a simple editor inside of the framework, so the artists and designers can edit the game without them.
- The programmers build a simple editor to use.
- The editor needs more features.
- The programmers need to refactor the entire editor to introduce new features.
- Six months pass, you’ve written five thousand lines of code, refactored ten times that and you have no game to show for it. You have a cool editor with buttons that do stuff though.
- The universe explodes.
There are many things you can do to avoid this. The obvious solution is to make sure someone is keeping a tight lid on the scope creep, such as a project manager or lead programmer. Use an engine rather than a framework. Etc.
The point behind this is that it’s easy to get lost. It’s easy to think, ‘what if…’ and suddenly you’ve gone from a 2D topdown tower defence game to making a prototype of Dota 2.
To be honest, I think it’s probably useful to fall into a huge scope creep once, because then you’ll recognise the signs of it for the next time the same thing begins to happen.
That being said, there’s nothing wrong with making an engine. It’s a great learning experience, but if you’re intending to do that, make sure you’re setting out to make an engine and not make a game.
Education & portfolio
Thinking about University?
A lot of people will often post asking about their University options, unsure what would be best to do. A lot of time the response is “Study Computer Science, make games in your own time” – and I don’t disagree with that. It’s an option for sure. However, it’s also not a bad thing to do a games development course either, at least here at Abertay University. As an example, we’ll go over the modules that we are currently studying at the time of writing this post.
- Data Structures 1 – Everything from iterators, to hash maps, linked lists to memory and cpu architecture.
- Maths for Application Development – Linear algebra, Raycasting, Physics and more.
- Graphics Programming – OpenGL API, making 3D scenes in pure OpenGL, learning to import .obj files, shaders, etc.
Next semester we have:
- Data Structures 2 – more data structures, C++, etc.
- Game Programming and System Architecture – making a game on a PS Vita using a tutor’s custom framework.
All of this is stuff that can be applied to general computing, as well as games. Comp Sci would give you the advantage of your skills applying to multiple fields of computing, so it’s certainly something to consider before you apply. There’s no point in rushing such a decision, and you can always look into switching courses if it’s not for you.
Get started as soon as you can & find the best way for you to learn
Before you go into higher education, I’d recommend learning to program in your own time. University won’t teach you everything you need to know. It’ll give you a set of building blocks with some basic instructions and expect you to do the rest. If you want to be hired after University, you need to have a reason that you should be the one hired over other graduates. The games industry is a very competitive place to be.
On another note, everyone learns in a different way. Some people may learn the theory best by listening to lectures, some in the labs, some by messing about in code itself and some by just following YouTube or text tutorials. It can be particularly challenging for people who have a learning disability or concentration span issues. Find what works best for you, then use that method to your advantage.
Get into maths
I can’t shout this loud enough either. I struggled a lot with maths in school, not because of the teaching but because I had issues with sleep, which lead to an inability to concentrate in class long enough to learn anything. Despite not really being my own fault, this really stung me in the long run. Regardless of who you are or what area of programming you want to be in, start learning the areas of maths that are relevant to programming. Maths, like programming, is something that takes time and practice.
There is an excellent course on Khan Academy for Linear Algebra and Physics. I would suggest that you start there: it’s free, well documented, clearly explained – and there is support in the comments section if you have particular trouble with a concept. There are also many tutorials and relevant YouTube videos on many of these concepts. Depending on who you are, maths might make more sense to you in code than on paper. There is no shame in that.
Learn source control as soon as you can, seriously
Source control helps you version your code. It’ll save you an inevitable catastrophe of “my hard drive failed” or “I lost my usb stick”. Unfortunately, it will also rob you of the excuse of “my hard drive failed” and “I lost my usb stick” when you forget to turn assignments in on time.
Check out GitHub and BitBucket. These are two of the sites that I use for handling my source control. GitHub also has a great deal for students.
As for client side tools, I’d suggest starting with a simple program such as SourceTree for handling the versioning between your pc and GitHub/BitBucket.
Learn tagging, branching, merging, conflict-resolution between merging and look up other git related tutorials, as there are many. Maybe, later on, consider learning the git command line, if you’re interested.
Learn Linux as well
Seriously, no matter what area of programming you’re in, learn the command line and mess about with your distro a bit. Linux is used widely in games development, primarily in networking, but I started learning it three years into my education and god I wish I’d started sooner.
A list of suggested things to program
I’m now going to give you a list of things that you could program. These all have varying difficulty.
- Simple 2D games
- (Easy) Brickbreaker Clone
- (Easy) Snake Clone
- (Easy) Space Invaders Clone
- (Medium) Simple platformer where…
- Implement simple loading screen, new game button (basic ui)
- You can jump between platforms (basic physics)
- Implement basic enemy, basic agent behavior such as see-and-chase (basic ai)
- Implement other enemy types with unique behaviors like chase-and-explode
- Implement moving platforms
- Implement traps that the player must dodge
- Introduce moving traps
- Introduce a new level
- Boss battle (if you’re feeling up to it)
- End game condition & end screen
- (Complex) Tower defence game where…
- Implement simple loading screen, new game button, settings button
- Implement a 2d-grid-structure for handling tiles
- Load tile map from a file at runtime (basic IO)
- Make a ui for the player to add structures into tile slots (more complex UI)
- Implement a ‘base’ that the player must place to start the game.
- Implement an A* algorithm to allow agents to move from A to B
- Implement a basic grunt that…
- Uses A* to calculate the position of the nearest player tower
- Moves down the calculated A* path towards the tower
- Stops one tile away and attacks the tower every second until killed
- Implement a timer where the player has 90 seconds to build all the towers and structures
- At the end of the timer, spawn X number of grunts to come and attack random towers
- Implement two or three new types of enemies, such as a tank and support.
- Give them different behaviours. e.g. leaving towers, rushing the base.
- Implement new towers that the player can build to scale against the new enemies.
- At the end of the timer, generate X number of different enemy types.
- Make a ui for the player to upgrade towers with perks such as range, more hp, etc. (more complex UI)
- Implement a resource system, such as metal/coal/gold.
- Implement a resource gathering system, such as friendly worker units that take player commands
- Create a difficulty graph that scales against the player (more enemies, harder enemy types, etc)
- Create other buildings that could benefit the player, such as resource depos
- Implement a lose condition, game over screen for when the players base dies
- The universe explodes. Welcome to scope creep.
- Some 3D projects
- Implement a movable character that can go and interact with primitive shapes.
- Implement some basic trigger events (player walked into cube A, lights turn off, etc)
- Implement some basic 3D physics such as barrels falling over when the player walks into them
- Make a small clone of a game that you enjoy. Doesn’t have to be anything complex, could just be a single component of that game.
- Begin learning OpenGL if you have an interest in graphics programming.
- Architecture / software design
- Observer pattern
- State machine
- Client-server pattern
- Event system (including an event queue)
- Data Structures
- Hash Map / Dictionary
- A* Pathfinding
- Learn about sockets
- Simple peer-to-peer football game over a local UDP connection.
- Learn about peer-to-peer.
- Learn about UDP connections.
- Learn about interpolation.
- Simple server-client card game clone over a local TCP connection.
- Doesn’t have to be complicated. Request-Response pattern works well here.
- Learn about client-server architecture.
- Learn about TCP connections.
- Rent a free Amazon AWS server or a low-rent CloudOcean server and connect a client to the rented server.
- Make something simple with it, such as the card game.
- Figure out why it is that networking programmers are so in demand.
- Draw a cube in OpenGL
- Make each side of the cube a different colour
- Rotate the cube by delta time
- Generate a plane out of quads or tris
- Make a plane out of many quads or triangles.
- Write a .obj importer
- Import a obj file
- Draw the imported mesh
- Get materials working
- Ambient, diffuse, specular colors
- Texture material (with .obj uv coords)
- Build a hierarchical scene node graph to handle all your objects
- Draw a cube in OpenGL
- Basic engine components
- Game Loop
- I’m so sorry.
- Rendering System
- Physics System
- Animation System
- Scene Graph
- Hierarchical scene graph for handling parent-child transformations
- Actor/Entity/GameObject Architecture, such as…
- Inheritance architecture
- Entity-Component architecture
- Node architecture
- Scripting language implementation
- Control entities, logic, view through scripts.
- Learn the purpose of a scripting language.
- IO Handling
- Basic editor architecture
- Custom scenes
- Placing pre-made entities
- Setting variables inside of the entities
- Moving entities in the scene
- Specifying logic & view scripts
Suggested books and learning material
Again, this is material that I have found particularly useful. It might be less so for you, so do some research on the books before you buy.
- Game Programming Patterns by Robert Nystrom. Free online, paid if you want it in physical edition or kindle. I bought a copy for myself and as a present for a friend. It outlines some design patterns that help you write smarter designed code.
- Game Coding Complete by Mike McShaffry and David Graham. I really liked this book, so much so that I’ve been through it more than a few times. It inspired me a lot for varying ideas of my games architecture. Also introduced me to Lua programming.
- Professional C++ by Marc Gregoire. As I was coming from an already experienced background in C#, I just wanted a book to introduce me to the concepts behind C++. I found this book informative and occasionally go back to it for reference. Although it is not really for people new to programming.
- Game Engine Architecture by Jason Gregory. I’ve not had as much time as I’d have liked with this book, but the time I have spent I’ve found it well written, consice and informative. Jason himself is a lead programmer at Naughty Dog. The book goes over the concepts behind a game engine and is mandatory, I would say, for anyone interested in engine development.
- Red Blob Games. A series of articles that I was introduced to in college and material that I often go back to reference. Code examples, pictures, animations, interactive demos – redblob do a great job at helping you understand algorithms such as A*.
- Khan Academy. I mentioned before. Great place to learn maths, physics and more. (It’s free too!)
- /r/gamedev: A great series of articles, questions and answers to bookmark and then forget to view when you need them.
- gamedev.net: Another great series of articles, questions and answers to bookmark and forget about when you need them.
I’ll add more to these lists as they occur to me.
I can’t write much here. I am currently studying and I don’t have too much experience in the games industry, only a year of working as the sole programmer on a mobile game.
What I can tell you is the advice that I’ve received from my tutors, from professionals in the industry and talks that I’ve attended. Here we go:
- It’s a huge advantage to know C++ well. When Nvidia came to talk at our University about graphics programming and the work that they do, they pointed out that they receive a lot of applications from people who know Unity3D but have no real experience with C++. While this is a cherry picked example, it is true that the large majority of games companies ask for C++ in-depth knowledge on their postings. Anyone who tells you that the language is dead and that it’s not necessary to know to work within the industry is likely wrong, depending on where you want to be and what you want to do. A lot of companies also use in-house engines and I don’t think that will change anytime soon.
- Networking is a huge benefit. The games industry is a social place, meeting people at conventions and talking with them could land you opportunities that may not be available otherwise.
- You need to have a portfolio. You need to game jam. Make games in your spare time, work on projects, learn from others… otherwise there’s no reason to hire you over the competition. Harsh, but true.
- Get work experience if you can. A shipped game is a huge benefit to your portfolio and your future employment opportunities.
- Something employers will look at: not just your ability to program, but your ability to fit in and work with the team.
- There are plenty of recruitment companies around the UK that can help you find your first job. I’ve worked with two of them, and although I decided to continue my education, they were incredibly helpful and landed me a few interesting interviews.
Some general tips
- Development of a project will take twice as long as you think it will at the start.
- Sacrifices have to be made. Time is money, friend.
- The most difficult part of development is the last 10%.
- Companies aren’t just interested in what you’ve programmed, but what you’ve iterated on. How have you improved your projects?
- Get feedback from your friends, colleagues, partner… It’s hard to see the game objectively when you’re the one creating it.
- Game development is a business. Businesses exist to make money and pay their employees. Something people occasionally forget.
- There isn’t as much support for mental health in this industry as there could be. Saying that, I hear it mostly depends where you work, but takes me back to a key point: seriously look after yourself properly, mentally and physically.
Thanks for reading and best of luck with your future careers!