Chapter     1

Getting Started

Welcome to Android Game Recipes. This book is very much like a cookbook. It is designed to tackle specific, common problems that could arise while you develop a game for the Android platform. Solutions are provided in a well-tested, thought-out approach that is easy to follow and easy to adapt to multiple situations.

Let’s say you know the theory behind what goes into chicken soup, but you are unsure how to turn some chicken and vegetables into soup. Consulting a standard, kitchen cookbook would give you a step-by-step recipe to create the soup. In much the same way, you will be able to use Android Game Recipes to find out exactly how to code specific scenarios in a game—from creating a splash screen to using collision detection when destroying an enemy.

Before you move on to the recipes, it’s important to establish the proper framework to get the most out of them. In this chapter, we will discuss what skills and tools you will need to get the most out of this book.

What You Will Need

Game programming, as a discipline, is complex and can take years to master. However, the basic concepts of game programming are actually relatively simple to learn and can be reused in many situations. The amount of time that you put into your games and your code will ultimately determine how successful you and your games are. Everyone runs into that one problem when coding which, no matter how long you scratch your head, or how many times you search on Google, you just cannot get an exact solution for. This book is designed to be your solution to many of these problems.

Skills and Experience

This book is not aimed at beginners or people who have no game development experience. You will not learn how to develop an entire game from scratch by reading this book. This is not to say that you need to be a professional game developer to use this book. To the contrary, it is assumed that by reading this book you are most likely a casual game developer; you are likely to be someone who might have tried to create a game or two (possibly even for Android) and has run into a problem converting some of your development knowledge to the Android platform.

This book is focused on helping you through specific problems or scenarios. Therefore, you should have at least a working knowledge of game development, and at least a basic knowledge of Android-specific development. Neither topic will be covered from the perspective of a “from scratch” primer.

Since Android is developed in Java, you should also possess a good, working knowledge of Java development. There will be no tutorials on how Java works, and it may be implied during certain scenarios that you know the meaning behind the structure of Java.

It is possible however, that you may have some game development experience on another platform—such as Windows—and possibly even some business-level Java experience, and never have used OpenGL ES. Most of the time, developing a game for Android will require use of OpenGL ES. For this reason, the second part of this chapter is dedicated to introducing you to OpenGL ES and explaining why it is important to Android. If you already have experience with OpenGL ES, feel free to skip that part of this chapter, “OpenGL ES at a Glance.”

In short, if you have a passion for game development and a passion for Android, but are running into some problems in your development, this book is for you. Whether you have already started to develop a game and are running into problems, or you are in the beginning stages of your development and are unsure what to do next, Android Games Development Recipes will guide you through the most common roadblocks and issues.

Software Versions

At this point, you are probably ready to dive right into finding solutions for your Android game scenarios. So what tools do you need to begin your journey?

This book is geared toward Android 4.1 and 4.2 Jelly Bean. If you are not working in Jelly Bean, it is recommended that you upgrade your SDK at http://developer.android.com/sdk/. However, the examples should also work on Android 4.0 Ice Cream Sandwich. There are many resources to help you download and install the SDK (and the corresponding Java components that you might need) if you need help doing so; however, this book will not cover installing the SDK.

You will also be using the Kepler version of Eclipse. One of the great features of Eclipse is that it will support multiple versions of Android SDKs. Therefore, you can quickly test your code in Jelly Bean, Ice Cream Sandwich, or even Gingerbread if needed. While you can use almost any Java IDE or text editor to write Android code, I prefer Eclipse because of features such as this and the well-crafted plug-ins that tightly integrate to many of the more tedious manual operations of compiling and debugging Android code. After all, Eclipse is the official Android development IDE recommended by Google, the creator of Android.

If you do not already have Eclipse Kepler, and want to give it a try, it is a free download fromhttp://eclipse.org.

This book will not dive into the download or setup of Eclipse. There are many resources, including those on Eclipse’s own site and the Android Developer’s Forum, that can help you set up your environment should you require assistance.

Tip   If you have never installed Eclipse or a similar IDE, follow the installation directions carefully. The last thing you want is an incorrectly installed IDE impeding your ability to write great games.

