For our game we will need to add physics to keep our hero firmly on the ground.
The first thing to do is to enable physics in the config:
[Physics] AllowSleep = false Gravity = (0.0, 2400.0, 0.0)
This will set the strength and direction of the gravity and stops the physics being applied when objects settle. Our gravity will be pretty strong at 2400.
In order for physics to act on an object, the object needs to have a body. Let's add one to our hero:
[HeroObject] Graphic = HeroGraphic Position = (50, 400, 0) Scale = 2 AnimationSet = HeroAnimationSet Body = HeroBody
Now to define the HeroBody section:
[HeroBody] Dynamic = true PartList = HeroBodyPart
Dynamic means that the object is affected by physics and gravity. Each Body must have at least one body part. Define that next:
[HeroBodyPart] Type = box Solid = true
The type is box and that means the collision area is a box shape surrounding the object. The part is also set to solid. That means that the object will not be able to pass through other solid body parts.
Run that and you'll see our hero fall right through the floor. So that's good. The physics body is working. But we need to get the platforms solid too.
[PlatformObject] Graphic = PlatformGraphic Position = (0, 570, 0) Scale = (54, 2, 0) Repeat = (27, 1, 0) Body = PlatformBody
Now the body and body part for a platform object:
[PlatformBody] Dynamic = false PartList = PlatformBodyPart [PlatformBodyPart] Type = box Solid = true
Notice the slight difference from the hero body. The PlatformBody is not dynamic, so it won't be affected by gravity. But the PlatformBodyPart is set to solid. This will allow the hero to collide with the platform without it falling away.
But the two won't affect each other until you set collision flags.
First, set the flags on the HeroBodyPart:
[HeroBodyPart] Type = box Solid = true SelfFlags = hero CheckMask = platforms
The SelfFlags is a string that descibes the object and the CheckMask is a mask list of other object SelfFlags it can collide with.
Now set the PlatformBodyPart flags:
[PlatformBodyPart] Type = box Solid = true SelfFlags = platforms CheckMask = hero
So both objects are set to collide with each other.
Run the game and our hero will land and stay on the floor.
But he kind of hangs into the floor. What's happening here? Turn on the physics debug to see why:
[Physics] AllowSleep = false Gravity = (0.0, 2400.0, 0.0) ShowDebug = true
You can see the boxes that surround the bodies. The hero's object is off-centre with his body. The graphic for the hero has a centered pivot, and our animation set needs to have the same:
[HeroAnimationSet] Texture = soldier_full.png Pivot = center FrameSize = (32, 32, 0) StartAnim = HeroRun HeroRun = 6
The step above may not be required. Needs to be checked.
Run that up and you should get the following:
Much better. Don't forget to turn off the physics debugging before continuing.
Next, Part 10 - Input Controls.