Course description

c++ game engine

This course is a gentle and comprehensive introduction to the fundamentals of 2D game engine architecture. We'll discuss several of the most popular programming patterns used in game development and try to put all the theory we learn into context by coding a small 2D game engine using modern C++, SDL, and Lua.

c++ ecs

We will write, together, a small ECS framework from scratch to manage our entities, components, and systems. We will discuss how engine programmers design their code and how we should think of organizing game objects in memory with performance in mind.

The tools you'll need

c++ game engine tools
  • C++ is a powerful compiled language
  • SDL2 is a library for cross-platform rendering and input
  • GLM is a math helper library
  • Dear ImGui is a library to create UI for engine tooling
  • Sol is a binding library for modern C++ & Lua
  • Lua is fast and easy to use scripting language

We'll try to write most of our engine code from scratch. All these libraries and tools are cross-platform, so you'll be able to code along with either Windows, macOS, or Linux!

c++ game engine platform

Is this course for you?

The target audience for this course are beginner programmers that wish to learn more about how C++ works in the context of game development. Therefore, students must already know how to code and be familiar with basic concepts of programming and logic. You should be able to write if-else statements, loops, functions, and classes using simple OOP.

You do not need to know C++ before enrolling; many successful students have a background in web, mobile, and game development, working with languages like Java, Python, Ruby, Go, Swift, JavaScript, Ada, Zig, Kotlin, and many others.

How is this course different?

This course is not just a simple tutorial on how to create a game with C++. This is the opportunity for you to think about the abstraction of what a "game" really is and all the pieces that need to interact to make them happen. More than that, this course allows you to write from scratch the code of a small C++ engine that can be used to create many types of games.

We will also touch other important topics like ECS, data-oriented design, STL containers, C++ templates, game loop, SDL rendering, event systems, asset management, memory management, and performance. And finally, we'll also learn how to embed the Lua language into our native C++ code to add scripting power to our engine.

lua game scriptingr

While there are other resources about game engine development out there, they are either too theoretical or overwhelmingly long. If you are looking for a gentle introduction to the world of game engine programming and want to learn how games really work under the hood, then you should definitely take this course!

About the instructor

gustavo pezzi

Gustavo Pezzi is a university lecturer in London, UK. He has won multiple education awards as a teacher and is also the founder of

Gustavo teaches fundamentals of computer science and mathematics; his academic path includes institutions such as Pittsburg State University, City University of London, and University of Oxford.

teaching certification
higher education academy
pgclt teaching certification
bpp university award

Course content

30 hours total length 27 Chapters Last updated January 2022
  • Motivations & Learning Outcomes
  • How to Take This Course
  • Project Technologies and Libraries
  • Configuring Linux Dependencies
  • Configuring macOS Dependencies
  • Compilation
  • Linking
  • Makefiles
  • Configuring Visual Studio on Windows
  • Quiz: Compilation and Linking
  • Static vs. Dynamic Libraries
  • Game Loop
  • Game Class
  • Creating an SDL Window
  • Polling SDL Events
  • Rendering the SDL Window
  • Fullscreen SDL Window
  • Fake Fullscreen vs. Real Fullscreen
  • SDL GPU Acceleration and VSync
  • Quiz: SDL Window
  • Drawing an SDL Rectangle
  • Double-Buffered Rendering
  • Loading PNG Textures
  • Quiz: Game Loop and SDL Window
  • Object Movement and Velocity Vectors
  • Fixed Game Framerate
  • SDL Delay
  • Variable Delta Time
  • Uncapped Framerate
  • Game Loop and Determinism
  • Quiz: Game Loop Timestep
  • Logger Class
  • Exercise: Logging Game Information
  • Coding the Logger Class
  • Popular C++ Logger Libraries
  • Quiz: Logger
  • Project Subfolders
  • Makefile Variables
  • Creating C++ Objects
  • Examples of C++ Object Creation
  • Organizing Game Objects
  • Object Inheritance Design
  • Quiz: C++ Objects
  • Component-Based Design
  • Entity-Component-System Design
  • ECS Folder Structure
  • System Component Signature
  • Working with C++ Templates
  • Component Type Template
  • Understanding Component<T>
  • Exercise: System Functions
  • Adding and Removing Entities from Systems
  • The Erase-Remove Idiom
  • Operator Overloading for Entities
  • Quiz: ECS Design
  • Pool of Components
  • The Pool Class
  • Coding the Pool Class
  • Registry Systems & Entity Signatures
  • Entity Creation
  • Adding Components
  • Removing Components
  • Implementing System Functions
  • Quiz: ECS Implementation
  • Creating our First Entity
  • Smart Pointers
  • Converting ECS Code to Use Smart Pointers
  • Raw Pointers for SDL
  • Quiz: Smart Pointers
  • Adding our First Component
  • Careful with Types size_t and int
  • Exercise: Entity Class Managing Components
  • Entity Class Managing Components
  • Warning About Cyclic Dependency
  • Movement System
  • Movement System and Delta Time
  • Render System
  • Managing Game Assets
  • The Asset Store
  • Displaying Textures in our Render System
  • Exercise: Displaying the Tilemap
  • Displaying the Tilemap
  • Rendering Order
  • Sorting Sprites by Z-Index
  • Animated Sprites
  • Animation System
  • Identifying Animations By Name
  • Entity Collision Check
  • Implementing the Collision System
  • Exercise: Rendering a Collider Rectangle
  • Quiz: 2D Collision
  • Killing Entities and Re-Using IDs
  • Implementing Entity Removal
  • Introduction to Event System
  • Event System Design Options
  • Event Handlers
  • Emitting Events & Subscribing to Events
  • Exercise: Key Pressed Event
  • Event System Design Patterns
  • Quiz: Event System
  • Keyboard Control System
  • Camera Follow System
  • Sprites with Fixed Position
  • Projectile Emitter Component
  • Projectile Duration
  • Health Component
  • Exercise: Shooting Projectiles
  • DRY Code
  • Tags & Groups
  • Optimizing Access of Tags & Groups
  • Projectiles Colliding with Player/li>
  • Projectiles Colliding with Enemies
  • Compilation Times
  • Data-Oriented Design
  • Cache Hits and Cache Misses
  • Avoiding Data Gaps
  • Packed Pool of Components
  • Array of Structs vs. Struct of Arrays
  • Cache Profiling with Valgrind
  • Popular C++ ECS Libraries
  • Adding Fonts to the Asset Store
  • Render Text System
  • Exercise: Rendering Health Value
  • Introduction to Dear ImGui
  • Dear ImGui and SDL
  • Dear ImGui Demo Window
  • Immediate-Mode GUI Paradigm
  • Render GUI System/li>
  • Button to Spawn Enemies
  • Exercise: Customization of New Enemies
  • Quiz: Dear ImGui
  • Killing Entities Outside Map Limits
  • Flipping Sprites on Collision
  • Invisible Entities & Obstacles
  • Exercise: Keeping the Player Inside the Map
  • Culling Sprites Outside Camera View
  • Game Scripting
  • The Lua Scripting Language
  • Using Sol as a C++ Lua Wrapper
  • Lua State
  • Reading Lua Tables
  • Fetching Missing Table Values with Sol
  • Lua Functions
  • Level Loader Class
  • Reading Assets from a Lua Table
  • Handling Multiple Objects in a Lua Level
  • Scripting for Night/Day Tilemap
  • Scripting Entity Behavior with Lua
  • Script System
  • Lua Bindings
  • Binding Multiple Lua Functions
  • Loading Different Lua Levels
  • Division of C++ and Lua Code
  • Quiz: Lua Scripting
  • Finishing our Code
  • Next Steps
  • Proposed Project: Tilemap Editor
  • Moving Forward
  • Copyright & Content Distribution

