Beginning Android Games
Mario Zechner
Who am I?
Who am I?
Who am I?
Who am I?
Who am I?
Who am I?
Who am I?
Who am I?
Who am I?
http://www.badlogicgames.com/
@badlogicgames
What I‘ll Talk About
• Why Android?• What‘s in a game?• Android for game developers• Frameworks & engines
Why Android?
Why Android?
Why Android?
Why Android?
… or how to not make an infographic …
Why Android?
A Gaming Machine For Everyone!
What‘s in a Game?
What‘s in a Game?
DESIGN
What‘s in a Game?
What‘s in a Game?
What‘s in a Game?
What‘s in a Game?
What‘s in a Game?
What‘s in a Game?
What‘s in a Game?
Technology
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?
Android for Game Developers
Android for Game Developers
+ Tooling+ API Access- Performance- Portability
+ Performance+ Portability- Tooling- API Access
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>
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>
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
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
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()
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
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
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
Android for Game Developers
• Bugs in shader compilers• Deviations from OpenGL ES specification• Highly varying performance• GPU dependent optimizations• Texture compression formats• …
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
Android for Game Developers
• A lot better since 2.2, great since 4.0• Concurrent GC• JIT• Tons of bug fixes• GOTCHA
Android for Game Developers
Android for Game Developers
FRAGMENTATION
Android for Game Developers
Screen Sizes, Aspect Ratios, Resolutions
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!
Android for Game Developers
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!
Frameworks & Engines
Not exhaustive, visithttp://mobilegameengines.com/
Frameworks & Engines
Not exhaustive, visithttp://mobilegameengines.com/
$$$Free$$$Free$$$FreeFree$$$
WIP
• 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
Spine, 2D skeletal animation editorhttps://plus.google.com/100248578810918104811
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
Questions?http://www.badlogicgames.com/
@badlogicgames
Recommended