Not much progress
was made as I am upgrading my PVR so the weekend and last few evenings were
spent getting caught up with my tv shows as I will lose everything on the PVR
when the swap is done. I suppose this is a mixed blessing as I have been
overdoing things lately so having a forced break was probably good but that
means that the port of Evil Gnome’s Revenge may be delayed. I was hoping to
post the game this weekend, and still may be able to, but working while
watching TV is not very productive. Still, either this weekend or next weekend will
be the second game in my Santa trilogy where you play the bad guy and need to
chase Santa’s reindeer out of their corral.
Last week
we looked at the preloading of the assets. With all the assets ready to be used,
we still have the problem of dealing with multiple scenes. Animate CC 2017 does
not handle multiple scenes at all so my solution when creating multi-scene
projects in Animate was to simply put each scene in its own MovieClip and then
have the main timeline have keyframes with each of the difference scene movies
in it. When you think about it, if you have total control over the stage then having
a MovieClip that contains all the scenes is not necessary as you can simply
have a single scene MovieClip on the stage at a time. This has the additional benefit
that you don’t have to worry about removing event listeners as when a MovieClip
is not on the stage it will not be getting the events. The following is my
switching code:
spelchan.SantaSnowball.switchScene = function(newScene, e) {
var stage = spelchan.SantaSnowball.stage;
stage.removeChildAt(0);
switch(newScene) {
case spelchan.SantaSnowball.TITLE_SCENE:
stage.addChild(spelchan.SantaSnowball.titleScene);
break;
case spelchan.SantaSnowball.PLAY_GAME_SCENE:
stage.addChild(spelchan.SantaSnowball.playScene);
break;
case spelchan.SantaSnowball.ABOUT_SCENE:
stage.addChild(spelchan.SantaSnowball.aboutScene);
break;
case spelchan.SantaSnowball.INSTRUCTIONS_SCENE:
stage.addChild(spelchan.SantaSnowball.instructionsScene);
break;
case spelchan.SantaSnowball.WIN_SCENE:
stage.addChild(spelchan.SantaSnowball.winScene);
break;
case spelchan.SantaSnowball.LOSE_SCENE:
stage.addChild(spelchan.SantaSnowball.loseScene);
break;
case spelchan.SantaSnowball.BIG_LOSE_SCENE:
stage.addChild(spelchan.SantaSnowball.bigLoseScene);
break;
}
}
In
hindsight, this is not the best way of doing this. I have come up with two
better ways of doing this. The first way is to have an array of scenes and create
each scene using the numerical constant as an index into this array. A simple verification
that the index is valid then remove the old scene and add the new scene to the
stage. Much easier code. I use numerical constants for efficiency but when you
consider that this function is not being called that often and the constants
are fairly large chunks of text that are transmitted it may be more practical
just to use string names for the various scenes. As JavaScript uses associative
arrays for variables, you could simply tie the scenes to actual variables
within the class for your game. This is the approach I will be taking for the
second game in this trilogy.
As can be discerned
from the code, there are seven scenes that make up this game. Five of these
scenes just consist of images and text with a button leading back to the title
screen. The title screen has a slight bit of animation, plays a musical clip,
then has three buttons for navigating to other scenes. The title screen
actually is a good demonstration of one of the problems with my scene switching
system. The movie clips do not restart when they are switched to. This could be
forced by the switcher by simply calling a gotoAndPlay method but this would
require that all the scenes have a gotoAndPlay method, which is not that big of
an issue but something that needs to be considered.
An example
of when you may have a scene that is not a movie clip is my Billboard class. This
is created as a container that holds three objects. The class does do some
animation but instead of making this animation frame based, it is controlled by
separate function calls which take advantage of tweens to perform the animation.
This allows for the billboards to remain open for a different amount of time
based on the level of the game. I even take advantage of their flexibility by
having the act of throwing a snowball adjust the closing timing of the billboard.
More on that next week where we finish off the game and take a look at the tween.js class in more detail.
No comments:
Post a Comment