Section 4 – Farm Game
Applying actions to collision
For our next project we will make a small farming game.
Where the player can walk around a small 5 by 5 grid and plant crops
that will reward the player with points after they expire. The
challenges we will need to overcome for this project are ensuring the
player cannot plant crops where crops have already been planted,
ensuring crops expire and increase the players score but also free the
area for another crop to be planted and keeping the player within a
border and not allowing them to move away from the payable zone.
First lets create a new project and create our global variable to keep
track of our score and also a few other bits of information we will need
to store for the game. use the alt button to access the top menu of the
G.D.E program and use the right arrow key to select "edit". from here
press down to select "Global variables" and hit enter.
global variable editor we will create the score variable but we will
also create 2 more variables to keep a record of the players
co-ordinates so we can place a crop in the same co-ordinates as the
player when one is planted. We will store the players X and Y properties
in a couple of variables and then when a crop is created we will set
their X and Y properties to those variable values.
various variables to do different things its better to keep them stored
in categories for better organisation. Lets tab to the "New Category"
button and hit enter. A new window will pop up to create our new
category and the only thing we need to enter is a name. Lets call it
locations, and store any location related variable in it, after typing
it in tab to submit and hit enter. Lets also create a category to put
the score variable in, do the same again but this time lets call it
"goals" to store anything goal related.
Tab to the new variable
button and hit enter. The first selected text field will be the name of
our new variable. Input "Score" and then tab to the value text field and
input a 0. Next tab to the category combo box which will have our
categories listed in it, select the "goals" item in the list and then
tab to the submit button and hit enter. This will take us back to the
variable editor window.
Create another variable but this time give it
the name "Player X" and give it a value of 4, since this will be the
starting X co-ordinate of our player object. For this one select the
"locations" item in the category list and then tab to submit and hit
enter. do the exact same thing again but call the next variable "Player
Y" and give it a value of 3.
When in the Global Variable Editor
we can tab to the category combo box which determines what variables are
displayed in the list. By default it is set to all, but you can select
one of the categories you have made and only they will be listed.
tab to "close" and hit enter to return back to the main G D E
Before we create our player object that will move around
planting crops, lets create the walls that will keep the player
contained. Use shift + F10 to bring up the Game Object tree menu when
the tree is focused on and select "Add Game Object".
the Game Objects name as "Left Wall". The X property should be set to 1
and Y set to 3. This means if it was on a grid it would be one across to
the right and 3 up. Set the BY to 2. This is the Y Boundary property ,
this property essentially tells us how tall we want the object to be. if
the Y property is set to 3 and the boundary for Y is set to 2, then the
object will be positioned 3 co-ordinates up and will stretch for 2 more
co-ordinates up and down which means it will take up Y co-ordinates from
1 to 5, creating a wall on the left side or our imaginary grid.
the walls collision event add a condition begin action. Tab to the
condition settings and select the "Col" option in the drop down box for
the variable. This option checks if the object is colliding with another
specified object. Tab and input the name "Player" which is an object we
haven't created yet but will shortly. The operator should stay as ==, if
we select any other operator it will check if the object isn't colliding
with Player as opposed to checking if it is. Tab to submit and hit
Next add a play audio action however this time do not
select "Self" in the "apply to" section, instead select the "collision"
option. This option forces the game object that the wall is colliding
with to perform the action rather than performing it itself, the
colliding object will be the player walking into it. Input the sound
name Thud and the volume as 1. The reason we want to apply this to the
player is because the player will play a walking sound when the user
presses the directional buttons. Telling the player object to play
another sound will cancel the walking audio and instead we will hear the
Next add an "Add X" action with a value of 1 below
the play audio action and again apply it to the collision object. This
action needs to be below the audio action because the play audio action
will be looking for a collision object but if we change the X
co-ordinate of the collision object before we apply our play audio
action to it,then it will no longer be colliding and the play audio
action will not be able to find it.
next add a condition end
action afterwards. This means we now have a wall object that will
trigger actions when the player walks in to it, not only that but it
will check it is colliding with the player and if so it will change the
players co-ordinate and increase its X co-ordinate by one which will
push the player further right by one space. This means the player cannot
pass the left wall.
We now need to create 3 more objects like
this one, to be the Top, Right and Bottom borders of our farming area.
Create a new object and give it the name "Top Wall" and give it a X
property of 4 and a Y property of 6. This time give the BX property a
value of 2 instead of the BY property. This means this wall object will
be further to the right and further up, one space above the left wall
object and will stretch in either direction by 2 co-ordinates, occupying
from X2 to X6. Add the same condition as the left wall object but
instead of increasing the players X co-ordinate by 1, decrease its Y
co-ordinate by 1 , which means when the player hits the top wall the
wall will reduce the Players Y co-ordinate by 1, making it move slightly
down. Submit this object.
Our next wall will be the Right Wall.
This wall will be at position X7 and Y3, with the BY property set to 2.
The collision event should be identical to the others except it will
subtract the player object X co-ordinate by one, meaning it pushes it to
Our last wall will be the Bottom Wall. This wall will
be at position X4 and Y0, with the BX property set to 2. The collision
event should be identical to the others except it will add the players Y
co-ordinate by one, meaning it pushes them further up.
have objects that will keep our player object from leaving the area, but
before creating the player object we keep referring to we will create
the "Crop" game object first that the player will plant. These objects
will be created when the player plants them and exist for a small amount
of time before destroying themselves, alerting the player and updating
create a new object and call it "Crop". We want the
crop to exist for a little while and then destroy itself but update the
score before it does. Firstly we need to make the crop get placed where
the player currently is, and we do that by placing it at the stored
Player X and Player Y variables we made earlier. We will make it so
every time the player object moves these variable are updated. Make sure
the creation event is selected in the event combo box. Our first actions
will be "set X" and "set Y" and instead of inputting a number, input the
variables names. So set X will have a value of "Player X" and the set Y
action will have a value of "Player Y". Next add a wait action to the
creation event, the only parameter you will need to fill in will be the
seconds the action is required to wait, lets enter 20. Ensure the wait
action is below the set X and Set Y actions. After the wait action we
will add an "Add Global Variable" action to increase the score variable
we made at the beginning of this tutorial. Enter the variable name
"Score" and the value 10. Although we have updated the score, we haven't
yet updated the Text to speech channel to hold the score in so it can be
spoken to the player. Text to speech channels are stored memory where we
input data to be played later, it can be text we input to be read or it
can be a variable name so the variables value will be said. In this
circumstance we want to cache the score variable value since the
variable has changed. Add a Set TTS Channel action. Input the name
"Score" into the Speech text field, and input a 0 into the channel text
field. Meaning we will load the score value into channel 0, to be played
Lastly we will add a play audio action, although we
haven't loaded any audio to be played yet, we will when we make the Init
Object and it saves us coming back just to add it afterwards. Add a play
audio action and input the name "Sprout" and the volume value as 1.
The last action we need to add is a "Destroy self" action, but we
need to add this onto the audio finished event. So in conclusion the
Crop object will be created and wait for 20 seconds, then it will
increase the global variable score by 10, then it will update the TTS
channel 0 to the new variable score value, then it will play the spout
audio to inform the user and then it will destroy itself when the sprout
Now we have our crop and wall objects we can now
make our player object. Create a new Game Object and call it "Player"
and sets its X property to 4 and its Y property to 3 which will place it
in the middle of the square space we have boxed in with our wall
Next we need to make the player object move but also
keep track of its location by updating the Player X and Player Y
variables. Select the left pressed event an add a subtract X action and
input a value of 1. Also input a play audio action and give it a sound
name of “Left Walk” and a volume value of 1. This will now move our
player left when the left button is pressed. Since we have altered the X
co-ordinate we should also add a "set global variable" action and set
"Player X" to X, which will change the Player X variable to the value of
this objects X value.
Now we will make the player move right. Select
the right pressed event an add an add X action and input a value of 1.
Also input a play audio action and give it a sound name of “Right Walk”
and a volume value of 1. This will now move our player right when the
right button is pressed. Also add an action to set the global variable
“Player X” to X.
Now we will make the player move forwards. Select
the up pressed event an add a add Y action and input a value of 1. Also
input a play audio action and give it a sound name of “Forward Walk” and
a volume value of 1. This will now move our player up when the up button
is pressed. Add a set global variable action and set “Player Y” to Y.
Now we will make the player move backwards. Select the down pressed
event an add a subtract Y action and input a value of 1. Also input a
play audio action and give it a sound name of “Backwards Walk” and a
volume value of 1. This will now move our player down when the down
button is pressed. Also add an action to change to global variable
“Player Y” to Y.
None the audio has yet been loaded so none of
the play audio actions will actually work yet, once we have made the
player object we will make an object who's only purpose is to create all
the other games objects and load the games audio before destroying
itself, and this object will be the games initial object.
next function we must add to the player is the ability to plant crops
using the 1 button. Go to the button 1 pressed event. We must ensure the
player is not standing on an already existing crop before we allow them
to plant another. We can do this by using a condition begin. Add a
condition begin to the button 1 pressed event and tab to the condition
settings. The variable combo box needs to be set to "Col" which is an
abbreviation of collision. This means it is not checking for a local or
global variable but instead checking for the collision of an object. Tab
to input text into the text field and enter the name of the object we
are checking for. In this case we are checking if the player object is
colliding with a crop object, so input the name "Crop". The operator
needs to be set to "NOT ==" which means it will check that the objects
are not colliding. If it was set to "==" it means it would only trigger
if the player was colliding with a crop. Any operator other than "=="
will change the condition to check there is not a collision rather than
checking if there is. Tab to submit and hit enter.
Next add a
create object action below the condition. Only one text field will be
available to specify what game object to create. Input the name "Crop"
and submit the action.
After the create object action add a play
audio action. Input the sound as “Plant” and the volume as 1.
that add a condition end action below the create object action.
Now whenever the player presses 1, it will check that the player is not
colliding with a Crop object and then create one if it isn't.
Next go to the Player objects Button 2 press event and add a Play TTS
Channel action. Input the channel 0 and submit the action. Now the
player can press button 2 to hear their score. After this we can submit
the Player game object.
The last object we will create will be
our Init Object. Its only purpose will be to create the player and the
wall objects and also load the audio we need for our project. Since this
project is only small it is fine to load all the audio at once, but in
larger games the Sonus may not be able to store all the audio in memory
at once. It would be better to unload audio that inst required at
certain parts of the game or the Sonus could fail to run the game
Lets create a new object and call it Loader. In its
creation event add 5 create object actions to create the Left Wall,Right
Wall, Top Wall, Bottom Wall and the Player object.
Next we will make
it load the audio for the game. Add 7 load audio actions. The audio you
need can be downloaded at the bottom of the page. There a 7 files. For
the first load audio action input the New Sound text field as Sprout, we
reference this already in the crop object. Next tab to the browse button
to open the file browser and find the audio file "Sprout.ogg" and tab to
the open button and hit enter. Then submit our new action. Do this again
for the other audio files.
Load the walk left.ogg file with the name
Load the walk right.ogg file with the name Right Walk.
Load the walk forward.ogg file with the name Forward Walk.
walk back.og file with the name Backwards Walk.
Load the thud.ogg
file with the name Thud.
and lastly load the plant.ogg file with the
Some of the sound reference names are the same as the
ogg file names for simplicity. Now we have created our objects and
loaded our sounds we have no more need for this object. Add a destroy
self action so the object is erased from the Sonus memory and frees up
space for future objects but ensure the destroy action is the last
action in the list so it performs it last.
Submit the new Loader
object so it is added to the game object tree. tab to it and use shift +
F10 to bring up its menu and select "Set As Init Object" so it will be
the first object to load during runtime and will proceed to load the
others in its creation event.