Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
156 lines (125 sloc) 5.26 KB
/*******************************************************************************
* Copyright (c) 2015, Daniel Murphy, Google
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
library demo;
import 'dart:async';
import 'dart:html' hide Body;
import 'package:box2d_flame/box2d_browser.dart' hide Timer;
/**
* An abstract class for any Demo of the Box2D library.
*/
abstract class Demo {
static const int WORLD_POOL_SIZE = 100;
static const int WORLD_POOL_CONTAINER_SIZE = 10;
/** All of the bodies in a simulation. */
List<Body> bodies = new List<Body>();
/** The default canvas width and height. */
static const int CANVAS_WIDTH = 900;
static const int CANVAS_HEIGHT = 600;
/** Scale of the viewport. */
static const double _VIEWPORT_SCALE = 10.0;
/** The gravity vector's y value. */
static const double GRAVITY = -10.0;
/** The timestep and iteration numbers. */
static const double TIME_STEP = 1 / 60;
static const int VELOCITY_ITERATIONS = 10;
static const int POSITION_ITERATIONS = 10;
/** The physics world. */
final World world;
// For timing the world.step call. It is kept running but reset and polled
// every frame to minimize overhead.
final Stopwatch _stopwatch;
final double _viewportScale;
/** The drawing canvas. */
CanvasElement canvas;
/** The canvas rendering context. */
CanvasRenderingContext2D ctx;
/** The transform abstraction layer between the world and drawing canvas. */
ViewportTransform viewport;
/** The debug drawing tool. */
DebugDraw debugDraw;
/** Frame count for fps */
int frameCount;
/** HTML element used to display the FPS counter */
Element fpsCounter;
/** Microseconds for world step update */
int elapsedUs;
/** HTML element used to display the world step time */
Element worldStepTime;
Demo(String name, [Vector2 gravity, this._viewportScale = _VIEWPORT_SCALE])
: this.world = new World.withPool(
(gravity == null) ? new Vector2(0.0, GRAVITY) : gravity,
new DefaultWorldPool(WORLD_POOL_SIZE, WORLD_POOL_CONTAINER_SIZE)),
_stopwatch = new Stopwatch()..start() {
querySelector("#title").innerHtml = name;
}
/** Advances the world forward by timestep seconds. */
void step(num timestamp) {
_stopwatch.reset();
world.stepDt(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
elapsedUs = _stopwatch.elapsedMicroseconds;
// Clear the animation panel and draw new frame.
ctx.clearRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
world.drawDebugData();
frameCount++;
window.requestAnimationFrame(step);
}
/**
* Creates the canvas and readies the demo for animation. Must be called
* before calling runAnimation.
*/
void initializeAnimation() {
// Setup the canvas.
canvas = (new Element.tag('canvas') as CanvasElement)
..width = CANVAS_WIDTH
..height = CANVAS_HEIGHT;
document.body.nodes.add(canvas);
ctx = canvas.context2D;
// Create the viewport transform with the center at extents.
var extents = new Vector2(CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2);
viewport = new CanvasViewportTransform(extents, extents)
..scale = _viewportScale;
// Create our canvas drawing tool to give to the world.
debugDraw = new CanvasDraw(viewport, ctx);
// Have the world draw itself for debugging purposes.
world.debugDraw = debugDraw;
frameCount = 0;
fpsCounter = querySelector("#fps-counter");
worldStepTime = querySelector("#world-step-time");
new Timer.periodic(new Duration(seconds: 1), (Timer t) {
fpsCounter.innerHtml = frameCount.toString();
frameCount = 0;
});
new Timer.periodic(new Duration(milliseconds: 200), (Timer t) {
if (elapsedUs == null) return;
worldStepTime.innerHtml = "${elapsedUs / 1000} ms";
});
}
void initialize();
/**
* Starts running the demo as an animation using an animation scheduler.
*/
void runAnimation() {
window.requestAnimationFrame(step);
}
}
You can’t perform that action at this time.