What students are saying

5 star
4 star
3 star
2 star
1 star
Lukas Biton
"Great course, full of applicable ideas!

Overall an amazing course. I highly recommend it. I like to code and debug along and this course was great.

- Environment set-up: So many courses or textbooks have hurdles around getting the environment set up properly, or decades-old dependencies not being available anymore. Gustavo does a great job there and over the whole course I don't think I was blocked more than 30 minutes. This might not sound like a big deal, but so often you sink a few hours into a course only to discover half-way through that you have to spend days trying to fix arcane issues with no documentation. None of that nonsense here.

- C++ content: Gustavo is an experienced C++ programmer and it shows. In this course you'll learn about templates, unique pointers, some classic C++ syntax (like avoiding for loops), and function callbacks. The syntax gets ugly, but Gustavo always makes it easy. In terms of prior experience, before this course I had followed Bjarne Stroustrup's Programming Principles book, and before that I have been programming in Python professionally for a few years. I think this course goes a bit fast if you're still learning the basic C++ syntax, but for me it worked great as a "first big project". It was especially helpful for all the industry wisdom Gustavo imparts throughout the course.

- Lua content: Mixing a scripting language with a compiled language is something I knew nothing about before this. Betweem C++, Lua, and the imgui library, I feel like I didn't just learn game design, but a lot of very useful skills for making simple applications in C++. In terms of prior experience, coming from Python Lua felt very familiar.

- ECS and game design patterns: I think because of C++'s syntax quirks, some of the ECS design gets hidden behind difficult to read boilerplate code. That being said, Gustavo does a great job of focusing your attention on the big picture and what really matters. I don't know of another course that teaches the concept so well. To be honest, by the end of the course I felt comfortable enough with C++ and the code base to watch the videos on higher speed.

- Instructor: Gustavo is likable and his personality shines through the whole course. He loves to teach and he empathizes with the students' issues a lot. Often I would think "oh that looks difficult" only for Gustavo to say that just a few seconds later and to focus precisely on the difficult part."
31 May 2023
Alexander Kolesnikov
Alexander Kolesnikov
18 Apr 2023
Julio Angulo
Julio Angulo
"Nice introduction to video game dev! This a great course that teaches game development from scratch. It helps to understand the inner of the game engine.

So this is a course for you if you want any of the following:
- You want to understand how works the game engines.
- You want to learn how to develop video games and have curiosity about how they are done in low-level detail.
- You want to practice C++ focusing on game dev and/or graphics.

This might not be a course for you if:
- You only want to create video games and get the stuff done without worrying about low-level details.
- You already have lots of experience in C++ and videogame development."
13 Apr 2023
Avan Johnson
Avan Johnson
"good but hard"
03 Apr 2023
Carlos Alfredo Castillo
Carlos Alfredo Castillo
"This course is amazing!

I recommend this course to anyone looking to start learning about game development in C++, and the details behind a simple 2D game engine, also the integration of all the different libraries necessary to give a real functionality to your game engine and final game.

I have learnt more with this course about game engines, game programming, modern C++ programming, scripting integration, some design patterns related to game development, than any other course out there. The most important thing is that you find it all in one place, no need to be jumping from book to book or from one website to the other gathering information. You have it all in this course.

More importantly, Gustavo is a great teacher, and his explanations are very clear. 100% recommended!"
31 Mar 2023

Other similar courses

3D Computer Graphics Programming

35 hours
  • Create a 3D software renderer from scratch using the C programming language.
raycasting texture c

Raycasting Engine Programming with C

18 hours
  • Write a raycasting engine with textures and sprites using the C programming language.

Game Physics Engine Programming

35 hours
  • Learn how to create a 2D rigid-body game physics engine from scratch with C++.