Back on coding CE again (at least for a few hours today) after spending a good deal of time coding and designing the backend for MYW, writing a tiny versatile CMS and doing some 3d for X.
So today I'm going to ask myself why the hell I have done a few things in CE the way I did them (I bet you are a lot wiser now).
Let's raise the question if it is worth to add the extra amount of work needed to draw a hard line between the game's "engine" and the game's UI - for your average flash game.
You may have noticed that neither Squize nor me tend to make out lives overly easy when it comes to games, for some odd reason we both tend to try to give out very best for each and every game (even if it is a pain in the back) - well call that stupid.
Give me a good reason to split game and game (play) UI ...
The best reason I can come up with is: reusability, and it is also the least used one.
In most cases I can come up with there seems to be no reason to really split things, because the game is a one-of-a-kind thing. Even for games that share a good deal of similarites (like Wintertales and LogiMotion), a whole lot of things need to be rewritten in order to reuse the engine.
That leaves the reusability inside a single game. !?
Inside a single game? Yep!
A good deal of our games either uses an ingame editor (although not usable by the player) or uses an external editor to generate the level data. Mostly, but not always they share the same visuals. For instance the editor for Logimotion uses smaller tiles than the game itself (so have room for the tools and don't have to scroll the map). That is a good reason to split things between the UI and the "engine".
Another good reason is when you have a stupid designer and you just code - you know those guys tend to be smart and change the size of the assets as often as you should change your underwear.
So why question that and not do it all the time?
Well, it takes a good deal more planing to really split things up. in an ideal world, the "game" knows nothing about the UI, but it still has to control it (ie. update the score, display infos). In my case this is done using callbacks.
A good example might be a game we did (but still isn't playable online): CC
(CC game, using 40x40 tiles)
(CC editor, using 32x32 tiles)
As you're meant to be able to play the game inside the editor (without leaving it), the engine had to cope with different tile sizes and environments.
So whenever the game needs to comunicate with its surroundings I provide a callback method, if I would have made it "the right" way, I should have used an interface for that, but ... hell you can overdo it too.
To make it easier and not having an endless number of callback methds I used only a few and gave them params (which are stored in the game's class as constants: like:
public static const UPDATEUI_INFO:uint = 0;
public static const UPDATEUI_BTNPLAY:uint = 1;
public static const UPDATEUI_ITEM:uint = 2;
public static const UPDATEUI_WIN:uint = 3;
Whenever you finish a level, the game would just call the callback provided for UI updates and pass the parameter needed.
And is it really worth the extra work?
I like to spend that extra piece of work for games that require and editor or might have parts in it that seem to be a good start for reusing it in a second game. Sometimes you notice halfway through the project that you need to change something to make the game work again (ie. different tile size, or different UI), sometimes (like I did for CE) you notice that the game will be a one of and you cause yourself a good deal of fuzz for "nice code" only.
Well, lets get back coding CE.