| 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() {
|
| +
|
| + }
|
| +}
|
|
|