The next update addresses some important issues we uncovered while trying to build an actual game with AGE, a box2d-based "bashing" game using 3d models for some "depth".
Anyone tinkering around must be wondering how to get to the "end". This is still work-in-progress, but the main mechanism is a new event GameOverSentinel that "kicks off" the process of ending a game, i.e. setting the "game over" flag.
One current issue is there's no "universal" way to see the GameCycle.isOver() method. If most of the logic is in your GameCycle subclass, this is not an issue, you have direct access to it. Where the visibility is missing, is in the top-level context. There will be something there eventually, but not yet. In the meantime, just make sure all relevant GOs are on the target list when you send GameOverSentinel.
An instance of the engine is a one-time use. Once you reach "game over" you must create a new instance of everything, and go from there. This may change; there's not much currently keeping it from working in a reusable way, so "start game" could do the re-initialization required to prepare for a new game.
There is an issue with attaching the engine to an existing GL context; we are working on the fix for that. The issue is AGE depends on seeing the surface holder callbacks for triggering initialization, and when the surface has already initialized before AGE has, these callbacks never occur, and the initialization never kicks off. The result is Sad Face, nothing gets rendered.
On startup, there's a race condition between the engine and the GL context's callbacks. There may be actual situations where on your device the race is lost, and you get nothing rendered. See previous paragraph.
There is a small issue with timers. Currently, timers enter the service without regard for the Timer Base Tick (TBT). This results in the first timer callback being less-than a full tick, and won't be zero.
As a reminder, you should always allocate timer intervals in multiples of TBT; you won't get any lower resolution than that! Just to emphasize, if your TBT is 50, don't make your timer have an interval of 123.
With that said, we are changing how timers enter the system. Timers will be aligned on TBT, and the first TBT after the timer installs will be its "zero" callback. This will make timer design a little easier, because now you can depend on two callback conditions:
The GameCycle class has abstract methods for previewing the pipelines. These are very handy, but they occur before everything else in the pipeline! Quite often, you would like to see that after everything in the pipeline has executed.
We are adding these hooks as additional abstract methods.