Beginning android games

53
Beginning Android Games Mario Zechner

description

Slides for the talk "Beginning Android Games" at Apps World 2012 by Mario Zechner @badlogicgames http://www.badlogicgames.com http://libgdx.badlogicgames.com

Transcript of Beginning android games

Page 1: Beginning android games

Beginning Android Games

Mario Zechner

Page 2: Beginning android games

Who am I?

Page 3: Beginning android games

Who am I?

Page 4: Beginning android games

Who am I?

Page 5: Beginning android games

Who am I?

Page 6: Beginning android games

Who am I?

Page 7: Beginning android games

Who am I?

Page 8: Beginning android games

Who am I?

Page 9: Beginning android games

Who am I?

Page 10: Beginning android games

Who am I?

http://www.badlogicgames.com/

@badlogicgames

Page 11: Beginning android games

What I‘ll Talk About

• Why Android?• What‘s in a game?• Android for game developers• Frameworks & engines

Page 12: Beginning android games

Why Android?

Page 13: Beginning android games

Why Android?

Page 14: Beginning android games

Why Android?

Page 15: Beginning android games

Why Android?

… or how to not make an infographic …

Page 16: Beginning android games

Why Android?

A Gaming Machine For Everyone!

Page 17: Beginning android games

What‘s in a Game?

Page 18: Beginning android games

What‘s in a Game?

DESIGN

Page 19: Beginning android games

What‘s in a Game?

Page 20: Beginning android games

What‘s in a Game?

Page 21: Beginning android games

What‘s in a Game?

Page 22: Beginning android games

What‘s in a Game?

Page 23: Beginning android games

What‘s in a Game?

Page 24: Beginning android games

What‘s in a Game?

Page 25: Beginning android games

What‘s in a Game?

Technology

Page 26: Beginning android games

What‘s in a Game?

• Window & Life-Cycle Management• File I/O• Input Devices• Audio• Graphics• Networking• Social Media Integration• Payment System• Tools• … you actually read all of this?

Page 27: Beginning android games

Android for Game Developers

Page 28: Beginning android games

Android for Game Developers

+ Tooling+ API Access- Performance- Portability

+ Performance+ Portability- Tooling- API Access

Page 29: Beginning android games

Android for Game Developers

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.badlogic.awesomegame"

android:versionCode="1"

android:versionName="1.0"

android:installLocation="preferExternal">

<application android:icon="@drawable/icon"

android:label="Awesomnium"

android:debuggable="true">

<activity android:name=".GameActivity"

android:label="Awesomnium"

android:screenOrientation="landscape"

android:configChanges="keyboard|keyboardHidden|orientation">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity> </application> <uses-permission

android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.WAKE_LOCK"/>

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="16"/>

</manifest>

Page 30: Beginning android games

Android for Game Developers

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.badlogic.awesomegame"

android:versionCode="1"

android:versionName="1.0"

android:installLocation="preferExternal">

<application android:icon="@drawable/icon"

android:label="Awesomnium"

android:debuggable="true">

<activity android:name=".GameActivity"

android:label="Awesomnium"

android:screenOrientation="landscape"

android:configChanges="keyboard|keyboardHidden|orientation">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity> </application> <uses-permission

android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.WAKE_LOCK"/>

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="16"/>

</manifest>

Page 31: Beginning android games

Android for Game Developers

• Store files in– APK (read-only)– Internal Storage (read/write, limited space)– External Storage (read/write)

• SharedPreferences for simple settings• GOTCHAS– APK size limit (50mb)– Asset file compression bug until Android 2.3– No direct access via NDK in older Android versions

Page 32: Beginning android games

Android for Game Developers

• OnTouchListener and OnKeyListener on View

• SensorManager for compass, accelerometer, gyro, …

• USB/NFC since Android 3+• GOTCHAS– Horrible Touch API– Multi-touch broken on many devices

Page 33: Beginning android games

Android for Game Developers

• SoundPool for sound effects• MediaPlayer for streaming music• OpenSL ES in C/C++

• GOTCHAS– High latency (+100ms)– Broken drivers

setVolumeControlStream(AudioManager.STREAM_MUSIC);soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);explosionId = soundPool.load(descriptor, 1);soundPool.play(explosionId, 1, 1, 0, 0, 1);

mediaPlayer = new MediaPlayer()mediaPlayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());mediaPlayer.prepare();mediaPlayer.setLooping(true);mediaPlayer.start()

Page 34: Beginning android games

Android for Game Developers

+ Ease-of-Use- Performance- 2D-only

