Chapter 6. Physics

In the last chapter, we introduced one of the ways to move a character in AndEngine using the entity modifiers. However, for our game, we are going to use a physics engine. In this chapter, we will first introduce the physics engine used in AndEngine. We are also going to explain basic physics terms, such as force and velocity, and how they are used in AndEngine. We will cover the limitations of the physics engine too.

In the second part of this chapter, we will implement some of the actions of our character using the physics engine and accelerometer readings. We will also add platforms and the enemy to the game and define them as physics bodies.

The physics engine

AndEngine uses the Android port of the Box2D physics engine. Box2D is very popular in games, including the most popular ones such as Angry Birds, and many game engines and frameworks use Box2D to simulate physics. It is free, open source, and written in C++, and it is available on multiple platforms. AndEngine offers a Java wrapper API for the C++ Box2D backend, and therefore, no prior C++ knowledge is required to use it.

Box2D can simulate 2D rigid bodies. A rigid body is a simplification of a solid body with no deformations. Such objects do not exist in reality, but if we limit the bodies to those moving much slower than the speed of light, we can say that solid bodies are also rigid.

Box2D uses real-world units and works with physics terms. A position in a scene in AndEngine is defined in pixel coordinates, whereas in Box2D, it is defined in meters. AndEngine uses a pixel to meter conversion ratio. The default value is 32 pixels per meter.

Basic terms

Box2D works with something we call a physics world. There are bodies and forces in the physics world. Every body in the simulation has the following few basic properties:

  • Position
  • Orientation
  • Mass (in kilograms)
  • Velocity (in meters per second)
  • Torque (or angular velocity in radians per second)

Forces are applied to bodies and the following Newton's laws of motion apply:

  • The first law, An object that is not moving or moving with constant velocity will stay that way until a force is applied to it, can be tweaked a bit
  • The second law, Force is equal to mass multiplied by acceleration, is especially important to understand what will happen when we apply force to different objects
  • The third law, For every action, there is an equal and opposite reaction, is a bit flexible when using different types of bodies

Body types

There are three different body types in Box2D, and each one is used for a different purpose. The body types are as follows:

  • Static body: This doesn't have velocity and forces do not apply to a static body. If another body collides with a static body, it will not move. Static bodies do not collide with other static and kinematic bodies. Static bodies usually represent walls, floors, and other immobile things. In our case, they will represent platforms which don't move.
  • Kinematic body: This has velocity, but forces don't apply to it. If a kinematic body is moving and a dynamic body collides with it, the kinematic body will continue in its original direction. Kinematic bodies also do not collide with other static and kinematic bodies. Kinematic bodies are useful to create moving platforms, which is exactly how we are going to use them.
  • Dynamic body: A dynamic body has velocity and forces apply to it. Dynamic bodies are the closest to real-world bodies and they collide with all types of bodies. We are going to use a dynamic body for our main character.

Note

It is important to understand the consequences of choosing each body type. When we define gravity in Box2D, it will pull all dynamic bodies to the direction of the gravitational acceleration, but static bodies will remain still and kinematic bodies will either remain still or keep moving in their set direction as if there was no gravity.

Fixtures

Every body is composed of one or more fixtures. Each fixture has the following four basic properties:

  • Shape: In Box2D, fixtures can be circles, rectangles, and polygons
  • Density: This determines the mass of the fixture
  • Friction: This plays a major role in body interactions
  • Elasticity: This is sometimes called restitution and determines how bouncy the object is

There are also special properties of fixtures such as filters and filter categories, which we will cover in Chapter 8, Advanced Physics, and a single Boolean property called sensor.

Shapes

The position of fixtures and their shapes in the body determine the overall shape, mass, and the center of gravity of the body.

The upcoming figure is an example of a body that consists of three fixtures. The fixtures do not need to connect. They are part of one body, and that means their positions relative to each other will not change.

The red dot represents the body's center of gravity. The green rectangle is a static body and the other three shapes are part of a dynamic body. Gravity pulls the whole body down, but the square will not fall.

Shapes

Density

