Part 18 - Exploding Monsters

Time to have the monsters explode into bits of jelly when we shoot them. Another new asset:

Right click and save this image into the data/texture folder of our project as “jelly.png”.

Every monster will explode into several of these jelly objects when shot.

Create graphics for the jelly frames:

[JellyGraphic]
Texture		= jelly.png
TextureOrigin	= (0, 0, 0)
TextureSize	= (32, 32, 0)
Pivot		= center

Then an individual JellyObject:

[JellyObject]
Graphic      = JellyGraphic
AnimationSet = JellyAnimationSet
Speed        = (-50, -50, 0) ~ (50, -50, 0)
Position     = (0, -300, 0)
Body         = JellyBody

Next to make the JellyAnimationSet:

[JellyAnimationSet]
Texture			= jelly.png
FrameSize		= (32, 32, 0)
JellyWobbleAnim		= -1
StartAnim		= JellyWobbleAnim
JellyWobbleAnim->	= JellyWobbleAnim
Pivot			= center
 
[JellyWobbleAnim]
KeyDuration = 0.08

The jelly needs a body. This is so the bits will bounce nicely over the platforms:

[JellyBody]
Dynamic  = true
PartList = JellyBodyPart
 
[JellyBodyPart]
Type        = sphere
Radius      = 10
Solid       = true
SelfFlags   = jelly
CheckMask   = platforms

Then let the platforms know about the jelly, by adding it the platform's mask:

[PlatformBodyPart]
Type        = box
Solid       = true
SelfFlags   = platforms
CheckMask   = hero # monster # jelly

Test it by adding a JellyObject to the Scene section:

[Scene]
ChildList = PlatformObject # MiddlePlatformObject #
TopLeftPlatformObject # TopPlatformObject #
TopRightPlatformObject #
StarObject # JellyObject
TrackList = MonsterMakerTrack

Run it and a jelly with drop onto the platform:

That's not bad, but really… the animation frame setup isn't quite what we're after. In our JellyAnimationSet we're just letting Orx automatically take the three frames in the sprite sheet. We really need four frames:

That is how the animation should be. Thankfully Orx will let us specify the third and fourth frames for an animation manually. Add the following config to set this up:

[JellyWobbleAnim3]
TextureOrigin = (0, 0, 0)
 
[JellyWobbleAnim4]
TextureOrigin = (64, 0, 0)

Great. By using the name of the animation (JellyWobbleAnim) + the frame number, now frames 3 and 4 are overridden in the sheet while frames 1 and 2 are picked up automatically by Orx.

The next step is to create an explosion object. This will be an empty object that contains a spawner. The spawner will shoot out five jellies. These explosion objects can be placed on any monster for dramatic effect:

[JellyExploder]
Spawner         = JellySpawner
 
[JellySpawner]
Object          = JellyObject
WaveSize        = 5
WaveDelay       = 0.1
TotalObject     = 5

To test one of the these, remove the JellyObject from the Scene section and add the JellyExploder instead:

[Scene]
ChildList = PlatformObject # MiddlePlatformObject #
TopLeftPlatformObject # TopPlatformObject #
TopRightPlatformObject #
StarObject # JellyExploder
TrackList = MonsterMakerTrack

Run the game to test the exploder:

Great, we see a bunch of jelly blobs appear. Remove the JellyExploder from the Scene selector:

[Scene]
ChildList = PlatformObject # MiddlePlatformObject #
TopLeftPlatformObject # TopPlatformObject #
TopRightPlatformObject #
StarObject
TrackList = MonsterMakerTrack

Also remove the Position parameter from the JellyObject because these will soon be dynamically placed. Also change the Speed parameter to be more dramatic:

[JellyObject]
Graphic      = JellyGraphic
AnimationSet = JellyAnimationSet
Speed        = (-50, -250, 0) ~ (50, -450, 0)
Body         = JellyBody

Next, we need to ensure that the BulletObject has a body and that it can collide with a monster:

[BulletObject]
Graphic  = BulletGraphic
LifeTime = 1.0
Scale    = 0.25
Body     = BulletBody
 
 
[BulletBody]
Dynamic  = false
PartList = BulletBodyPart
 
[BulletBodyPart]
Type        = box
Solid       = false
SelfFlags   = bullet
CheckMask   = monster

The bullets are not affected by gravity (not Dynamic) nor do they bounce off other objects (not Solid).

In order to make a monster explode, we can make a function in the code which will create a exploder object on top off a monster object, and then destroy the monster itself:

void CreateExplosionAtObject(orxOBJECT *object, orxSTRING exploderObjectName)
{
    if (object == orxNULL)
        return;
 
    orxVECTOR objectVector;
    orxObject_GetWorldPosition(object, &objectVector);
    objectVector.fZ = 0.0;
 
    orxOBJECT *explosion = orxObject_CreateFromConfig(exploderObjectName);
 
    orxObject_SetPosition(explosion, &objectVector);
}

We are passing in a named exploderObjectName so that we can re-use this function later for other exploders we'll make.

Now to use it. In the physics event, add a check for collision between a bullet and a monster and process it:

if (orxString_Compare(recipientObjectName, "StarObject") == 0){
    orxObject_SetLifeTime(pstRecipientObject, 0);
}
 
if (orxString_Compare(senderObjectName, "BulletObject") == 0){
    CreateExplosionAtObject(pstRecipientObject, "JellyExploder");
    orxObject_SetLifeTime(pstSenderObject, 0);
    orxObject_SetLifeTime(pstRecipientObject, 0);
}
 
if (orxString_Compare(recipientObjectName, "BulletObject") == 0){
    CreateExplosionAtObject(pstSenderObject, "JellyExploder");
    orxObject_SetLifeTime(pstSenderObject, 0);
    orxObject_SetLifeTime(pstRecipientObject, 0);
}

So in both cases, create the JellyExplosion on top of a monster, then destroy both the monster and the bullet that hit it.

Compile and run. You'll get some crazy jelly action all over the screen:

The jelly blobs never disappear. Fix that by giving it a specific lifetime:

[JellyObject]
Graphic      = JellyGraphic
AnimationSet = JellyAnimationSet
Speed        = (-50, -250, 0) ~ (50, -450, 0)
Body         = JellyBody
LifeTime     = 5

Next: Part 19 - The Hero's survival.