In the next section, we will explore one of the most used tools in creating games on the Android platform, OpenGL ES.

OpenGL ES at a Glance

OpenGL ES, or OpenGL for Embedded Systems, is an open source graphics API that is packaged with the Android SDK. While there is limited support for working with graphics using core Android calls, it would be extremely difficult—if not impossible—to create an entire game without using OpenGL ES. Core Android graphics calls are slow and clunky, and with few exceptions, should not be used for gaming. This is where OpenGL ES comes in.

OpenGL ES has been included with Android, in one form or another, since the very beginning of the platform. In earlier versions of Android, the implementation of OpenGL ES was a limited version of OpenGL ES 1. As Android grew, and versions of Android matured, more feature-rich implementations of OpenGL ES were added. With Android version Jelly Bean, developers have access to OpenGL ES 2 for game development.

So what exactly does OpenGL ES do for you, and how does it do it? Let’s find out.

How OpenGL ES Works with Android

Open GL ES communicates with the graphic hardware in a much more direct manner than a core Android call. This means that you are sending data directly to the hardware that is responsible for processing it. A core Android call would have to go through the core Android processes, threads, and interpreter before getting to the graphics hardware. Games written for the Android platform can only achieve an acceptable level of speed and playability by communicating directly with the GPU (Graphics Processing Unit).

Current versions of Android have the ability to use either OpenGL ES 1 or OpenGL ES 2 / 3 calls. There is a big difference between the two versions, and which one you use will play a role in determining who can run your game, and who will not be able to.

Note   All of the examples in this book that include OpenGL ES code are given in both OpenGL ES version 1 and OpenGL ES version 2 / 3.

OpenGL ES facilitates this interaction between your game and the graphics hardware in one of two different ways. The type of GPU employed in the Android device running your game will determine which version of OpenGL ES you use, thus how OpenGL will interact with the hardware. There are two major kinds of graphics hardware in the market, and because they are very different, two different versions of OpenGL ES are required to interact with them.

The two different types of hardware are those with a fixed-function pipeline, and those with shaders. The next few sections quickly review OpenGL ES and fixed-function pipelines, and OpenGL ES and shaders.  Keep in mind, OpenGL ES version 1 runs on fixed-function piplelines, while OpenGL ES 2 / 3 runs on shaders.

Fixed-Function Pipelines

Older devices will have hardware that employs a fixed-function pipeline. In these older GPUs, there was specific dedicated hardware for perform functions. Functions, such as transformations, were performed by dedicated parts of the GPU that you, as a developer, had little to no control over. This means that you would simply hand your vertices to the GPU, tell it to transform the vertices, and that’s it.

An example of a transformation can be when you have a set of vertices representing a cube, and you want to move that cube from one location to another. This would be accomplished by putting the vertices into the fixed-function pipeline, and then telling the hardware to perform a transformation on those vertices. The hardware would then do the matrix math for you and determine the placement of the final cube.

In the following code, you will see a very simplified version of what you would do in a fixed-function pipeline. The vertices myVertices are sent into the pipeline. The glTranslatef() is then used to translate the vertices to new positions. The ensuing matrix math is done for you in the GPU.

private float myVertices[] = {
0.0f, 0.0f, 0.0f,
   1.0f, 0.0f, 0.0f,
   1.0f, 1.0f, 0.0f,
   0.0f, 1.0f, 0.0f,
};

//Other OpenGL and game stuff//

gl.glMatrixMode(GL10.GL_MODELVIEW)
gl.glLoadIdentity();
gl.glTranslatef(0f, 1f, 0f);

The advantage of this was that in using dedicated hardware, the function could be performed very quickly. Hardware can perform functions at very fast rates, and dedicated hardware—or hardware that has a very limited function set—can perform functions even faster.

The disadvantage to this fixed-function pipeline approach is that hardware cannot be changed or reconfigured like software can. This limits the usefulness of the hardware moving forward. Also, specialized hardware can only perform functions on one queue item at a time. This means that the pipeline can often be slowed down if there are a great amount of items waiting in the queue to be processed.

Newer devices, on the other hand, have GPUs that use shaders. A shader is still a specialized piece of hardware, but it is much more flexible than its fixed-function predecessor. OpenGL ES works with shaders by using a programming language called GLSL or OpenGL Shading Language to perform any number of programmable tasks.

