Welcome to Advanced Android 4 Games. This book will help you create great games for the Android platform. There are plenty of books out there that tackle this subject, but only this book gives you a unique perspective by showing you how easy it is to bring native PC games to the platform with minimum effort. This is done using real-world examples and source code in each chapter. Keep in mind that before you dig into this book, you will need a solid foundation in Java and ANSI C. I have tried to clearly and simply explain the most complicated concepts with a combination of graphics and sample code. The source code provided for each chapter will help you understand the concepts in detail and make the most of your time as a mobile game developer.
It is hard to believe that is has been just two years since Android came onto the smartphone scene; and it has taken off with a vengeance. Take a look at the US smartphone platform market share, shown in Figure 1, according to a survey by Nielsen.1 In May 2011, Android commanded 36 percent of the smartphone market in the United States—not too shabby for a two-year-old OS. And the stats just keep getting better and better. Distimo, an analytics company specializing in app stores, forecasted that Android Market would surpass Apple's App Store in size by August 2011.2 This opens a new frontier for developers looking to capitalize from the rocketing smartphone segment. Advanced Android 4 Games is just what you need to get running quickly in building cutting-edge games for the platform.
_________________________
1 “Android Leads in U.S. Smartphone Market Share and Data Usage,” Nielsen Wire, http://blog.nielsen.com/nielsenwire/?p=27793
.
2 “Android to Surpass Apple's App Store In Size By August 2011,” a report by Distimo available at http://techcrunch.com/2011/05/05/android-to-surpass-apples-app-store-in-size-in-august-2011-report-exclusive/
.
Figure F–1. Smartphone market share, April 2011, Nielsen
This book targets seasoned game developers, not only in Java, but also in C. Performance is critical in game development. Other audiences include:
The required skill set for Pro Android games includes C/C++ and Java, plus some basic LINUX shell scripting. Java provides elegant object-oriented capabilities, but only C gives you the power boost that game development requires. All in all, you must have the skill set described in the following sections.
This book assumes that you already know the basics of Android development; for example, you need to know what activities, views, and layouts are. If you understand what the following fragment does just by looking at it, then you are in good shape.
public class MainActivity extends Activity
{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
This fragment defines the main activity or class that controls the life cycle of the application. The onCreate
method will be called once when the application starts, and its job is to set the content layout or GUI for the application.
You should also have a basic understanding of how GUIs are created using XML. Take a look at the next fragment. Can you tell what it does?
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/doom_iv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/doom"
android:focusableInTouchMode="true" android:focusable="true"/>
<ImageButton android:id="@+id/btn_upleft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:src="@drawable/img1" />
</RelativeLayout>
This code defines a relative layout. In a relative layout, widgets are placed relative to each other (sometimes overlapping). In this case, there is an image view that fills the entire screen. This image will display as the background the file called doom.png
, stored in the res/drawable
folder of the project, and receive key and touch events. In the lower left of the screen, overlapping the image view, an image button with the ID btn_upleft
will be displayed.
NEED AN ANDROID TUTORIAL?
Throughout this book (especially in the chapters dealing with native code), I make extensive use of the Android Software Development Kit (SDK) command tools (for system administrator tasks). Thus, you should have a clear understanding of these tools, especially the Android Debug Bridge (adb). You should know how to do the following:
$ mksdcard 100M $HOME/sdcard.iso
$ adb shell
$ adb push <LOCAL_FILE> <DEVICE_FILE>
$ adb pull <DEVICE_FILE> <LOCAL_FILE>
NOTE: Make sure the SDK_HOME/tools
directory is added to your system PATH variable before running the commands to create an SD card file, connect to the emulator, or upload and pull files.
For the chapters dealing with the hybrid games, you will do the work within Ubuntu Linux, so dust off all those old Unix skills.
You should know the basic shell commands, such as those for listing files, installing software components (this can be tricky, depending on your Linux distribution), and basic system administration.
There are a few very simple shell scripts in this book. A basic knowledge of the bash shell is always helpful.
TIP: If you need a refresher on your Linux and shell scripting, check out the following tutorial by Ashley J.S Mills:
To make the most of this book, you will need the tools mentioned in this section.
I guess this is kind of obvious, as most development for Android is done in Java. Note that I mentioned a Java SDK, not JRE. The SDK is required because of the JNI header files and command line tools used throughout the latter chapters.
Eclipse is the de facto IDE for Android development. I have used Eclipse Galileo to create the workspace for the book; nevertheless, Eclipse Ganymede should work as well.
NEED A DEVELOPMENT IDE?
To have the Android SDK properly installed you need to do the following:
A name: Android SDK
A location: https://dl-ssl.google.com/android/eclipse/
. Click OK.
Figure F-2. Android SDK configuration dialog in Eclipse Galileo
The NDK is the essential tool for any serious game developer out there. It provides the compiler chain, header files, and documentation required to bring your cutting-edge games to the mobile landscape. By using the NDK, developers can escape the shackles of the Java memory heap and unleash their creativity in building the most powerful C/C++ engines, limited only by what the hardware can provide. In this book you will use the NDK extensively, thus a solid foundation of C programming is required to fully understand the concepts presented in each chapter.
This is an optional tool, but it will help you greatly to understand the concepts as you move along. I have made my best effort to describe each chapter as simply as possible; nevertheless, some of the games (especially Wolf 3D and Doom) have very large core engines written in C (100 K lines for Doom), which are poorly commented and very hard to understand. All in all, you will see how easy these great languages (Java and C) can be combined with minimal effort. Get the companion source for the book at www.apress.com
. It was built using the latest Eclipse SDK.
I think it is important for the reader to understand my goal with this manuscript and what I believe sets this book apart. Even though Java is the primary development language for Android, Google has realized the need for hybrid Java/C development if Android is to succeed as a gaming platform; so much so that they released the Native Development Kit (NDK). I think that Google has been wise to support C development; otherwise, it would be left behind by the overwhelming number of native games written for other mobile platforms, like the iPhone.
PC games have been around for decades (mostly written in C), and by using a simple ARM C compiler, you could potentially bring thousands of PC games to the Android platform. This is what makes this book unique. Why translate 100 K lines of painfully complicated code from C to Java if you can just combine both languages in an elegant manner—and save yourself lots of time and money in the process? This is my goal and what makes this book stand out. Although, the book does include chapters with pure Java games, presented in a well-balanced layout to satisfy both the Java purist and the C lover in you.
With the relentless pace of Android updates, many things have changed since the last iteration of this book, Pro Android Games. These changes include the following:
As a developer, you may ask yourself about the SDK compatibility of the code in this book. This is an important question as new versions of the Android SDK come out frequently. At the time of this writing, Google released Android SDK version 3.2. The code in this chapter has been fully tested with Android SDK versions 4.0 and 3.1.
The bottom line is that the code in this book will run in any version of the SDK and that was my intention all along.
This book has a well-balanced layout of very powerful hybrid games, divided by chapter.
This chapter provides the first step to set up a Linux system for hybrid game compilation, including fetching the Android source, extracting device system libraries, setting up a custom compilation tool chain, custom compilation scripts, and details on setting up the Eclipse IDE for use throughout the rest of the book.
In Chapter 2 you will learn how to combine Java and C code in an elegant manner by building a simple Java application on top of a native library. You will learn exciting concepts about the Java Native Interface (JNI) and the API used to combine Java and C in a single unit, including how to load native libraries, how to use the native keyword, how to generate the JNI headers, as well as method signatures, Java arrays vs. C arrays, invoking Java methods, compiling and packing the product, and more.
This chapter deals with 3D graphics with OpenGL. It presents a neat trick that allows for mixing OpenGL API calls in both Java and C. This concept is illustrated by using the 3D cubes sample provided by Google to demonstrate OpenGL in pure Java and hybrid modes. This trick could open a new frontier of 3D development for Android, with the potential to bring a large number of 3D PC games to the platform with enormous savings in development costs and time.
Chapter 4 tackles efficient graphics with OpenGL ES 2.0. It starts with a brief description of the most important features that OpenGL ES 2 can offer, including Shaders, GLSL, and how they affect the Android platform. Then, it takes a deeper look into GLSL by creating a neat Android project to render an icosahedron using OpenGL ES 2.0. As a bonus, it will show you how you can use single and multi-touch functionality to alter the rotation speed of the icosahedron, plus pinch for zooming in or out.
Chapter 5 takes things to the next level with Doom, the ground-breaking game for the PC. Doom is arguably the greatest 3D game ever created, opening new frontiers in 3D graphics. The ultimate goal of this chapter is not to describe the game itself, but to show you how easy it is to bring a complex PC game like Doom to the Android platform. The proof? Doom has more than 100 K lines of C code—and is brought to Android with less than 200 lines of extra JNI API calls, plus the Java code required to build the mobile UI. This chapter shows that you don't have to translate 100 K lines of C into Java, but simply marry these two powerful languages in an elegant application. Consider the potential savings in development time and costs! This chapter is a must read.
This is where things start to get really exiting. Chapter 6 brings you a first person shooter (FPS) gem: Quake. You will learn how a powerful PC engine of this caliber can be brought to the Android platform with minimum effort. So much so that 95 percent of the original C code is kept intact, with an extra 500–1,000 lines of new, very simple Java wrapper code. Start playing Quake in all its glory on your smartphone now!
This chapter builds upon Chapter 6 to deliver the Quake II engine to your fingertips. You will be introduced to a wonderful tool called NanoGL, which allows developers to translate the complexity of the OpenGL immediate mode drawing into OpenGL ES, transparently keeping your original code intact. You will also learn how to make the Quake II engine behave properly in Android by creating custom audio and video handlers, which also demonstrates the great reusability features of the Java language. All in all, 99 percent of the original Quake II C code will be kept intact, plus the thin Java wrappers from Chapter 6 will be reused without change. Chapter 7 will show you how a simple combo of very powerful tools can tame the mighty Quake II OpenGL renderer. Check it out!
3.14.253.106