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 |
index 2101512992d37770000f09a082979f9e426a8c68..233541054f525f8be28b37588e577bd7a167937f 100644 |
--- a/sky/examples/game/lib/game_world.dart |
+++ b/sky/examples/game/lib/game_world.dart |
@@ -4,32 +4,49 @@ class GameWorld extends TransformNode { |
World world; |
List<Body> bodies = []; |
- Image _image; |
+ Body _bodyShip; |
+ |
+ Image _imgBg; |
+ Image _imgAsteroid; |
+ Image _imgShip; |
+ |
+ double _steeringInput; |
+ double _thrustInput; |
+ double _lastSteeringSpeed = 0.0; |
GameWorld(ImageMap images) { |
this.width = 1024.0; |
this.height = 1024.0; |
- |
+ |
+ // Fetch images |
+ _imgBg = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/resources-auto/BurnTexture.png"]; |
+ _imgAsteroid = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resources-auto/asteroid_big_002.png"]; |
+ _imgShip = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resources-auto/GG_blueship_Lv3.png"]; |
+ |
+ // Create the physics world |
world = new World.withGravity(new Vector2(0.0, 0.0)); |
- // Load and add background |
- Image imgBg = images["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 = images["https://raw.githubusercontent.com/slembcke/GalacticGuardian.spritebuilder/GDC/Packages/SpriteBuilder%20Resources.sbpack/Sprites/resources-auto/asteroid_big_002.png"]; |
+ // Add a background |
+ addBackground(); |
// Add some asteroids to the game world |
- for (int i = 0; i < 50; i++) { |
+ for (int i = 0; i < 5; i++) { |
addAsteroid(10.0); |
} |
- for (int i = 0; i < 50; i++) { |
+ for (int i = 0; i < 5; i++) { |
addAsteroid(20.0); |
} |
+ |
+ // Add ship |
+ addShip(); |
+ } |
+ |
+ void addBackground() { |
+ SpriteNode sprtBg = new SpriteNode.withImage(_imgBg); |
+ sprtBg.width = width; |
+ sprtBg.height = height; |
+ sprtBg.pivot = new Vector2(0.0, 0.0); |
+ this.children.add(sprtBg); |
} |
void addAsteroid([double radius=20.0]) { |
@@ -62,19 +79,78 @@ class GameWorld extends TransformNode { |
// Add to list |
bodies.add(body); |
- |
- SpriteNode sprt = new SpriteNode.withImage(_image); |
+ |
+ // Create sprite |
+ SpriteNode sprt = new SpriteNode.withImage(_imgAsteroid); |
+ sprt.width = radius*2; |
+ sprt.height = radius*2; |
+// sprt.colorOverlay = new Color(0x33ff0000); |
+// sprt.transferMode = TransferMode.plusMode; |
+ body.userData = sprt; |
+ this.children.add(sprt); |
+ } |
+ |
+ void addShip() { |
+ double radius = 30.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.95; |
+ |
+ // Create body and fixture from definitions |
+ final Body body = world.createBody(bodyDef); |
+ body.createFixtureFromFixtureDef(activeFixtureDef); |
+ |
+ // Center on screen |
+ body.setTransform(new Vector2(width/2.0, height/2.0), 90.0); |
+ |
+ // Add to list |
+ bodies.add(body); |
+ _bodyShip = body; |
+ |
+ // Create sprite |
+ SpriteNode sprt = new SpriteNode.withImage(_imgShip); |
sprt.width = radius*2; |
sprt.height = radius*2; |
- sprt.colorOverlay = new Color(0x33ff0000); |
- sprt.transferMode = TransferMode.plusMode; |
+ sprt.position = new Vector2(width/2.0, height/2.0); |
body.userData = sprt; |
this.children.add(sprt); |
} |
void update(double dt) { |
+ // Apply thrust |
+ if (_thrustInput != null) { |
+ double force = _thrustInput*10000.0; |
+ double rad = degrees2radians(_bodyShip.getAngle()); |
+ _bodyShip.applyLinearImpulse(new Vector2(Math.cos(rad)*force, Math.sin(rad)*force), new Vector2(0.0, 0.0), true); |
+ } |
+ |
+ // Simulate world |
world.stepDt(1.0/60.0, 10, 10); // Pass in dt |
- |
+ |
+ // Apply stearing |
+ if (_steeringInput != null) { |
+ _lastSteeringSpeed = _steeringInput * 4.0; |
+ } |
+ else { |
+ _lastSteeringSpeed *= 0.75; |
+ } |
+ _bodyShip.setTransform(_bodyShip.position, _bodyShip.getAngle() + _lastSteeringSpeed); |
+ |
+ // Update all sprites |
bodies.forEach(updateBody); |
} |
@@ -100,4 +176,16 @@ class GameWorld extends TransformNode { |
sprt.position = body.position; |
sprt.rotation = body.getAngle(); |
} |
-} |
+ |
+ void controlSteering(double input) { |
+ _steeringInput = input; |
+ } |
+ |
+ void controlThrust(double input) { |
+ _thrustInput = input; |
+ } |
+ |
+ void controlFire() { |
+ |
+ } |
+} |