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([ 'assets/checker.png', 'assets/line_effects.png' ]); assert(_images["assets/checker.png"] != null); runApp(new TestApp()); } class TestApp extends StatefulComponent { TestAppState createState() => new TestAppState(); } final ThemeData _theme = new ThemeData( brightness: ThemeBrightness.light, primarySwatch: Colors.blue ); class TestAppState extends State { TestApp() { _testBed = new TestBed(_labelTexts[_selectedLine]); } TestBed _testBed; int _selectedLine = 0; List _labelTexts = [ "Colored", "Smoke", "Electric", "Rocket Trail" ]; Widget build(BuildContext context) { return new MaterialApp( title: 'EffectLine Demo', theme: _theme, routes: { '/': _buildColumn } ); } Column _buildColumn(RouteArguments args) { return new Column([ new Flexible(child: _buildSpriteWidget()), _buildTabBar() ]); } TabBar _buildTabBar() { return new TabBar( labels: _buildTabLabels(), selectedIndex: _selectedLine, onChanged: (int selectedLine) { setState(() { _selectedLine = selectedLine; }); } ); } List _buildTabLabels() { List labels = []; for (String text in _labelTexts) labels.add(new TabLabel(text: text)); return labels; } SpriteWidget _buildSpriteWidget() { _testBed.setupLine(_labelTexts[_selectedLine]); return new SpriteWidget( _testBed, SpriteBoxTransformMode.letterbox ); } } class TestBed extends NodeWithSize { EffectLine _line; TestBed(String lineType) : super(new Size(1024.0, 1024.0)) { userInteractionEnabled = true; setupLine(lineType); } void setupLine(String lineType) { if (_line != null) { _line.removeFromParent(); } if (lineType == "Colored") { // Create a line with no texture and a color sequence _line = new EffectLine( texture: null, colorSequence: new ColorSequence.fromStartAndEndColor(new Color(0xaaffff00), new Color(0xaaff9900)), widthMode: EffectLineWidthMode.barrel, minWidth: 10.0, maxWidth: 15.0, fadeAfterDelay: 1.0, fadeDuration: 1.0 ); } else if (lineType == "Smoke") { Texture baseTexture = new Texture(_images['assets/line_effects.png']); Texture smokyLineTexture = baseTexture.textureFromRect(new Rect.fromLTRB(0.0, 0.0, 1024.0, 128.0)); _line = new EffectLine( texture: smokyLineTexture, textureLoopLength: 300.0, colorSequence: new ColorSequence.fromStartAndEndColor(new Color(0xffffffff), new Color(0x00ffffff)), widthMode: EffectLineWidthMode.barrel, minWidth: 20.0, maxWidth: 80.0, animationMode: EffectLineAnimationMode.scroll ); } else if (lineType == "Electric") { Texture baseTexture = new Texture(_images['assets/line_effects.png']); Texture electricLineTexture = baseTexture.textureFromRect(new Rect.fromLTRB(0.0, 384.0, 1024.0, 512.0)); _line = new EffectLine( texture: electricLineTexture, textureLoopLength: 300.0, widthMode: EffectLineWidthMode.barrel, minWidth: 20.0, maxWidth: 100.0, animationMode: EffectLineAnimationMode.random ); } else if (lineType == "Rocket Trail") { Texture baseTexture = new Texture(_images['assets/line_effects.png']); Texture trailLineTexture = baseTexture.textureFromRect(new Rect.fromLTRB(0.0, 896.0, 1024.0, 1024.0)); _line = new EffectLine( texture: trailLineTexture, textureLoopLength: 300.0, widthMode: EffectLineWidthMode.barrel, minWidth: 20.0, maxWidth: 40.0, widthGrowthSpeed: 40.0, fadeAfterDelay: 0.5, fadeDuration: 1.5 ); } addChild(_line); } bool handleEvent(SpriteBoxEvent event) { if (event.type == "pointerdown") _line.points = []; if (event.type == "pointerdown" || event.type == "pointermove") { Point pos = convertPointToNodeSpace(event.boxPosition); _line.addPoint(pos); } return true; } }