Search This Blog

Design Bites: Mirror's Edge

The "Design Bites" series is about learning or appreciating just one design element of one game. It's about applying an analytical eye, even if it doesn't touch on everything.

What's Mirror's Edge?

Mirror's Edge is a Action Adventure First-Person Platformer developed and released by DICE in Late 2008. The player free-runs across city heights, jumping between rooftops and scaling walls. Occasionally you fight enemies with timing-based attacks but mostly it's about running away from things.

What's Awesome?

Games often instruct the player directly, spoken or written in UI, but the majority of instructions are actually given indirectly - A muzzle flash means "find cover", even without gruff military voiceover. Good level design is not just about what's challenging or fun, it's also about communication - it's a direct channel between the designer and the player.

Mirror's Edge showcases some awesome ways of getting your players attention and feeding them information. You might jump ahead here and bring up "Runner Vision", a mechanic that highlights objects in the world. This is a great feature but it's not what i'm talking about. I'm talking about how the game feeds you lore.

Take a look at this elevator sequence:

You hit this elevator button to advance, it's a mini tutorial on interacting with objects. It could have been empty, but instead there is a screen with a couple of short news articles. As you bend down to press the button, a small section of the screen is right there in view. You catch a glimpse of a headline, which just happens to be about a character that you're about to meet.

Some players may completely ignore the screen, others might stop and read, but no matter the choice the player has been signaled - directed towards an optional nugget of information. This example is quite direct: text on a screen in a closed space but, even so, not all players will stop to read this. The game is filled with mindful placement of objects - both key to platforming and as a tool for imparting story.

Many games do this, so the next time you're exploring Tamriel or Azeroth, take some time to appreciate how conveniently features of the world are laid out for you to see.

Popular posts from this blog

WARNING: This post is long. I wrote this because I could not find an unbiased comparison of the modern N-Trig and Wacom technologies online. It was written in response to the artistic outcry regarding the Surface Pro 3. If you are an artist, I believe it is worth reading.

UPDATED as of 20th June 2014 to reflect N-Trig software advancements.UPDATED as of 23rd June 2014 to reflect new direct Digitizer comparison information.

Those of you who may visit this site regularly will know that I am a game developer, but what you might not know is that I also do a lot of sketching. (Maybe one day I will post the stuff online)

Since I am a geek, I do almost all of my sketching digitally, which means I am always looking out for new developments in digitizer technology. This brings me to this post in particular:

Following the announcement of the Surface Pro 3, many artists were shocked and disappointed by the news that the SP3 would be using N-Trig technology rather than Wacom technology like the SP…

TL;DR: You don't need to duplicate a bunch of code to do the same things to a Image and a SpriteRenderer, or RectTransform and Transform, etc. You can use a simple pattern called the Adapter Pattern. If you've never used it before, this post explains how.

The Problem: Image vs SpriteRenderer
Lets say you want to make a sprite fade out, maybe its a dead monster or a collectible, but in either case you want it to gracefully depart from the screen rather than blink out of existence. Kinda like this eyeball monster from Beastly:

So that's pretty easy right, one way of doing it is with a MonoBehaviour that modifies the sprites alpha value via SpriteRenderer.color. Your class might look something like this: public class AlphaFaderSprite : MonoBehaviour {
public SpriteRenderer spr;
public float fade_percentage;
void Update() {
spr.color = new Color(spr.color.r, spr.color.g, spr.color.b,
fade_percentage);
}
}
Now, anyone who's used Unity for more than an …