Home ยป What are “affordances” in game design?

What are “affordances” in game design?


An Affordance in general is an action a person perceives as possible. Adding a handle to a desk drawer generates an affordance to open it. Without the handle it just looks like a panel and someone would not get the idea that opening it is even possible.

Or notice the link I posted as the second word of the answer. It is displayed in a different color and your cursor changes into a hand when you move to it. This implies that something will happen when you click on it. That’s an affordance. It would be possible for Stackexchange to use some CSS to make the link the same color as the rest of the text and even suppress the cursor change when hovering on it. This would technically not prevent you from clicking on it, but it would remove the affordance to do so, so you likely won’t do it.

In the context of game design, this means that when you want the player to do something, just making it possible to do it is not enough. The player must be made aware that they can interact with something in some way. So you need to give them a cue that interaction is possible. For example:

  • When you want the player to realize they can push an object, make it look pushable.
  • When there is a button the player needs to press to progress in the game, place it in a prominent location, make it large and visible and make it look like a button.
  • When it is important that the player collects powerups, make sure they stand out from the environment so they are noticed as important.
  • When the player needs to use a menu to levelup their character, make sure it is opened with a very large and obvious button which is always visible on the screen and becomes even more visible when there are skill points to distribute. Even better, open the levelup menu automatically so the player is forced to interact with it.

A common beginner mistake in game design is to add a really interesting feature to a game, but then neglect to also add an affordance which enables players to even find that feature or when they find it pay as much attention to it as it deserves.

But professionals are not immune to it either. Anyone who played Sonic 3 on the Sega Mega Drive might remember this frustrating moment:

that gooddamn barrel

For those who don’t remember it or didn’t play it: The player got locked in that room. The affordance to progress was obvious: get that drum out of the way. But what wasn’t obvious was how to do that. The player could jump on it, and it started to bounce up and down. This created an affordance: Jump on it to make it move further. But that was a misleading affordance. Jumping did move it, but it didn’t move it enough to allow progress.

What the player actually had to do was press up and down while on it. This made the drum bounce much more than through jumping. With that knowledge, that room was no challenge at all. But there was no affordance whatsoever that pressing up or down would do anything. During the whole Sonic series, pressing up and down never did anything to the environment. So most players got stuck in that room for ages.

How would it have been possible to improve this?

  1. remove the false affordance. Don’t have the barrel bounce that much on jumping to remove the implication that this would be the way to progress.
  2. add a visual cue that pressing up and down would do something, for example by placing up-and-down arrows on the drum and have them light up when the player pressed up or down on their joypad.

Teaching without words. Essentially, allowing common sense and simple reasoning to do the teach the player how to use the mechanics of the game.

Allow me to give you a real world example. When approaching this door, do you push or do you pull?
enter image description here

Without words, it’s not really clear. You either need to try and get lucky or they need to put up a sign, with words. Now, how about this door?

enter image description here

Only one option right? It’s pretty clear you can only push, so that’s what you do.

The second design shows people how to open the door, in the moment it takes to walk toward it.

This can be applied to games too.

  • Levers are used to open doors. Early in the game, the player is trapped in a room with a door and a lever which are very close together. The next level moves the lever farther away. Quickly, players learn that if they find a door that’s locked, they should be looking for a lever. This uses limited choice and proximity to teach the player that these two things are connected.

  • There’s a really hard enemy, every bullet you shoot at them just bounces off. Sometimes, that enemy will turn around, and you spot a small tank on their back that’s a completely different color than anything else on their body. Shooting that tank makes them explode. This uses limited choice and object highlighting to teach the player that the highlighted object is important.

Games that do this well are fantastic. They don’t need tutorials or wikis. Utilizing incremental introduction of new features and mechanics allows you to teach the player how to play the game, without saying a word.

“Affordance, to put it simply, is the quality of an object that communicates a way to use it.”

Good affordances in game design will mean that the players know how to interact with items without significant instruction. An example of a good affordance is seeing a lock after you’ve already found a key.

Here’s an example from Activision’s Mindshadow of one of the most horrible misleading affordances I’ve ever seen:

enter image description here

