Beginning android games

Post on 10-May-2015

1.575 views 1 download

Tags:

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

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