import 'dart:ui'; import 'package:flutter/animation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_sprites/flutter_sprites.dart'; AssetBundle _initBundle() { if (rootBundle != null) return rootBundle; return new NetworkAssetBundle(Uri.base); } final AssetBundle _bundle = _initBundle(); ImageMap _images; SpriteSheet _spriteSheet; main() async { _images = new ImageMap(_bundle); await _images.load(<String>[ 'assets/sprites.png' ]); String json = await _bundle.loadString('assets/sprites.json'); _spriteSheet = new SpriteSheet(_images['assets/sprites.png'], json); runApp(new MaterialApp( title: 'Test Physics', theme: new ThemeData( brightness: ThemeBrightness.light, primarySwatch: Colors.purple ), routes: <String, RouteBuilder>{ '/': (RouteArguments args) { return new SpriteWidget( new TestBed(), SpriteBoxTransformMode.letterbox ); } } )); } class TestBed extends NodeWithSize { Sprite _obstacle; PhysicsWorld _world; PhysicsGroup _group; PhysicsGroup _group2; TestBed() : super(new Size(1024.0, 1024.0)) { _world = new PhysicsWorld(new Offset(0.0, 100.0)); _world.drawDebug = true; _group = new PhysicsGroup(); _group2 = new PhysicsGroup(); _group2.position = new Point(50.0, 50.0); _world.addChild(_group); _world.addChild(_group2); _obstacle = new Sprite(_spriteSheet["ship.png"]); _obstacle.position = new Point(512.0, 800.0); _obstacle.size = new Size(64.0, 64.0); _obstacle.scale = 2.0; _obstacle.physicsBody = new PhysicsBody( new PhysicsShapeCircle(Point.origin, 32.0), type: PhysicsBodyType.static, friction: 0.5, tag: "obstacle" ); _group.addChild(_obstacle); _world.addContactCallback(myCallback, "obstacle", "ship", PhysicsContactType.begin); // Animate group ActionSequence seq = new ActionSequence(<Action>[ new ActionTween((Point a) { _group.position = a; }, new Point(-256.0, 0.0), new Point(256.0, 0.0), 1.0, Curves.easeInOut), new ActionTween((Point a) { _group.position = a; }, new Point(256.0, 0.0), new Point(-256.0, 0.0), 1.0, Curves.easeInOut) ]); _group.actions.run(new ActionRepeatForever(seq)); addChild(_world); userInteractionEnabled = true; } void myCallback(PhysicsContactType type, PhysicsContact contact) { } bool handleEvent(SpriteBoxEvent event) { if (event.type == "pointerdown") { Point pos = convertPointToNodeSpace(event.boxPosition); PhysicsGroup group = new PhysicsGroup(); group.position = pos; _world.addChild(group); Sprite shipA; shipA = new Sprite(_spriteSheet["ship.png"]); shipA.opacity = 0.3; shipA.position = new Point(-40.0, 0.0); shipA.size = new Size(64.0, 64.0); shipA.physicsBody = new PhysicsBody(new PhysicsShapeCircle(Point.origin, 32.0), friction: 0.5, restitution: 0.5, tag: "ship" ); group.addChild(shipA); Sprite shipB; shipB = new Sprite(_spriteSheet["ship.png"]); shipB.opacity = 0.3; shipB.position = new Point(40.0, 0.0); shipB.size = new Size(64.0, 64.0); shipB.physicsBody = new PhysicsBody(new PhysicsShapePolygon(<Point>[new Point(-25.0, -25.0), new Point(25.0, -25.0), new Point(25.0, 25.0), new Point(-25.0, 25.0)]), friction: 0.5, restitution: 0.5, tag: "ship" ); group.addChild(shipB); } return true; } }