The game file to import and load for this session is 5961_06_10.stencyl
.
Level Completed
, with a Background Color of yellow. Leave all the other settings at their default configuration.Fruit Collected
.Collides with Collectibles
event so it appears as shown in the following screenshot. The changes are listed in the subsequent steps:We have created a new Fruit Collected
event in the Score Management
scene behavior, which switches to a new scene when all the fruit actors have been collected, and we have also modified the Collides with Collectibles
event in the Manage Player Collisions
actor behavior in order to count how many pieces of fruit remain to be collected.
When testing the game we can see that, each time a piece of fruit is collected, the new value of the Fruit Required
attribute is displayed in the debug console, and when all the fruit actors have been collected, the yellow Level Completed
scene is displayed.
The first step was to create a blank Level Completed
scene, which will be switched to when all the fruit actors have been collected. As with the Game Over
scene that we created earlier in this chapter, it is a temporary scene that enables us to easily determine when the task of collecting the fruit has been completed successfully for testing purposes.
We then created a new custom event called Fruit Collected
in the Score Management
scene behavior. This custom event waits for the FruitCollected
event trigger to occur, and when that trigger is received, the Fruit Required
attribute is decremented by 1
and its new value is displayed in the debug console. A test is then carried out to determine if the value of the Fruit Required
attribute is equal to zero, and if it is equal to zero, the bright yellow, temporary Level Completed
scene will be displayed!
Our final task was to modify the Collides with Collectibles
event in the Manage Player Collisions
actor behavior. We inserted an if…
block to test the collectible actor's Collected
value; remember that we initialized this value to false
in the previous section, Time for action – counting the fruit. If the Collected
value for the fruit actor is still false
, then it hasn't been collected yet, and the instructions contained within the if …
block will be carried out. Firstly, the fruit actor's Collected
value is set to false
, which ensures that this event cannot occur again for the same piece of fruit. Next, the FruitCollected
custom event in the Score Management
scene behavior is triggered. Following that, the do after 0.5 seconds
block is executed, and the fruit actor will be killed.
We have also added an if … of group is alive
check that is carried out before the collectible actor is killed. Because we are killing the actor after a delay of 0.5
seconds, it's good practice to ensure that the actor still exists before we try to kill it! In some games, it may be possible for the actor to be killed by other means during that very short 0.5
second delay, and if we try to kill an actor that does not exist, a
runtime error may occur, that is, an error that happens while the game is being played. This may result in a technical error message being displayed to the player, and the game cannot continue; this is extremely frustrating for players, and they are unlikely to try to play our game again!
A very common problem experienced by game designers, who are new to Stencyl, occurs when a collision between two actors is repeatedly detected. When two actors collide, all collision events that have been created with the purpose of responding to that collision will be triggered repeatedly until the collision stops occurring, that is, when the two actors are no longer touching. If, for example, we need to update the value of an attribute when a collision occurs, the attribute might be updated dozens or even hundreds of times in only a few seconds!
In our game, we want collisions between the monkey actor and any single fruit actor to cause only a single update to the
Fruit Required
attribute. This is why we created the actor value Collected
for each fruit actor, and this value is initialized to be false
, not collected, by the Initialize Fruit Required
event in the Score Management
scene behavior. When the Collides with Collectibles
event in Manage Player Collisions
actor behavior is triggered, a test is carried out to determine if the fruit actor has already been collected, and if it has been collected, no further instructions are carried out. If we did not have this test, then the FruitCollected
custom event would be triggered numerous times, and therefore the Fruit Required
attribute would be decremented numerous times, causing the value of the Fruit Required
attribute to reach zero almost instantly; all because the monkey collided with a single fruit actor!
Note that, rather than utilizing an actor value to record whether or not a fruit actor has been collected, we could have created a new attribute and initialized and updated the attribute in the same way that we initialized and updated the actor value. However, this would have required more effort to configure, and there is no perceptible impact on performance when using actor values in this manner. Some Stencyl users never use actor values (preferring to always use attributes instead), however, this is purely a matter of preference and it is at the discretion of the game designer which method to use.
In order to demonstrate what happens when the actor value Collected
is not used to determine whether or not a fruit actor has been collected, we can simply deactivate the set actor value Collected for … of group to true
instruction block in the Collides with Collectibles
event. After deactivating the block, run the game with the debug console open, and allow the monkey to collide with a single fruit actor. The Fruit Required
attribute will instantly be decremented multiple times, causing the level to be completed after colliding with only one fruit actor!
18.118.16.229