Computer Game Programming (Fall, 2026)
TR 14:00-15:50 in Wean Hall 6403.
Taught by Jim McCann (Office Hours after class Thursdays in Wean 1334 or by appointment.)
With TA help from Johnny Zhang (Office Hours TBD.)
Course Goals
Computer Game Programming will help you build the programming skills needed to turn ideas into games. This means we'll be covering both runtime systems and the asset pipelines to fuel them, along with some game-design exercises (with an eye to thrifty code).
The philosophy of this course is to learn by building games, from (nearly) the ground up — this means lots of C++ and OpenGL hacking, a smattering of scripting (shell, python, javascript), and a lot of documentation-reading. You do not need to be an expert in any of these things, but it would help if you are familiar with C++ and the modern OpenGL (3.3+) API.
Previous years with similar content: Game Programming '25, Game Programming '24, Game Programming '23, Game Programming '22, Game Programming '21, Game Programming '20, Game Programming '19, Game Programming '18, Game Programming '17, Game Programming '09.
Work
Students will be graded out of 20 + 3N + 6 points, divided as follows:
| Points | Work |
|---|---|
| 6 | Class Participation |
| 3N | Small Games |
| 20 | Final Game |
You will often be reading lesson materials asynchronously, then discussing the material in class; your class participation score will be based on your contributions to these discussions. Small games will be assigned roughly weekly to highlight basic game-related functions. The Final Game will be a larger undertaking by groups of 3-4.
There are no late days; however, if your lowest small game score is less than 3, it will be replaced by a 3 when computing your grade.
Life Advice
Being sick isn't fun. University health services often has flu vaccine available starting in September. Anti-SARS-CoV-2 measures may also work well against influenza.
Mental health is an important aspect of physical health. CMU's CaPS services exist to help you manage your mental state.
If you have a disability and are registered with the Office of Disability Resources, I encourage you to use their online system to notify me of your accommodations and discuss your needs with me as early in the semester as possible. I will work with you to ensure that accommodations are provided as appropriate. If you suspect that you may have a disability and would benefit from accommodations but are not yet registered with the Office of Disability Resources, I encourage you to contact them at access@andrew.cmu.edu.
Don't Steal
Using other people's code or data without giving credit is plagiarism. Plagiarism is an immoral activity that I take very seriously. If you plagiarize, you will fail the class, and I will do my best to make sure you are removed from CMU entirely.
All you need to do to avoid plagiarism is to make sure to give credit for the code and data you use in you project.
Something as simple as the comment "//based on https://wiki.libsdl.org/SDL_CreateWindow" can save your academic career from ruin.
Additionally, most human-created works are covered by copyright and thus subject to some sort of license agreement. Make sure that code and data you use has a license agreement compatible with this course. For example, I am unwilling to pay for a license for a library so I can compile your code, or sign a non-disclosure agreement so I can read it.
Do not use "AI" systems in this class. Don't "brainstorm with a chatbot," ignore "AI summaries" in search results and elsewhere, and consider even turning off autocomplete. These systems regurgitate amalgams of others' work; and are based on work not licensed explicitly for "AI training". The output is, thus, in my view, both plagiarised and the result of copyright violation; and, therefore, entirely unsuitable for use in the context of this class. Also, using "AI" tools stops you from using (and developing) your abilities to think, code, and make art.
It is, of course totally fine to create your own AI systems in the classic sense -- building rules to drive NPCs in your games.
Finally, there are two course rules which restrict your use of others' creations beyond the basic requirements of ethics and legality:
- Avoid code from previous iterations of this course. There is a lot of it out there, but just don't look at it. You will learn less.
- Follow any game-specific rules. (E.g., some games require you to author all assets yourself so you understand the tools.)
Work Together
This is a course that involves writing a lot of code. Please, by all means, work together!
- For all assignments, feel free to share code, as long as you understand the code you use, have permission to use the code, and give credit. (You still need to make different games than each-other.)
- For game4-game6, you can work in a group (of up to 3 people) and turn in a single game. I will expect more of a group than an individual (approximately, one "extra, fancy thing" in the game per extra person), and I will need to interview your group to ensure your contribution was equitable. Also, please don't work with the same people all the time.
Resources
The course does not have a textbook. However, there are several documents available on the internet that you may find useful:
- The OpenGL Specifications (of particular interest: OpenGL 3.3 and GLSL 3.30)
- docs.GL: (unofficial) man pages for OpenGL functions (the official version has worse typesetting).
- SDL Documentation
- cppreference.com the slightly-better documentation wiki for modern C++
- Advances In Real-Time Rendering SIGGRAPH course notes covering advanced rendering techniques being used in games
- Blender API Documentation, useful when writing or modifying export scripts.
There are also some great, cross-platform content-creation tools that we will use in our asset pipelines:
- GIMP is a 2D raster graphics editor
- Inkscape is a 2D vector graphics editor
- Blender is a 3D modelling, animation, and rendering suite
- Audacity is a decent free sound editor
- BeepBox is an easy-to-use music creation webapp
- JFXR is a sound-effects synthesizer in a web page
And some places to get free game assets:
- Kenney.nl has 2D and 3D assets, creative-commons licensed
- Poly Haven has a great collection of free HDR images (for image-based lighting), PBR textures (for fancy materials), and 3D models
- FreePD free, public domain music
- Incompetech royalty-free (but make sure you credit the author) music
- freesound various CC-licensed sound effects
- gameaudiogdc large pack of royalty-free game sound effects
- Google Fonts a trusted repository of fonts, many of which are licensed for general use (read the licenses, though!).
Schedule
Schedule subject to change.
Due dates "before class" unless noted otherwise.
- Course intro
- Timing + Main Loop
- Compile basecode, start game1
- C++ warm-up (stupid code)
- Asset Pipelines (pt 1)
- PPU466 sprite pipeline
- Asset Pipelines (pt 2)
- Meshes
- From Blender to your game.
- Scene Graphs
- Game1 Showcase
- Aside: Benchmarking
- Scene efficiency.
- Materials
- Before class: finish Learning Synths
- Design a sound
- Design a sound API
- Before class: finish Learning Music
- Music Theory by and for beginners
- Game2 Showcase
- Dialog and choice pipelines
- At 3:20 we will head to GHC4401 for the CMGC talk.
- Game3 Showcase
- Text + Fonts
- Font and text layout pipelines
- Networking
- sockets warm-up
- Game4 Showcase
- HTTP
- Collision
- Choose a collision check
- Game5 Showcase
- Participate in the Ludum Dare #60 game jam (date TBD) get +1pt extra credit.
- Show Ludum Dare Games
- final game idea generation
- Game6 Showcase
- Theme selection
- Set up group infrastructure
- Write planning docs
- The ECS Paradigm
- Team check-ins
- Prototype work time
- Framebuffers
- Linear Blend Skinning Example Code
- Prototype work time
- How to playtest
- Prototype playtest
- Vertical slice planning + work time
- Lighting
- Light Loops Example Code
- Vertical slice work time
- "Keynote" demos + "show floor" playtesting
- Build out planning + work time
- Game Theory, Planning, and Value Functions
- The confusing state of cross-platform graphics APIs
- Build out work time
- Writing nifty shaders (water, ambient occlusion, edge detection, GPU particles)
- OpenXR
- Android
- OpenXR + Android sample code
- set up distribution (itch.io?)
- Build out work time
- WalkMesh
- Bug hunting
- Polish + presskit planning + work time
- Topics on-demand.
- Polish + presskit work time.
- Retrospective
- Polish + presskit work time.