Shaders

A shader is a software program, written in a shader language, that performs all of the functionality that used to be handled by the fixed-function hardware. OpenGL ES 2 / 3 works with two different types of shaders: vertex shaders and fragment shaders.

Vertex Shaders

A vertex shader performs functions on vertices, such as transforming the color, position, and texture of the vertex. The shader will run on every vertex passed into it. This means that if you have a shape made from 256 vertices, the vertex shader will run on each one of them.

Vertices can be small or large. However, in all cases, vertices will consist of many pixels. The vertex shader will work on all of the pixels in a single vertex the same way. All of the pixels within a single vertex are treated as a single entity. When the vertex shader is finished, it passes the vertex downstream to the rasterizer, and then on to the fragment shader.

Following is a basic vertex shader:

private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "attribute vec2 TexCoordIn;" +
        "varying vec2 TexCoordOut;" +
        "void main() {" +
        "  gl_Position = uMVPMatrix * vPosition;" +
        "  TexCoordOut = TexCoordIn;" +
        "}";

Fragment Shaders

Whereas vertex shaders process data for an entire vertex, fragment shaders—sometimes known as pixel shaders—work on each pixel. The fragment shader will make computations for lighting, shading, fog, color, and other things that would affect single pixels within a vertex. Processes for gradients and lighting are performed on the pixel level because they can be applied differently across a vertex.

Following is a basic fragment shader:

    private final String fragmentShaderCode =
        "precision mediump float;" +
        "uniform vec4 vColor;" +
        "uniform sampler2D TexCoordIn;" +
        "varying vec2 TexCoordOut;" +
        "void main() {" +
        "  gl_FragColor = texture2D(TexCoordIn, TexCoordOut);" +
        "}";

Note   There are other types of shaders including Tessellation shaders and Geometry shaders. These can be optional and are handled within the hardware. You will have little to no awareness into their operation.

Most Android devices now can handle a combination of OpenGL ES 1 and OpenGL ES 2 calls. Some developers, if they are uncomfortable with programming shaders, will continue to use fixed-function pipeline calls for the viewport and other dynamics. Be aware that as OpenGL progresses, compatibility with the fixed-function pipeline calls of OpenGL ES is being phased out. There will be a time in the very near future when you will be forced to use only shaders within OpenGL ES. Therefore, if you are at an early point in your career with OpenGL ES, I would suggest making an earnest effort to use shaders whenever possible.

How Games Work

When developing a game or a game loop, the code needs to be executed in a certain order, at certain times. Knowing this execution flow is crucial in understanding how your code should be set up.

The following sections will outline a basic game flow or game loop.

A Basic Game Loop

At the core of every video game is the game engine, and part of that game engine is the game loop. As the name suggests, the game engine is the code that powers the game. Every game, regardless of the type of game—whether it is an RPG, a first-person shooter, a platformer, or even an RTS—requires a fully featured game engine to run.

The game engine typically runs on its own thread, giving it as many resources as possible. All of the tasks that a game needs to run, from graphics to sound, are taken care of in the game engine.

Note   The engine of any one game is purposely built to be generic. This allows it to be used and reused in multiple situations, possibly for different games.

One very popular multipurpose game engine is the Unreal engine. The Unreal engine, first developed around 1998 by Epic for its first-person shooter, Unreal, has been used in hundreds of games. The Unreal engine is easily adaptable and works with a variety of game types, not just first-person shooters. This generic structure and flexibility make the Unreal engine popular with not only professions but casual developers as well.

Chances are, in your game development, you might have used a third-party game engine. There are many free and fee-based ones available for Android. This book will be of far greater help to you, though, if you are looking to build your own game engine.

Many of the processes in third-party game engines become obfuscated, and you might not have access to the debugging capability or you might not be able to modify the code within the engine. When you have a problem, you will generally have to turn to the company that developed the engine, and it could take time for the original developer to fix it—if they even fix it at all. This can be a major drawback if you are thinking about using a third-party game engine.

There is no substitute for the experience of building your own game engine. This book assumes that you are doing just that. Many of the problems that will be tackled in the rest of this book assume you are attempting to write a game engine on Android and are running into some common problems.

