Welcome back, programmers! In the previous part, we took care of the HTML and CSS for the application. We will now prepare the JavaScript portion.
In the script tag which has remained empty up to now, we add a
game object. We then have jQuery's
ready() method to execute any functionality we want on page load.
index.html<script>
let game = {
};
$( document ).ready(function()
{
});
</script>
For the
game object, we have the following properties.
timeLeft - this is an integer that measures the minutes remaining.
eggs - this is an integer that keeps track of how many eggs have been collected so far.
visited - an array that keeps track of the locations in the story that the user has encountered.
index.htmllet game = {
"timeLeft" : 0,
"eggs" : 0,
"visited" : []
That's all for properties. We will now focus on methods. There are a bunch of methods we will be using, but we will be covering just a few for now. The first one is
gotoSection(). It has three parameters -
sectionName,
mins and
eggs. This is how it should work: when the method is run, the
timeLeft and
eggs properties of the
game object should be modified according to the value of
mins and
eggs. And then
content and
choices will be displayed based on
sectionName.
index.htmllet game = {
"timeLeft" : 0,
"eggs" : 0,
"visited" : [],
"gotoSection" : function(sectionName, mins, eggs)
{
}
};
We begin this method by making sure that if
sectionName is "begin", we reset the
visited property to an empty array. We also run
modifyTime() and
modifyEggs() with
mins and
eggs passed in as arguments, respectively.
index.html"gotoSection" : function(sectionName, mins, eggs)
{
if (sectionName == "begin") game.visited = [];
game.modifyTime(mins);
game.modifyEggs(eggs);
}
Let us build these methods.
index.html"gotoSection" : function(sectionName, mins, eggs)
{
if (sectionName == "begin") game.visited = [];
game.modifyTime(mins);
game.modifyEggs(eggs);
},
"modifyTime" : function(mins)
{
},
"modifyEggs" : function(qty)
{
}
We will work on the
modifyTime() method. Now pay close attention because this will be relevant later. Here we will handle two cases. The first case is when the value of
mins is greater than 0. In that case, you set the value of the
timeLeft property to mins.
index.html"modifyTime" : function(mins)
{
if (mins > 0) game.timeLeft = mins;
},
If the value of
mins is less than 0, that means we want to deduct from
timeLeft. And if the value is less than 0 after the deduction, we set it to 0.
index.html"modifyTime" : function(mins)
{
if (mins > 0) game.timeLeft = mins;
if (mins < 0)
{
game.timeLeft += mins;
if (game.timeLeft < 0) game.timeLeft = 0;
}
},
Next, we work on the
modifyEggs() method. We can pass a
null into the method, which will ensure that it does nothing. So to that end, we have an
If block that checks that
qty is not
null.
index.html"modifyEggs" : function(qty)
{
if (qty != null)
{
}
}
In that block we check if
qty is 0. If so, we set the
eggs property to 0.
index.html"modifyEggs" : function(qty)
{
if (qty != null)
{
if (qty == 0)
{
game.eggs = 0;
}
else
{
}
}
}
If it is anything but 0, we increment
eggs by that number. This might be a negative number, so if the result is less than 0, we set eggs to 0.
index.html"modifyEggs" : function(qty)
{
if (qty != null)
{
if (qty == 0)
{
game.eggs = 0;
}
else
{
game.eggs += qty;
if (game.eggs < 0) game.eggs = 0;
}
}
}
Now in the file
sections.js, which we included in the last part of this web tutorial, we will add code. The first thing we need is the
section object.
sections.jslet sections =
{
};
It is made out of several sub-objects, all with the same properties. We will add only one, for now. Let's call it "begin". It will have the following properties.
content - some HTML. Leave blank for the time being.
flag - to determine if we should record this section as being visited when encountered.
false by default.
visitedChecks - more sub-objects that will determine extra content and choices.
null by default.
messages - an array of useful messages to display when this section is encountered. Empty array by default.
choices - an array of objects. These are the links to different sections. Empty array by default.
sections.jslet sections =
{
"begin" :
{
"content" : "",
"flag" : false,
"visitedChecks" : null,
"messages" : [],
"choices" : []
}
};
For
content, let's put in some HTML. Note that double quotes in the content have to be represented by HTML special characters. In this section, we will also have the image below.
|
img_easterbunny.jpg |
The styling has already been done in the last part of this web tutorial.
sections.jslet sections =
{
"begin" :
{
"content" : "<p>Easter has come. The sky is bright and cheery. You are on the porch of the house you live in, facing the Easter Bunny. The Easter Bunny wiggles his little nose and tells you, "<b>Happy Easter! I have hidden several Easter eggs all around the garden, outside of the house. Your mission is to find 30 eggs within 120 minutes. Good hunting!</b>" With that, he hops away.</p><p><img src='img_easterbunny.jpg'></p><p>You are now seated on the steps, and the hunt is under way.</p>",
"flag" : false,
"visitedChecks" : null,
"messages" : [],
"choices" : []
}
};
For
choices, each object looks something like this. The properties are:
time - the number to set the
timeLeft property to, or subtract by.
eggs - the number to set the
eggs property to, or add/subtract by.
section - the name of the section to go to when this choice is selected.
text - the text that appears beside the button.
sections.jslet sections =
{
"begin" :
{
"content" : "<p>Easter has come. The sky is bright and cheery. You are on the porch of the house you live in, facing the Easter Bunny. The Easter Bunny wiggles his little nose and tells you, "<b>Happy Easter! I have hidden several Easter eggs all around the garden, outside of the house. Your mission is to find 30 eggs within 120 minutes. Good hunting!</b>" With that, he hops away.</p><p><img src='img_easterbunny.jpg'></p><p>You are now seated on the steps, and the hunt is under way.</p>",
"flag" : false,
"visitedChecks" : null,
"messages" : [],
"choices" :
[
{ "time" : -1, "eggs" : null, "section" : "test", "text" : "Begin the hunt!"}
]
}
};
None of that will be apparent now. We need to do some more work first. So let's get back to
index.html and work on the
gotoSection() method. The next thing we will do is grab the section that
sectionName points to, and assign it to the variable
section. We then get
messages from the
messages property of
section.
index.html"gotoSection" : function(sectionName, mins, eggs)
{
if (sectionName == "begin") game.visited = [];
var section = sections[sectionName];
var messages = section.messages;
game.modifyTime(mins);
game.modifyEggs(eggs);
}
We follow up by grabbing
content the same way we did for
messages.
choices as well... though in the case of
choices, we also do a
stringify() and
parse() on the value so as to ensure that we clone the
choices object from
section.
index.html"gotoSection" : function(sectionName, mins, eggs)
{
if (sectionName == "begin") game.visited = [];
var section = sections[sectionName];
var messages = section.messages;
game.modifyTime(mins);
game.modifyEggs(eggs);
var content = section.content;
var choices = JSON.parse(JSON.stringify(section.choices));
}
And then the next thing we do is run the
showContent() method and pass
content and
messages into it as arguments. And we also run the
showChoices() method, and pass in
sectionName and
choices as arguments.
index.html"gotoSection" : function(sectionName, mins, eggs)
{
if (sectionName == "begin") game.visited = [];
var section = sections[sectionName];
var messages = section.messages;
game.modifyTime(mins);
game.modifyEggs(eggs);
var content = section.content;
var choices = JSON.parse(JSON.stringify(section.choices));
game.showContent(content, messages);
game.showChoices(sectionName, choices);
}
Naturally, we next define
showContent() and
showChoices().
index.html game.showContent(content, messages);
game.showChoices(sectionName, choices);
},
"showChoices" : function(sectionName, links)
{
},
"showContent" : function(content, messages)
{
},
"modifyTime" : function(mins)
{
if (mins > 0) game.timeLeft = mins;
if (mins < 0)
{
game.timeLeft += mins;
if (game.timeLeft < 0) game.timeLeft = 0;
}
},
Let us work on
showContent() first. It will show (surprise, surprise) content and inventory, along with time left, and any messages that might need to be shown. We begin by putting a string within the div that has the CSS class timeLeft, to sow how many minutes are left.
index.html"showContent" : function(content, messages)
{
$(".timeleft").html(game.timeLeft + " minutes");
},
And then we do the same with the div with the CSS class
inventory. However, because we will be expanding on this later, we first assign the string to the variable
invStr.
index.html"showContent" : function(content, messages)
{
$(".timeleft").html(game.timeLeft + " minutes");
var invStr = "Eggs x " + game.eggs + "<br />";
$(".inventory").html(invStr);
},
The next thing we do, is populate the div that has the CSS class
content, with the value of
content.
index.html"showContent" : function(content, messages)
{
$(".timeleft").html(game.timeLeft + " minutes");
var invStr = "Eggs x " + game.eggs + "<br />";
$(".inventory").html(invStr);
$(".content").html(content);
},
Next, if
messages is not an empty array...
index.html"showContent" : function(content, messages)
{
$(".timeleft").html(game.timeLeft + " minutes");
var invStr = "Eggs x " + game.eggs + "<br />";
$(".inventory").html(invStr);
$(".content").html(content);
if (messages.length > 0)
{
}
},
Now we create a new div. It will be the variable div. We also create a variable,
messageStr, and set it to an empty string.
index.htmlif (messages.length > 0)
{
var div = $("<div class='message'></div>");
var messageStr = "";
}
Now we use a
For loop to iterate through
messages. We will append each string to
messageStr, with a break tag.
index.htmlif (messages.length > 0)
{
var div = $("<div class='message'></div>");
var messageStr = "";
for (let i = 0; i < messages.length; i++)
{
messageStr += (messages[i] + "<br />");
}
}
We set div's HTML content by using its
html() method and passing in
messageStr as an argument. After that, we insert div into the div styled using the CSS class
content.
index.htmlif (messages.length > 0)
{
var div = $("<div class='message'></div>");
var messageStr = "";
for (let i = 0; i < messages.length; i++)
{
messageStr += (messages[i] + "<br />");
}
div.html(messageStr);
$(".content").append(div);
}
It will not be visible until we call the
gotoSection() method. So we call it in here. We pass in "begin", which is the name of the section we created in
sections.js. The next argument is 120, which is what we want to set the
timeLeft property to. After that, is 0, which is what we want to set the
eggs property to.
index.html$( document ).ready(function()
{
game.gotoSection("begin", 120, 0);
});
Now you see this! The left column shows time left and eggs. The right column shows the HTML content we had in
sections.js. See how the image of the bunny fits in - we handled all that CSS styling in the first part of this tutorial.
Now we add some test content into the
messages property of the section we created.
sections.js"begin" :
{
"content" : "<p>Easter has come. The sky is bright and cheery. You are on the porch of the house you live in, facing the Easter Bunny. The Easter Bunny wiggles his little nose and tells you, "<b>Happy Easter! I have hidden several Easter eggs all around the garden, outside of the house. Your mission is to find 30 eggs within 120 minutes. Good hunting!</b>" With that, he hops away.</p><p><img src='img_easterbunny.jpg'></p><p>You are now seated on the steps, and the hunt is under way.</p>",
"flag" : false,
"visitedChecks" : null,
"messages" : ['test1', 'test2'],
"choices" :
[
{ "time" : -1, "eggs" : null, "section" : "test", "text" : "Begin the hunt!"}
]
}
Note that we have to scroll down because the content is too large for the div. But you can see clearly the translucent
black div with the
red text.
Now revert that
messages array to an empty array. We will work on the
showChoices() method next. We begin by using the
html() method to clear the HTML of the div that is styled using the CSS class
choices.
index.html"showChoices" : function(sectionName, links)
{
$(".choices").html("");
},
Then we use a
For loop to go through the array
links.
index.html"showChoices" : function(sectionName, links)
{
$(".choices").html("");
for (let i = 0; i < links.length; i++)
{
}
},
For every element, we create a div and a button with the text "Go", and ensure that
div has the
text property specified in the current element of the
links array. Then we append
button to
div. And after that, we append
div to the div styled using the CSS class
choices.
index.html"showChoices" : function(sectionName, links)
{
$(".choices").html("");
for (let i = 0; i < links.length; i++)
{
var div = $("<div></div>");
var button = $("<button>Go</button>");
div.html(links[i].text);
div.append(button);
$(".choices").append(div);
}
},
After that, we affix the
gotoSection() method into the
click event of
button. In it, we pass in the appropriate arguments, which are provided by the current element in the
links array.
index.html"showChoices" : function(sectionName, links)
{
$(".choices").html("");
for (let i = 0; i < links.length; i++)
{
var div = $("<div></div>");
var button = $("<button>Go</button>");
div.html(links[i].text);
div.append(button);
$(".choices").append(div);
button.click(()=> {
game.gotoSection(links[i].section, links[i].time, links[i].eggs);
});
}
},
The
yellow button won't be clickable right now because the section it is pointing to does not exist, but at least the button shows up!
Now let us add one more button, which will appear for all scenarios. It is the restart button.
index.html"showChoices" : function(sectionName, links)
{
$(".choices").html("");
for (let i = 0; i < links.length; i++)
{
var div = $("<div></div>");
var button = $("<button>Go</button>");
div.html(links[i].text);
div.append(button);
$(".choices").append(div);
button.click(()=> {
game.gotoSection(links[i].section, links[i].time, links[i].eggs);
});
}
var div = $("<div></div>");
var button = $("<button>Go</button>");
div.html("Restart");
div.append(button);
$(".choices").append(div);
button.click(()=> {
game.gotoSection("begin", 120, 0);
});
},
There you go. Click that button and you should still see the same thing. The magic is only apparent if you're in another section. No worries, we will handle that in the next part of this tutorial.
Next
We are going to dive right into inventory display!