Falling to your Death: The CANABALT Postmortem Eric Johnson Adam - - PowerPoint PPT Presentation

falling to your death the canabalt postmortem
SMART_READER_LITE
LIVE PREVIEW

Falling to your Death: The CANABALT Postmortem Eric Johnson Adam - - PowerPoint PPT Presentation

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


slide-1
SLIDE 1

Falling to your Death: The CANABALT Postmortem

Eric Johnson Adam ‘Atomic’ Saltsman Semi Secret Software

slide-2
SLIDE 2

Canabalt

  • adamatomic.com/canabalt
  • canabalt.com
slide-3
SLIDE 3

Artwork Inspiration

slide-4
SLIDE 4

Flashback: The Quest for Identity

slide-5
SLIDE 5

Another World, Eric Chahi

slide-6
SLIDE 6

Prince of Persia, Jordan Mechner

slide-7
SLIDE 7

Blomkamp’s District 9

slide-8
SLIDE 8

Viktor Antonov, Art Director, Half Life 2

slide-9
SLIDE 9

Level Generation

slide-10
SLIDE 10

Building Spacing

  • Inspired by a traditional, “the farther you

go, the harder it gets” formula

  • evolved into a speed based formula
slide-11
SLIDE 11

Buildings: “Lego Pieces”

slide-12
SLIDE 12

Guerilla Marketing

slide-13
SLIDE 13

Free Flash Version

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

developers

slide-14
SLIDE 14

Aggregators

  • stumbleupon.com ➞ adamatomic.com
  • 190,000 hits
slide-15
SLIDE 15

Twitter

  • 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
slide-16
SLIDE 16

App Store Specifics

slide-17
SLIDE 17

Sales / Piracy

  • Just over 115,000 units in 5 months
  • Estimated 20% piracy rate
slide-18
SLIDE 18

$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”
slide-19
SLIDE 19

$2.99 (Gasp)

★★★★★ ★★★★ ★★★ ★★ ★ ★★★★★ ★★★★ ★★★ ★★ ★ ★★★★★ ★★★★ ★★★ ★★ ★

Canabalt A Top 10 0.99 Game A Top 10 Free Game

slide-20
SLIDE 20

$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

slide-21
SLIDE 21

iPhone Port

slide-22
SLIDE 22

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

slide-23
SLIDE 23

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
slide-24
SLIDE 24

Optimizations

slide-25
SLIDE 25

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);

slide-26
SLIDE 26

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]));

slide-27
SLIDE 27

Memory Optimization

  • For a finite group of objects that are used over and
  • ver again (e.g. doves)
  • statically allocate pool of objects in memory

+ (void) initialize { doves = malloc(sizeof(Dove *) * doveCount); for (int i=0; i<doveCount; ++i) doves[i] = [[Dove alloc] init]; }

  • verride retain/release methods, create an allocator
  • (id) retain { rtnCnt++; return self; }
  • (oneway void) release { if (--rtnCnt == 0) freeDove(); }

+ (id) dove { return nextAvailableDove(); }

slide-28
SLIDE 28

Special Announcement

slide-29
SLIDE 29

Flixel for iPhone

  • 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 flixel@semisecretsoftware.com to be notified
slide-30
SLIDE 30

Questions?