/** * Returns the current time, as a double value in millis since January 1, 1970, 00:00:00 GMT. * * <p> This is equivalent to the standard JRE {@code new Date().getTime();}, but it slightly * terser, and avoids the use of {@code long} values, which are best avoided when translating to * JavaScript. </p> */ public static double currentTime() { return platform.time(); }
private int elapsed(double start) { return (int)Math.round((game.plat.time() - start)/1000); }
@Override public void release () { if (_copies.size() < _reserveCopies) { releaseTime = _board.plat.time(); _copies.add(this); } }
/** * Obtains a copy of the sound (from the reserves if possible or loaded from storage if not). * The copy must be {@link Copy#play}ed or {@link Copy#release}d by the caller. */ public Copy reserve () { double now = _board.plat.time(); for (int ii = 0, ll = _copies.size(); ii < ll; ii++) { CopyImpl copy = _copies.get(ii); if (copy.releaseTime < now) { return _copies.remove(ii); } } return new CopyImpl(); }
@Override public void play () { sound.play(); if (_copies.size() < _reserveCopies) { releaseTime = _board.plat.time() + _duration; _copies.add(this); } }
@Override public void onEnd (Touch.Interaction iact) { if (!trackingTouch(iact.event)) return; _currentTouches.remove(iact.event.id); evaluateGestures(new GestureNode(_plat.time(), GestureNode.Type.END, iact)); }
@Override public void onMove (Touch.Interaction iact) { if (!trackingTouch(iact.event)) return; _currentTouches.put(iact.event.id, iact.event); evaluateGestures(new GestureNode(_plat.time(), GestureNode.Type.MOVE, iact)); }
@Override public void onCancel (Touch.Interaction iact) { if (!trackingTouch(iact.event)) return; _currentTouches.remove(iact.event.id); evaluateGestures(new GestureNode(_plat.time(), GestureNode.Type.CANCEL, iact)); }
@Override public void onStart (Touch.Interaction iact) { if (!touchInBounds(iact)) return; if (_currentTouches.isEmpty()) { // new user interaction! for (Gesture<?> gesture : _gestures) gesture.start(); _greedy.update(null); } _currentTouches.put(iact.event.id, iact.event); evaluateGestures(new GestureNode(_plat.time(), GestureNode.Type.START, iact)); }
protected void onTouchPause (GestureNode node) { if (!trackingTouch(node.touch)) { Log.log.warning("Bad state: received pause dispatch for an event we're not tracking", "event", node.touch); return; } // no need to update _currentTouches, it already has this touch registered evaluateGestures(new GestureNode(_plat.time(), GestureNode.Type.PAUSE, node.touch, node.location)); }
@Override public void init() { double start = game.plat.time(); conns.add(game.plat.lifecycle.connect(event -> { switch (event) { case PAUSE: game.log.info("Paused " + elapsed(start)); notifications.add("Paused at " + elapsed(start) + "s"); break; case RESUME: game.log.info("Resumed " + elapsed(start)); notifications.add("Resumed at " + elapsed(start) + "s"); updateDisplay(); break; default: break; // nada } })); game.rootLayer.addAt(layer = new ImageLayer(), 15, 15); updateDisplay(); }