This is a text adventure, so you have to type something. At this point, you know you need to drop the anchor to stop the ship. In the picture you see a spool with a rope attached to a chain. You have a cleaver. I tried “CUT ROPE” and “CUT ROPE WITH CLEAVER” etc, it just said “I can’t see any rope here.” The answer to this puzzle is “CUT CHAIN WITH CLEAVER”.


See this article for more discussion:

Related Solutions

When should I not kill -9 a process?

Generally, you should use kill (short for kill -s TERM, or on most systems kill -15) before kill -9 (kill -s KILL) to give the target process a chance to clean up after itself. (Processes can't catch or ignore SIGKILL, but they can and often do catch SIGTERM.)...

Default value for UUID column in Postgres

tl;dr Call DEFAULT when defining a column to invoke one of the OSSP uuid functions. The Postgres server will automatically invoke the function every time a row is inserted. CREATE TABLE tbl ( pkey UUID NOT NULL DEFAULT uuid_generate_v1() , CONSTRAINT pkey_tbl...

comparing five integers with if , else if statement

try this : int main () { int n1, n2, n3, n4, n5, biggest,smallest; cout << "Enter the five numbers: "; cin >> n1 >> n2 >> n3 >> n4 >> n5 ; smallest=biggest=n1; if(n2>biggest){ biggest=n2; } if(n2<smallest){ smallest=n2;...

How to play YouTube audio in background/minimised?

Here's a solution using entirely free and open source software. The basic idea is that although YouTube can't play clips in the background, VLC for Android can play clips in the background, so all we need to do is pipe the clip to VLC where we can listen to it...

Why not use “which”? What to use then?

Here is all you never thought you would ever not want to know about it: Summary To get the pathname of an executable in a Bourne-like shell script (there are a few caveats; see below): ls=$(command -v ls) To find out if a given command exists: if command -v...

Split string into Array of Arrays [closed]

If I got correct what you want to receive as a result, then this code would make what you want: extension Array { func chunked(into size: Int) -> [[Element]] { return stride(from: 0, to: self.count, by: size).map { Array(self[$0 ..< Swift.min($0 + size,...

Retrieving n rows per group

Let's start with the basic scenario. If I want to get some number of rows out of a table, I have two main options: ranking functions; or TOP. First, let's consider the whole set from Production.TransactionHistory for a particular ProductID: SELECT...

Don’t understand how my mum’s Gmail account was hacked

IMPORTANT: this is based on data I got from your link, but the server might implement some protection. For example, once it has sent its "silver bullet" against a victim, it might answer with a faked "silver bullet" to the same request, so that anyone...

What is /storage/emulated/0/?

/storage/emulated/0/Download is the actual path to the files. /sdcard/Download is a symlink to the actual path of /storage/emulated/0/Download However, the actual files are located in the filesystem in /data/media, which is then mounted to /storage/emulated/0...

How can I pass a command line argument into a shell script?

The shell command and any arguments to that command appear as numbered shell variables: $0 has the string value of the command itself, something like script, ./script, /home/user/bin/script or whatever. Any arguments appear as "$1", "$2", "$3" and so on. The...

What is pointer to string in C?

argv is an array of pointers pointing to zero terminated c-strings. I painted the following pretty picture to help you visualize something about the pointers. And here is a code example that shows you how an operating system would pass arguments to your...

How do mobile carriers know video resolution over HTTPS connections?

This is an active area of research. I happen to have done some work in this area, so I'll share what I can about the basic idea (this work was with industry partners and I can't share the secret details ๐Ÿ™‚ ). The tl;dr is that it's often possible to identify an...

How do I change the name of my Android device?

To change the hostname (device name) you have to use the terminal (as root): For Eclair (2.1): echo MYNAME > /proc/sys/kernel/hostname For Froyo (2.2): (works also on most 2.3) setprop net.hostname MYNAME Then restart your wi-fi. To see the change, type...

How does reverse SSH tunneling work?

I love explaining this kind of thing through visualization. ๐Ÿ™‚ Think of your SSH connections as tubes. Big tubes. Normally, you'll reach through these tubes to run a shell on a remote computer. The shell runs in a virtual terminal (tty). But you know this part...

Difference between database vs user vs schema

In Oracle, users and schemas are essentially the same thing. You can consider that a user is the account you use to connect to a database, and a schema is the set of objects (tables, views, etc.) that belong to that account. See this post on Stack Overflow:...