So what exactly does the game engine do? The game engine handles all of the grunt work of the game execution, anything from playing the sound effects and background music to rendering graphics onto the screen. The following is a partial list of the functions that a typical game engine will perform.

  • Graphics rendering
  • Animation
  • Sound
  • Collision detection
  • Artificial intelligence (AI)
  • Physics (non-collision)
  • Threading and memory management
  • Networking
  • Command interpreter (IO)

At the core of the game engine is the game loop. While the engine can handle anything from setting up one-time vertices buffers and retrieving images, the game loop serves up the actual code execution of the game.

All games are executed in a code loop. The faster this loop can execute, the better the game will run, the quicker it will react to the player, and the smoother the action will appear on the screen. All of the code necessary to build drawing on the screen, move the game objects, tally the score, detect the collisions, and validate or invalidate items is executed within the game loop.

A game loop is exactly that, a group of code that is executed on a continuous loop. The loop is started when the game begins, and does not stop executing—with some exceptions—until the game is stopped. Let’s take a look at all of the things a game loop can be expected to do on every one of its iterations. A typical game loop can do the following:

  • Interpret the commands of an input device
  • Track the characters and/or the background to make sure none move where they should not be able to move to
  • Test for collisions between objects
  • Move the background as needed
  • Draw a background
  • Draw any number of stationary items
  • Calculate the physics of any mobile objects
  • Move any weapons/bullets/items that have been repositioned
  • Draw weapons/bullets/items
  • Move the characters independently
  • Draw the characters
  • Play sound effects
  • Spin off threads for continuous background music
  • Track the player’s score
  • Track and manage networked or multiple players

This is not be a comprehensive list, but it is a fairly good list of all of the things expected to be done within the game loop.

It is very important to refine and optimize all of your game code. The more optimized you can make your code in the game loop, the faster it will execute all of the calls it needs to make, thus giving you the best possible gaming experience. In the next section, we will take a look at how Android, as a platform, handles game engines and game loops.

Android and Game Engines

Android is packaged with a powerful, fully featured graphics API called OpenGL ES. But is OpenGL ES absolutely necessary for game development? Rather than go through the trouble of learning a fairly low-level API, such as OpenGL ES, can you just write a game with core Android API calls?

The short answer is that for a game to run efficiently, it cannot rely on the core Android API calls to do this kind of heavy duty work. Yes, most Android does have core calls that could take care of every item on this list. However, the rendering, sound, and memory systems of Android are built for generic tasks and adapt to any number of unpredictable uses, without specializing in any one. Unpredictability means one thing: overhead. The core Android API calls that could take care of the jobs needed to run a game come with a lot of extraneous code. This is acceptable if you are writing business applications, but not if you are writing games. Overhead adds slowness to your code, and games require something with a little more power.

For a game to run smoothly and quickly, the code will need to bypass the overhead that is inherent in core Android API calls; that is, a game should communicate directly with the graphics hardware to perform graphics function, communicate directly with the sound card to play sound effects, and so on. If you were to use the standard memory, graphics, and sound systems that are available to you through core Android API, your game could be threaded with all of the other Android applications that are running on the system. This would make for a choppy looking game that would run very slowly.

For this reason, game engines and game loops are almost always coded in low-level languages or specific API, such as OpenGL ES. As we will touch on in Chapter 2, low-level languages offer a more direct path to the hardware of the system. A game engine needs to be able to take code and commands from the engine and pass them directly to the hardware. This allows the game to run quickly and with all of the control that it needs to be able to provide a rewarding experience.

Summary

In this chapter, we covered what tools you will need to get the most out of this book. Android version Jelly Bean, Eclipse Kepler, and some basic Java and/or game development experience will help you throughout the remainder of this book. We also covered the differences between OpenGL ES versions 1 and 2 / 3, and the difference between fixed pipelines and shaders.

In the next few chapters, we will begin to look at some of the problems in a typical game engine. More specifically, we will look at the problems that could occur with the different ways to load an image. There are many different image formats and a handful of different ways to load these images and display them to the screen. Chances are, if you have tried, you have run into some pretty unexpected results.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.145.179.252