Physics in Android™ games                          Pär Sikö, Martin Gunnarsson                          #androidphysicslör...
Popularity                         Timelördag den 5 mars 2011
Popularity                         Timelördag den 5 mars 2011
Popularity                         Timelördag den 5 mars 2011
Popularity                         Timelördag den 5 mars 2011
Popularity                         Timelördag den 5 mars 2011
Popularity                         Timelördag den 5 mars 2011
“Physics (from Ancient Greek: φύσις physis "nature") is a natural science               that involves the study of matter ...
“Physics in Android is when you beat the shit out of all the pigs in Angry Birds”                                         ...
Physics based gameslördag den 5 mars 2011
Physics based gameslördag den 5 mars 2011
Physics based gameslördag den 5 mars 2011
Physics based gameslördag den 5 mars 2011
Physics based gameslördag den 5 mars 2011
Physics based gameslördag den 5 mars 2011
Physics 101lördag den 5 mars 2011
lördag den 5 mars 2011
Theory                         (for real)lördag den 5 mars 2011
Featureslördag den 5 mars 2011
Features                         ► Gravitylördag den 5 mars 2011
Features                         ► Gravity                         ► Collisionslördag den 5 mars 2011
Features                         ► Gravity                         ► Collisions                         ► Jointslördag den...
Features                         ► Gravity                         ► Collisions                         ► Joints          ...
Physics Engineslördag den 5 mars 2011
Architecture                            Java                         JNI wrapper                         Native codelördag...
Physics engines                         Box2Dlördag den 5 mars 2011
Physics engines                         libgdx                         Box2Dlördag den 5 mars 2011
Physics engines                         AndEngine                           libgdx                          Box2Dlördag de...
AndEnginelördag den 5 mars 2011
public class Example extends BaseGameActivity {    	    	     public Engine onLoadEngine() {    	     	    	     }    	   ...
onLoadEngine     private final static int WIDTH = 480;     private final static int HEIGHT = 320;     public Engine onLoad...
onLoadResources     protected Texture texture;     protected TextureRegion region;     public void onLoadResources() {    ...
Textures and regions                         2n × 2m pxlördag den 5 mars 2011
Textures and regions                         2n × 2m pxlördag den 5 mars 2011
onLoadResources     protected Texture texture;     protected TextureRegion region;     public void onLoadResources() {    ...
onLoadScene      public Scene onLoadScene() {      	    final Scene scene = new Scene(1);      	    scene.setBackground(ne...
onLoadComplete      public void onLoadComplete() {      }lördag den 5 mars 2011
Adding physicslördag den 5 mars 2011
public Engine onLoadEngine() {  	    final Camera camera = new Camera(0, 0, WIDTH, HEIGHT);  	    final RatioResolutionPol...
public class Example extends BaseGameActivity {        protected PhysicsWorld physicsWorld;        protected FixtureDef fi...
onLoadScene      public Scene onLoadScene() {      	    final Scene scene = new Scene(1);      	    scene.setBackground(ne...
onLoadScene      final   Shape   ground = new Rectangle(0, HEIGHT - 2, WIDTH, 2);      final   Shape   roof = new Rectangl...
Accelerometer      public class Example extends BaseGameActivity implements IAccelerometerListener {      	     public voi...
Making a gamelördag den 5 mars 2011
Making a gamelördag den 5 mars 2011
Making a game     ► Load resources     ► Load scene     ► Collision detection     ► Handle touch eventslördag den 5 mars 2...
onLoadResources      public void onLoadResources() {      	     texture = new Texture(256, 256, TextureOptions.BILINEAR); ...
onLoadScene      final Scene scene = new Scene(1);      scene.setBackground(new RepeatingSpriteBackground(CAMERA_WIDTH,   ...
onLoadScenelördag den 5 mars 2011
onLoadScene      final Scene scene = new Scene(1);      scene.setBackground(new RepeatingSpriteBackground(CAMERA_WIDTH,   ...
add(...)      Sprite sprite = new Sprite(xTranslate, yTranslate, region.clone());      sprite.setRotation(rotation);      ...
onLoadScene      // Add bosses      add(scene, bossRegion, TRANSLATE2 + 50, floor1, 0);      add(scene, bossRegion, TRANSL...
Collision detection      private ContactListener getContactListener(final Scene scene) {      	    return new ContactListe...
Touch events      public boolean onSceneTouchEvent(Scene pScene, TouchEvent touch) {      	    int action = touch.getActio...
Performancelördag den 5 mars 2011
Performance        60        45        30        15          0              0                50     100        150        ...
Thank you!                         per.siko@epsilon.nu                         martin.gunnarsson@epsilon.nulördag den 5 ma...
Upcoming SlideShare
Loading in …5
×

Physics in Android games

3,310 views

Published on

La presentazione tenuta da Martin Gunnarsson e Pär Sikö in occasione del Codemotion del 5 marzo 2011 a Roma - http://www.codemotion.it/

Realistic physics can add a new dimension to many traditional games, and enable a lot of new and creative game concepts. In this presentation we'll show how to integrate a physics engine into Android games and applications. We'll show features like gravity, collisions and joints, and explain how to use them. We'll finish off by showing a simple game incorporating all the topics we've covered, and sharing some valuable tips and tricks.

  • Be the first to comment

Physics in Android games

  1. 1. Physics in Android™ games Pär Sikö, Martin Gunnarsson #androidphysicslördag den 5 mars 2011
  2. 2. Popularity Timelördag den 5 mars 2011
  3. 3. Popularity Timelördag den 5 mars 2011
  4. 4. Popularity Timelördag den 5 mars 2011
  5. 5. Popularity Timelördag den 5 mars 2011
  6. 6. Popularity Timelördag den 5 mars 2011
  7. 7. Popularity Timelördag den 5 mars 2011
  8. 8. “Physics (from Ancient Greek: φύσις physis "nature") is a natural science that involves the study of matter and its motion through spacetime, as well as all related concepts, including energy and force. More broadly, it is the general analysis of nature, conducted in order to understand how the universe behaves” Wikipedialördag den 5 mars 2011
  9. 9. “Physics in Android is when you beat the shit out of all the pigs in Angry Birds” Anonymous Angry Birds addictlördag den 5 mars 2011
  10. 10. Physics based gameslördag den 5 mars 2011
  11. 11. Physics based gameslördag den 5 mars 2011
  12. 12. Physics based gameslördag den 5 mars 2011
  13. 13. Physics based gameslördag den 5 mars 2011
  14. 14. Physics based gameslördag den 5 mars 2011
  15. 15. Physics based gameslördag den 5 mars 2011
  16. 16. Physics 101lördag den 5 mars 2011
  17. 17. lördag den 5 mars 2011
  18. 18. Theory (for real)lördag den 5 mars 2011
  19. 19. Featureslördag den 5 mars 2011
  20. 20. Features ► Gravitylördag den 5 mars 2011
  21. 21. Features ► Gravity ► Collisionslördag den 5 mars 2011
  22. 22. Features ► Gravity ► Collisions ► Jointslördag den 5 mars 2011
  23. 23. Features ► Gravity ► Collisions ► Joints ► Extra propertieslördag den 5 mars 2011
  24. 24. Physics Engineslördag den 5 mars 2011
  25. 25. Architecture Java JNI wrapper Native codelördag den 5 mars 2011
  26. 26. Physics engines Box2Dlördag den 5 mars 2011
  27. 27. Physics engines libgdx Box2Dlördag den 5 mars 2011
  28. 28. Physics engines AndEngine libgdx Box2Dlördag den 5 mars 2011
  29. 29. AndEnginelördag den 5 mars 2011
  30. 30. public class Example extends BaseGameActivity { public Engine onLoadEngine() { } public void onLoadResources() { } public Scene onLoadScene() { } public void onLoadComplete() { } }lördag den 5 mars 2011
  31. 31. onLoadEngine private final static int WIDTH = 480; private final static int HEIGHT = 320; public Engine onLoadEngine() { Camera camera = new Camera(0, 0, WIDTH, HEIGHT); RatioResolutionPolicy ratio = new RatioResolutionPolicy(WIDTH, HEIGHT); EngineOptions options = new EngineOptions(true, ScreenOrientation.LANDSCAPE, ratio, camera); return new Engine(options); }lördag den 5 mars 2011
  32. 32. onLoadResources protected Texture texture; protected TextureRegion region; public void onLoadResources() { this.texture = new Texture(256, 32); this.region = TextureRegionFactory.createFromAsset(this.texture, this, "gfx/image.png", 0, 0); this.mEngine.getTextureManager().loadTexture(this.texture); }lördag den 5 mars 2011
  33. 33. Textures and regions 2n × 2m pxlördag den 5 mars 2011
  34. 34. Textures and regions 2n × 2m pxlördag den 5 mars 2011
  35. 35. onLoadResources protected Texture texture; protected TextureRegion region; public void onLoadResources() { this.texture = new Texture(256, 32); this.region = TextureRegionFactory.createFromAsset(this.texture, this, "gfx/image.png", 0, 0); this.mEngine.getTextureManager().loadTexture(this.texture); }lördag den 5 mars 2011
  36. 36. onLoadScene public Scene onLoadScene() { final Scene scene = new Scene(1); scene.setBackground(new ColorBackground(1f, 1f, 1f)); Sprite sprite = new Sprite(WIDTH / 2, HEIGHT / 2, this.region); scene.getTopLayer().addEntity(sprite); return scene; }lördag den 5 mars 2011
  37. 37. onLoadComplete public void onLoadComplete() { }lördag den 5 mars 2011
  38. 38. Adding physicslördag den 5 mars 2011
  39. 39. public Engine onLoadEngine() { final Camera camera = new Camera(0, 0, WIDTH, HEIGHT); final RatioResolutionPolicy ratio = new RatioResolutionPolicy(camera.getWidth(), camera.getHeight()); return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, ratio, camera)); } public void onLoadResources() { this.texture = new Texture(256, 32); this.tileRegions = TextureRegionFactory.createTiledFromAsset(this.texture, this, "gfx/blocks.png", 0, 0, BLOCKS, 1); this.mEngine.getTextureManager().loadTexture(this.texture); } public Scene onLoadScene() { final Scene scene = new Scene(1); scene.setBackground(new ColorBackground(0, 0, 0)); for (int i = 0; i < BLOCKS; i++) { TiledSprite sprite = new TiledSprite(68 + i * 52, 144, this.tileRegions.clone()); sprite.setCurrentTileIndex(i); scene.getTopLayer().addEntity(sprite); } return scene; }lördag den 5 mars 2011
  40. 40. public class Example extends BaseGameActivity { protected PhysicsWorld physicsWorld; protected FixtureDef fixtureDef = PhysicsFactory.createFixtureDef(10, 0.5f, 0.5f); ...lördag den 5 mars 2011
  41. 41. onLoadScene public Scene onLoadScene() { final Scene scene = new Scene(1); scene.setBackground(new ColorBackground(0, 0, 0)); physicsWorld = new PhysicsWorld( new Vector2(0, SensorManager.GRAVITY_EARTH), true); for (int i = 0; i < BLOCKS; i++) { TiledSprite sprite = new TiledSprite(68 + i * 52, 144, this.tileRegions.clone()); sprite.setCurrentTileIndex(i); scene.getTopLayer().addEntity(sprite); Body body = PhysicsFactory.createBoxBody(physicsWorld, sprite, BodyType.DynamicBody, fixtureDefinition); this.physicsWorld.registerPhysicsConnector(new PhysicsConnector( sprite, body)); } scene.registerUpdateHandler(physicsWorld); return scene; }lördag den 5 mars 2011
  42. 42. onLoadScene final Shape ground = new Rectangle(0, HEIGHT - 2, WIDTH, 2); final Shape roof = new Rectangle(0, 0, WIDTH, 2); final Shape left = new Rectangle(0, 0, 2, HEIGHT); final Shape right = new Rectangle(WIDTH - 2, 0, 2, HEIGHT); PhysicsFactory.createBoxBody(this.physicsWorld, ground, BodyType.StaticBody, this.fixtureDefinition); PhysicsFactory.createBoxBody(this.physicsWorld, roof, BodyType.StaticBody, this.fixtureDefinition); PhysicsFactory.createBoxBody(this.physicsWorld, left, BodyType.StaticBody, this.fixtureDefinition); PhysicsFactory.createBoxBody(this.physicsWorld, right, BodyType.StaticBody, this.fixtureDefinition); scene.getBottomLayer().addEntity(ground); scene.getBottomLayer().addEntity(roof); scene.getBottomLayer().addEntity(left); scene.getBottomLayer().addEntity(right);lördag den 5 mars 2011
  43. 43. Accelerometer public class Example extends BaseGameActivity implements IAccelerometerListener { public void onAccelerometerChanged(AccelerometerData data) { this.physicsWorld.setGravity(new Vector2(data.getY(), data.getX())); } public Scene onLoadScene() { this.enableAccelerometerSensor(this); ... } ...lördag den 5 mars 2011
  44. 44. Making a gamelördag den 5 mars 2011
  45. 45. Making a gamelördag den 5 mars 2011
  46. 46. Making a game ► Load resources ► Load scene ► Collision detection ► Handle touch eventslördag den 5 mars 2011
  47. 47. onLoadResources public void onLoadResources() { texture = new Texture(256, 256, TextureOptions.BILINEAR); woodRegion = TextureRegionFactory.createFromAsset(texture, this, "gfx/wood_base.png", 0, 0); stoneRegion = TextureRegionFactory.createFromAsset(texture, this, "gfx/stone_base.png", 8, 0); joltRegion = TextureRegionFactory.createFromAsset(texture, this, "gfx/jolt.png", 72, 0); bossRegion = TextureRegionFactory.createFromAsset(texture, this, "gfx/boss.png", 136, 0); ... this.mEngine.getTextureManager().loadTexture(texture); }lördag den 5 mars 2011
  48. 48. onLoadScene final Scene scene = new Scene(1); scene.setBackground(new RepeatingSpriteBackground(CAMERA_WIDTH, CAMERA_HEIGHT, mEngine.getTextureManager(), new AssetTextureSource(this, "gfx/background.png"))); scene.setOnSceneTouchListener(this); this.physicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), true, 3, 2); this.physicsWorld.setContactListener(getContactListener(scene)); // Position constants: TRANSLATE1, TRANSLATE2, floor1 ... // First floor add(scene, stoneRegion, TRANSLATE1, floor1, 0); add(scene, stoneRegion, TRANSLATE2, floor1, 0); add(scene, woodRegion, TRANSLATE1 + WMH / 2f, floor1 - WPH / 2f, -90f); ...lördag den 5 mars 2011
  49. 49. onLoadScenelördag den 5 mars 2011
  50. 50. onLoadScene final Scene scene = new Scene(1); scene.setBackground(new RepeatingSpriteBackground(CAMERA_WIDTH, CAMERA_HEIGHT, mEngine.getTextureManager(), new AssetTextureSource(this, "gfx/background.png"))); scene.setOnSceneTouchListener(this); this.physicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), true, 3, 2); this.physicsWorld.setContactListener(getContactListener(scene)); // Position constants: TRANSLATE1, TRANSLATE2, floor1 ... // First floor add(scene, stoneRegion, TRANSLATE1, floor1, 0); add(scene, stoneRegion, TRANSLATE2, floor1, 0); add(scene, woodRegion, TRANSLATE1 + WMH / 2f, floor1 - WPH / 2f, -90f); ...lördag den 5 mars 2011
  51. 51. add(...) Sprite sprite = new Sprite(xTranslate, yTranslate, region.clone()); sprite.setRotation(rotation); scene.getTopLayer().addEntity(sprite); Body body = PhysicsFactory.createBoxBody(physicsWorld, sprite, bodyType, fixtureDefinition); this.physicsWorld.registerPhysicsConnector(new PhysicsConnector(sprite, body)); return body;lördag den 5 mars 2011
  52. 52. onLoadScene // Add bosses add(scene, bossRegion, TRANSLATE2 + 50, floor1, 0); add(scene, bossRegion, TRANSLATE1 + 20, floor1, 0); // Add jolt cola to throw at the bosses add(scene, joltRegion, 50, 300, 0);lördag den 5 mars 2011
  53. 53. Collision detection private ContactListener getContactListener(final Scene scene) { return new ContactListener() { public void beginContact(Contact contact) { Fixture fixtureA = contact.getFixtureA(); Fixture fixtureB = contact.getFixtureB(); for (final Body bossBody : bosses.keySet()) { Fixture boss = bossBody.getFixtureList().get(0); if (fixtureA == boss || fixtureB == boss) { hitCount++; if (hitCount == 10) { // Remove boss from world and scene } } } } }; }lördag den 5 mars 2011
  54. 54. Touch events public boolean onSceneTouchEvent(Scene pScene, TouchEvent touch) { int action = touch.getAction(); if (action == TouchEvent.ACTION_DOWN) { startX = (int) touch.getMotionEvent().getX(); startY = (int) touch.getMotionEvent().getY(); return true; } if (action == TouchEvent.ACTION_UP) { float xDiff = (int) (startX - touch.getMotionEvent().getX()); float yDiff = (int) (startY - touch.getMotionEvent().getY()); can.applyLinearImpulse(new Vector2(2 * xDiff, yDiff), new Vector2(can.getPosition().x, can.getPosition().y)); addNewCan(); return true; } return false; }lördag den 5 mars 2011
  55. 55. Performancelördag den 5 mars 2011
  56. 56. Performance 60 45 30 15 0 0 50 100 150 HTC Hero X10 Xperia Playlördag den 5 mars 2011
  57. 57. Thank you! per.siko@epsilon.nu martin.gunnarsson@epsilon.nulördag den 5 mars 2011

×