Density determines how heavy the fixtures are. Because Box2D is a two-dimensional engine, we can imagine all objects to be one meter deep. In fact, it doesn't matter as long as we are consistent.

There are two bodies, each with a single circle fixture, in the following figure. The left circle is exactly twice as big as the right one, but the right one has double the density of the first one. The triangle is a static body and the rectangle and the circles are dynamic, creating a simple scale. When the simulation is run, the scales are balanced.

Density

Friction

Friction defines how slippery a surface is. A body can consist of multiple fixtures with different friction values. When two bodies collide, the final friction is calculated from the point of collision based on the colliding fixtures.

Friction can be given a value between 0 and 1, where 0 means completely frictionless and 1 means super strong friction. Let's say we have a slope which is made of a body with a single fixture that has a friction value of 0.5, as shown in the following figure:

Friction

The other body consists of a single square fixture. If its friction is 0, the body slides very fast all the way down. If the friction is more than 0, then it would still slide, but slow down gradually. If the value is more than 0.25, it would still slide but not reach the end. Finally, with friction close to 1, the body will not move at all.

Elasticity

The coefficient of restitution is a ratio between the speeds before and after a collision, and for simplicity, we can call the material property elasticity. In the following figure, there are three circles and a rectangle representing a floor with restitution 0, which means not bouncy at all. The circles have restitutions (from left to right) of 1, 0.5, and 0.

Elasticity

When this simulation is started, the three balls will fall with the same speed and touch the floor at the same time. However, after the first bounce, the first one will move upwards and climb all the way to the initial position. The middle one will bounce a little and keep bouncing less and less until it stops. The right one will not bounce at all. The following figure shows the situation after the first bounce:

Elasticity

Sensor

When we need a fixture that detects collisions but is otherwise not affected by them and doesn't affect other fixtures and bodies, we use a sensor. A goal line in a 2D air hockey top-down game is a good example of a sensor. We want it to detect the disc passing through, but we don't want it to prevent the disc from entering the goal.

The physics world

The physics world is the whole simulation including all bodies with their fixtures, gravity, and other settings that influence the performance and quality of the simulation.

Note

Tweaking the physics world settings is important for large simulations with many objects. These settings include the number of steps performed per second and the number of velocity and position interactions per step.

The most important setting is gravity, which is determined by a vector of gravitational acceleration. Gravity in Box2D is simplified, but for the purpose of games, it is usually enough. Box2D works best when simulating a relatively small scene where objects are a few tens of meters big at most.

Tip

To simulate, for example, a planet's (radial) gravity, we would have to implement our own gravitational force and turn the Box2D built-in gravity off.

Forces and impulses

Both forces and impulses are used to make a body move. Gravity is nothing else but a constant application of a force. While it is possible to set the position and velocity of a body in Box2D directly, it is not the right way to do it, because it makes the simulation unrealistic.

To move a body properly, we need to apply a force or an impulse to it. These two things are almost the same. While forces are added to all the other forces and change the body velocity over time, impulses change the body velocity immediately. In fact, an impulse is defined as a force applied over time.

We can imagine a foam ball falling from the sky. When the wind starts blowing from the left, the ball will slowly change its trajectory. Impulse is more like a tennis racket that hits the ball in flight and changes its trajectory immediately.

There are two types of forces and impulses: linear and angular. Linear makes the body move left, right, up, and down, and angular makes the body spin around its center. Angular force is called torque.

Linear forces and impulses are applied at a given point, which will have different effects based on the position. The following figure shows a simple body with two fixtures and quite high friction, something like a carton box on a carpet. First, we apply force to the center of the large square fixture.

Forces and impulses

When the force is applied, the body simply moves on the ground to the right a little. This is shown in the following figure:

Forces and impulses

Second, we try to apply force to the upper-right corner of the large box. This is shown in the following figure:

Forces and impulses

Using the same force at a different point, the body will be toppled to the right side. This is shown in the following figure:

Forces and impulses

Joints

When a body is assembled from different fixtures, the fixtures never move relatively to each other. Joints link multiple bodies together. They can fix all degrees of freedom or fix only some of them. Joints are a more advanced topic that will be covered in Chapter 8, Advanced Physics.

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

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