Tools for developing Android Games
Upcoming SlideShare
Loading in...5

Tools for developing Android Games



Slides from the workshop: Tools for developing Android Games, held on March 24th, 2012 at Amsterdam.

Slides from the workshop: Tools for developing Android Games, held on March 24th, 2012 at Amsterdam.



Total Views
Views on SlideShare
Embed Views



3 Embeds 749 738 10 1



Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

 Tools for developing Android Games Tools for developing Android Games Presentation Transcript

  • Tools for Android GamesRaul Portales@sla_shalafi
  • Summary● Introduction to game development● Engines ● AndEngine ● jPCT-AE● Scores / Achievements● Monetization systems
  • Game Architecture (Simplified) Game Engine Draw Thread Game Objects Update Thread
  • Performance Tips● Avoid object creations ● Use pools and pre create them● Avoid getters and setters ● Public attributes instead● Avoid collections● Avoid interfaces● Use a single Activity
  • Why use OpenGL? Performance
  • Why use OpenGL? Performance
  • Why use any EngineYou don’t want to start from scratch
  • AndEngine
  • AndEngine●● 2D Graphics Engine● LGPL● Extensions ● Physics Engine (Box2D) ● Live Wallpapers ● etc
  • Games built with AndEngine● Chalk Ball● Bunny Shooter● Greedy Spiders● Wheelz● Farm Tower● ...
  • Games built with AndEngine
  • Project setup● Put the jar under libs ● Add them to the build path● Don’t forget “armeabi”● Get the source ● Import project ● Create res dir
  • Concepts● Engine● Scene ● Sprites + Handlers● Texture / Texture Atlas● Sprite● Body ● Fixture
  • Game Architecture / AndEngine Game Engine Draw Thread Game Objects Update Thread Scene UpdateHandler Sprites
  • Activity creation flow● BaseGameActivity ● onLoadEngine ● onLoadResources ● onLoadScene ● onLoadComplete
  • Creating the Engine (1/2)public Engine onLoadEngine() {DisplayMetrics om = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(om);camWidth = 480;camHeight = (int) (om.heightPixels*480f / om.widthPixels);RatioResolutionPolicy rrp = newRatioResolutionPolicy(camWidth, camHeight);Camera camera = new Camera(0, 0, camWidth, camHeight);
  • Creating the Engine (2/2)EngineOptions options = new EngineOptions(true,ScreenOrientation.LANDSCAPE, rrp, camera);options.getRenderOptions().disableExtensionVertexBufferObjects();return new Engine(options);}
  • Loading Resourcespublic void onLoadResources() {BitmapTextureAtlas bitmapTextureAtlas = newBitmapTextureAtlas(64, 64,TextureOptions.BILINEAR_PREMULTIPLYALPHA);mBoxTextureRegion =BitmapTextureAtlasTextureRegionFactory.createFromAsset(bitmapTextureAtlas, this,"box_icon.png", 0, 0);mEngine.getTextureManager().loadTexture(bitmapTextureAtlas);}
  • Texture Atlas● Quite a pain for AndEngine ● Built by hand ● Size must be a power of 2 ● One big or many small ones?
  • Creating the Scene (1/3)public Scene onLoadScene() {Scene scene = new Scene();PhysicsWorld physicsWorld = new PhysicsWorld(newVector2(0, SensorManager.GRAVITY_EARTH), false);Shape ground = new Rectangle(0, camHeight - 2,camWidth, 2);FixtureDef wallFixtureDef =PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);PhysicsFactory.createBoxBody(physicsWorld, ground,BodyType.StaticBody, wallFixtureDef);scene.attachChild(ground);
  • Creating the Scene (2/3)Sprite box = new Sprite(0, 0, mBoxTextureRegion);FixtureDef boxFixture =PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);Body boxBody =PhysicsFactory.createBoxBody(physicsWorld, box,BodyType.DynamicBody, boxFixture);physicsWorld.registerPhysicsConnector(newPhysicsConnector(box, boxBody, true, true));scene.attachChild(box);
  • Creating the Scene (3/3)scene.registerUpdateHandler(physicsWorld);scene.registerUpdateHandler(mUpdateHandler);return scene;}
  • Types of bodies● Dynamic ● It is affected by physics like gravity● Kinematic ● It moves in a specified way● Static ● It does not move
  • More Interesting things● TiledTextures / Animated Sprites● Animations● Sound Engine● Particle Systems● Collision Detect● Polygonal Bodies● Menus
  • Intermission ← AndEngine Example apk
  • jPCT-AE
  • jPCT-AE●● 3D Engine ● 3DObjects ● Lights ● etc● No physics ● It has collision detection
  • Games built with jPCT-AE● SpaceCat● SkyFrontier● Forgotten Elements● Mobialia Chess● Freddy Budgett● Alien Runner● ...
  • Games built with jPCT-AE
  • Project setupAdd jpct-ae.jar to libs / Build path
  • Concepts / Classes● Renderer / FrameBuffer● World● Texture / TextureManager● Object3D● Light● Camera
  • Game Architecture / jPCT-AE Game EngineDraw Thread Game Objects Update Thread Renderer World 3DObject
  • Preparing the GLSurfaceViewmGlView = (GLSurfaceView) findViewById(;mGlView.setKeepScreenOn(true);mViewRenderer = new MyRenderer(mGlView, mWorld);mGlView.setRenderer(mViewRenderer);
  • Renderer setuppublic void onDrawFrame(GL10 gl) { buffer.clear(back); synchronized (mWorld) { mWorld.renderScene(buffer); mWorld.draw(buffer); } buffer.display();}
  • Setup the WorldmWorld = new World();mWorld.setAmbientLight(150, 150, 150);
  • Loading TexturesResources res = getResources();Texture texture = new Texture(res.getDrawable(R.raw.texture));TextureManager.getInstance() .addTexture("texture", texture);
  • Loading ObjectsmModel = Loader.load3DS(getResources() .openRawResource(R.raw.model), 1)[0];mModel.setTexture("texture");mWorld.addObject(mModel);mWorld.buildAllObjects();
  • Creating LightsLight sun = new Light(mWorld);sun.setIntensity(250, 250, 250);SimpleVector sv = new SimpleVector(0, -100, -100);sun.setPosition(sv);
  • Handling the cameraCamera cam = mWorld.getCamera();cam.setPosition(new SimpleVector(0, 0,-100));cam.lookAt(mModel.getTransformedCenter());
  • More about the camera● It has a position ● Camera.setPosition● It has a target ● Camera.lookAt● It has a rotation ● Camera.setRotation
  • The 3D axis
  • Operations with objects● Hierarchy ● addChild● Move ● setPosition / translate● Rotation ● rotateX, rotateY, rotateZ
  • More Interesting Things● Keyframe Animations● Collision detect (Ellipsoids)● Billboards● Transparency● Culling● Primitive Objects
  • And a workaround● Overlay native layouts ● Menus ● Dialogs
  • Another Intermission ← jPCT-AE Example apk
  • Bonus: Other Engines● PlayN ●● NME ●● Unity ●● Game Maker ●
  • Scores / Achievements
  • Why use a Library?● Not reinventing the wheel ● It is proven that works● Familiarity for users ● Other games use them● You do not own the servers ● You don’t, and that is good
  • Available libraries● ScoreLoop ● OpenFeint
  • What do you get?● Achievements ● Not very impressive● Leaderboards ● That is interesting● News Feed● Friends management● Improved engagement
  • Easy to integrate● Android Library Project● Initialize with the Application● Open a specific screen ● 2 lines of code● Submit a score or achievement ● 2 lines of code
  • MonetizationToo much to say for a single slide
  • And now...● Lunch● Pitch your game idea ● Gather a team● Hackaton● Demos, Pizza & Beer
  • Tools for Android GamesRaul Portales@sla_shalafi