I had me a good old time building a scoreboard for kids to use in some of the 3D Game Programming for Kids chapters. I am doing this as a possible way to avoid teaching kids about DOM programming (and thus scaring them off from programming forever). But I have to admit—I had a good time whipping the scoreboard up. I also think that it could prove pretty useful for kids. Having slept on it, I think that the scoreboard could use a countdown timer in addition to the regular elapsed time timer.
Specifically, I can see it being pretty darn handy in the multi-level game that I whipped up recently. Each of the levels can be timed and I can use callbacks to decide what happens when time expires on any given level. For this to work, the countdown will need to support that time-expired callback as well as a way to reset the countdown when new levels of the game are reached.
My attempt at doing this involves subclassing last night's
Timer class:function __Countdown(options) {
  this.start = (new Date).getTime();
  this.length = options.length || 10;
  this.waitForTimeExpired();
}
__Countdown.prototype = new __Timer();This gives me access to the methods that covert time to a printable string. In addition to needing a new waitForTimeExpired() method that will call the necessary callbacks, I have to override the diff() method from the sequential timer:__Countdown.prototype.diff = function() {
  var now = this.last(),
      diff = now - this.start;
  if (diff > this.length * 1000) return 0;
  return this.length * 1000 - diff;
};
In this case, I do not want to print the different between the start time and the current time. Rather I want to print the difference between the elapsed time and the duration of this timer.The new
waitForTimeExpired() method is just a simple timeout:__Timer.prototype.waitForTimeExpired = function() {
  var that = this;
  function _wait() {
    if (that.diff() > 0) return setTimeout(_wait, 500);
    that.stop();
    return that.onTimeExpired(that.toString());
  }
  _wait();
};I add the countdown timer to yesterday's Scoreboard class so that I can display it with a boolean option:  var scoreboard = new Scoreboard({
    showTimer: true,
    showCountdown: true,
    message: "Get the green ring. " +
             "Click and drag blue ramps. " +
             "Click and R to rotate. " +
             "Left and right arrows to move player. " +
             "Be quick!"
  });
  scoreboard.show();Lastly, I add a reset method so that I can reset the time in between levels:  var current_level = 0;
  function drawCurrentLevel() {
    scoreboard.resetCountdown(50 - current_level * 10);
    var obstacles = levels[current_level];
    obstacles.forEach(function(obstacle) {
      scene.add(obstacle);
    });      
  }That seems to do the trick.
I still have a few kinks to work out—mostly in the API. With an elapsed timer, a countdown timer, a message, and a score tracker, the scoreboard class has gotten complicated. Especially the constructor. Still, this seems a promising thing to be able to include in the book.
Day #662
No comments:
Post a Comment