+ Performance+ 2D / 3D- Ease-of-Use

canvas.drawRGB(255, 255, 255); paint.setColor(Color.RED);canvas.drawLine(0, 0, canvas.getWidth()-1, canvas.getHeight()-1, paint); paint.setStyle(Style.STROKE);paint.setColor(0xff00ff00); canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, 40, paint); paint.setStyle(Style.FILL);paint.setColor(0x770000ff);canvas.drawRect(100, 100, 200, 200, paint);

Canvas OpenGL ES

Page 35: Beginning android games

Android for Game Developers

+ Ease-of-Use- Performance- 2D-only

+ Performance+ 2D / 3D- Ease-of-Use

canvas.drawRGB(255, 255, 255); paint.setColor(Color.RED);canvas.drawLine(0, 0, canvas.getWidth()-1, canvas.getHeight()-1, paint); paint.setStyle(Style.STROKE);paint.setColor(0xff00ff00); canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, 40, paint); paint.setStyle(Style.FILL);paint.setColor(0x770000ff);canvas.drawRect(100, 100, 200, 200, paint);

Canvas OpenGL ES

MY GOD, IT‘S FULL OF GOTCHAS

Page 36: Beginning android games

Android for Game Developers

+ Ease-of-Use- Performance- 2D-only

+ Performance+ 2D / 3D- Ease-of-Use

canvas.drawRGB(255, 255, 255); paint.setColor(Color.RED);canvas.drawLine(0, 0, canvas.getWidth()-1, canvas.getHeight()-1, paint); paint.setStyle(Style.STROKE);paint.setColor(0xff00ff00); canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, 40, paint); paint.setStyle(Style.FILL);paint.setColor(0x770000ff);canvas.drawRect(100, 100, 200, 200, paint);

Canvas OpenGL ES

MY GOD, IT‘S FULL OF GOTCHAS

Page 37: Beginning android games

Android for Game Developers

• Bugs in shader compilers• Deviations from OpenGL ES specification• Highly varying performance• GPU dependent optimizations• Texture compression formats• …

Page 38: Beginning android games

Android for Game Developers

• And if you use Java …• Garbage Collector pauses (+200ms)• Varying maximum heap memory• Direct ByteBuffers and Bitmaps counted

against Java heap• Method call overhead

Page 39: Beginning android games

Android for Game Developers

• A lot better since 2.2, great since 4.0• Concurrent GC• JIT• Tons of bug fixes• GOTCHA

Page 40: Beginning android games

Android for Game Developers

Page 41: Beginning android games

Android for Game Developers

FRAGMENTATION

Page 42: Beginning android games

Android for Game Developers

Screen Sizes, Aspect Ratios, Resolutions

Page 43: Beginning android games

Android for Game Developers

• Pick target resolution/aspect ratio• Stretch or Clip on other aspect ratios• Ship multiple asset sizes• We‘ve done this on the PC, we can do it on

Android!

Page 44: Beginning android games

Android for Game Developers

Page 45: Beginning android games

Android for Game Developers

• Device-specific driver bugs (audio, OpenGL ES)• Android version-specific bugs• Multiple test devices (3-4)– PowerVR, Mali, Snapdragon, Tegra– Low-end to high-end phones– Tablet

• Or use a framework/engine!

Page 46: Beginning android games

Frameworks & Engines

Not exhaustive, visithttp://mobilegameengines.com/

Page 47: Beginning android games

Frameworks & Engines

Not exhaustive, visithttp://mobilegameengines.com/

$$$Free$$$Free$$$FreeFree$$$

Page 48: Beginning android games

WIP

Page 49: Beginning android games

• Java (lots of C/C++ under the hood)• Develop on the desktop 90% of the time (no

slow deploys, no emulator madness)• Abstraction layers– Low-level: OpenGL ES, file i/o, input, audio, ...– Mid-level: shaders, textures, linalg, …– High-level: fonts, sprites, scene graph, …

• Pick and choose, see feature listhttp://libgdx.badlogicgames.com/features.html

Page 50: Beginning android games
Page 51: Beginning android games

Spine, 2D skeletal animation editorhttps://plus.google.com/100248578810918104811

Page 52: Beginning android games

Source & Releaseshttp://libgdx.badlogicgames.com/download.html

Docshttp://libgdx.badlogicgames.com/documentation.html

Forumhttp://badlogicgames.com/forum/

Bloghttp://www.badlogicgames.com

IRCirc.freenode.org, #libgdx

Page 53: Beginning android games

Questions?http://www.badlogicgames.com/

@badlogicgames