Falling to your Death: The CANABALT Postmortem

Eric Johnson Adam ‘Atomic’ Saltsman Semi Secret Software Canabalt

‣ adamatomic.com/canabalt ‣ canabalt.com Artwork Inspiration Flashback: The Quest for Identity Another World, Eric Chahi , Jordan Mechner Blomkamp’s District 9 Viktor Antonov, Art Director, Half Life 2 Level Generation Building Spacing

‣ Inspired by a traditional, “the farther you go, the harder it gets” formula ‣ evolved into a speed based formula Buildings: “Lego Pieces” Guerilla Marketing Free Flash Version

‣ Won’t that hurt sales? ‣ no Flash on iPhone ‣ try before you buy ‣ feel good about supporting indie developers Aggregators

‣ stumbleupon.com ➞ adamatomic.com ‣ 190,000 hits

‣ I ran 4089m before hitting a wall and tumbling to my death on my iPhone www.canabalt.com ‣ adamatomic.com 13,000 hits ‣ canabalt.com 41,000 hits App Store Specifics Sales / Piracy

‣ Just over 115,000 units in 5 months ‣ Estimated 20% piracy rate $2.99 (Gasp)

‣ “Rarely do I feel ripped of in the app store” ‣ “It should be free, or no more than .99”

‣ “Worth every penny” ‣ “This game is a value at $3” $2.99 (Gasp)

Canabalt A Top 10 0.99 Game A Top 10 Free Game

★★★★★ ★★★★★ ★★★★★ ★★★★ ★★★★ ★★★★ ★★★ ★★★ ★★★ ★★ ★★ ★★ ★ ★ ★ $2.99 (Gasp)

‣ generally must be a dollar to make it to top 10 ‣ must be more than a dollar to sustain a company outside of the top 10 iPhone Port Canabalt on the iPhone

‣ Flash version of Canabalt built around flixel ‣ 2D game library for Flash ‣ iPhone port of Canabalt includes a quick port of the flixel library ‣ very quick and dirty, porting work for flixel and Canabalt completed in just under 2 weeks ‣ Objective-C only, no C++ ‣ Objective-C can be a very productive language once you get the hang of it Flixel

‣ Rapid Game prototyping ‣ Strengths ‣ anyone can quickly and cheaply make games anywhere, just need Flash ‣ Weaknesses ‣ 3D, physics, and tweening all have to be done using external libraries ‣ current implementation limited to Flash Optimizations OpenGL Optimization ‣ Transparent objects infrequent ‣ menu page only in Canabalt ‣ Dynamically check whether to enable Alpha blending if (alpha != 1.0) { glEnableClientState(GL_COLOR_ARRAY); glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors); } //glVertexPointer, glTexCoordPointer, glDrawArrays if (alpha != 1.0) glDisableClientState(GL_COLOR_ARRAY); OpenGL Optimization ‣ Interleaved vertices and texture coordinates, GLshort instead of GLfloat

#define TEX_SCALE (512.0) #define SCALE_TEX(t) ((GLshort)((t)*TEX_SCALE)) ... glMatrixMode(GL_TEXTURE); glLoadIdentity(); glScalef(1/TEX_SCALE, 1/TEX_SCALE, 1.0); ...

vertsCoords[i] = SCALE_TEX(20.0); ... glVertexPointer(2, GL_SHORT, sizeof(GLshort)*4, & (vertsCoords[0])); glTexCoordPointer(2, GL_SHORT, sizeof(GLshort)*4, & (vertsCoords[2])); Memory Optimization ‣ For a finite group of objects that are used over and over again (e.g. doves) ‣ statically allocate pool of objects in memory

+ (void) initialize { doves = malloc(sizeof(Dove *) * doveCount); for (int i=0; i

‣ Public release of flixel for iPhone nearing completion ‣ Rudimentary Actionscript 3 to Objective-C translator, to accelerate iPhone ports of flixel games ‣ will not translate just any generic Actionscript 3 program ‣ does not yet produce 100% compilable code (but hopefully will soon) ‣ but it gets you maybe 90% of the way! ‣ Private beta release very soon, with a public release to follow ‣ email fl[email protected] to be notified Questions?