Index: sky/examples/game/lib/game_world.dart |
diff --git a/sky/examples/game/lib/game_world.dart b/sky/examples/game/lib/game_world.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..69de04579ce8cf7ceff5858f544f5fdbe09342b4 |
--- /dev/null |
+++ b/sky/examples/game/lib/game_world.dart |
@@ -0,0 +1,93 @@ |
+part of game; |
+ |
+class GameWorld extends TransformNode { |
+ |
+ World world; |
+ List<Body> bodies = []; |
+ Image _image; |
+ |
+ GameWorld(double width, double height) { |
+ this.width = width; |
+ this.height = height; |
+ |
+ world = new World.withGravity(new Vector2(0.0, 0.0)); |
+ |
+ // Load and add background |
+ Image imgBg = new Image()..src="https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/resources-auto/BurnTexture.png"; |
+ SpriteNode sprtBg = new SpriteNode.withImage(imgBg); |
+ sprtBg.width = width; |
+ sprtBg.height = height; |
+ sprtBg.pivot = new Vector2(0.0, 0.0); |
+ this.children.add(sprtBg); |
+ |
+ // Load asteroid image |
+ _image = new Image()..src="https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resources-auto/asteroid_big_002.png"; |
+ } |
+ |
+ void addAsteroid([double radius=20.0]) { |
+ |
+ // Create shape |
+ final CircleShape shape = new CircleShape(); |
+ shape.radius = radius; |
+ |
+ // Define fixture (links body and shape) |
+ final FixtureDef activeFixtureDef = new FixtureDef(); |
+ activeFixtureDef.restitution = 1.0; |
+ activeFixtureDef.density = 0.05; |
+ activeFixtureDef.shape = shape; |
+ |
+ // Define body |
+ final BodyDef bodyDef = new BodyDef(); |
+ bodyDef.type = BodyType.DYNAMIC; |
+ bodyDef.position = new Vector2(0.0, 30.0); |
+ bodyDef.linearDamping = 0.0; |
+ bodyDef.angularDamping = 0.0; |
+ |
+ // Create body and fixture from definitions |
+ final Body body = world.createBody(bodyDef); |
+ body.createFixtureFromFixtureDef(activeFixtureDef); |
+ |
+ // Set position of object |
+ Math.Random rand = new Math.Random(); |
+ body.setTransform(new Vector2(rand.nextDouble() * this.width, rand.nextDouble() * this.height), 0.0); |
+ body.applyLinearImpulse(new Vector2(rand.nextDouble()*10000.0-5000.0, rand.nextDouble()*10000.0-5000.0), new Vector2(0.0, 0.0), true); |
+ |
+ // Add to list |
+ bodies.add(body); |
+ |
+ SpriteNode sprt = new SpriteNode.withImage(_image); |
+ sprt.width = radius*2; |
+ sprt.height = radius*2; |
+ body.userData = sprt; |
+ this.children.add(sprt); |
+ } |
+ |
+ void update(double dt) { |
+ world.stepDt(1.0/60.0, 10, 10); // Pass in dt |
+ |
+ bodies.forEach(updateBody); |
+ } |
+ |
+ void updateBody(Body body) { |
+ SpriteNode sprt = body.userData; |
+ double rot = 0.0; //body.getRotation(); |
+ |
+ // Check bounds and warp objects |
+ if (body.position[0] < -sprt.width/2) { |
+ body.setTransform(new Vector2(body.position[0] + this.width + sprt.width, body.position[1]), rot); |
+ } |
+ if (body.position[0] > this.width + sprt.width/2) { |
+ body.setTransform(new Vector2(body.position[0] - (this.width + sprt.width), body.position[1]), rot); |
+ } |
+ if (body.position[1] < -sprt.height/2) { |
+ body.setTransform(new Vector2(body.position[0], body.position[1] + this.height + sprt.height), rot); |
+ } |
+ if (body.position[1] > this.height + sprt.height/2) { |
+ body.setTransform(new Vector2(body.position[0], body.position[1] - (this.height + sprt.height)), rot); |
+ } |
+ |
+ // Update sprite |
+ sprt.position = body.position; |
+ sprt.rotation = body.getAngle(); |
+ } |
+} |