From 32359d4b62ef02503c5e50939879840d9b0d640b Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Mon, 10 Aug 2015 12:36:08 -0700 Subject: [PATCH 1/3] Refactors Sprite class to use SpritePaint mix-in for setting paint properties --- examples/game/lib/node_with_size.dart | 4 +- examples/game/lib/sprite.dart | 77 +++++++++++++++------------ 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/examples/game/lib/node_with_size.dart b/examples/game/lib/node_with_size.dart index 061dec40310..cef9d60f72f 100644 --- a/examples/game/lib/node_with_size.dart +++ b/examples/game/lib/node_with_size.dart @@ -21,9 +21,9 @@ class NodeWithSize extends Node { /// The default [size] is zero and the default [pivot] point is the origin. Subclasses may change the default values. /// /// var myNodeWithSize = new NodeWithSize(new Size(1024.0, 1024.0)); - NodeWithSize([Size this.size, Point this.pivot]) { + NodeWithSize(Size this.size) { if (size == null) size = Size.zero; - if (pivot == null) pivot = Point.origin; + pivot = Point.origin; } /// Call this method in your [paint] method if you want the origin of your drawing to be the top left corner of the diff --git a/examples/game/lib/sprite.dart b/examples/game/lib/sprite.dart index b9d382b4857..6142df8c689 100644 --- a/examples/game/lib/sprite.dart +++ b/examples/game/lib/sprite.dart @@ -1,7 +1,7 @@ part of sprites; /// A Sprite is a [Node] that renders a bitmap image to the screen. -class Sprite extends NodeWithSize { +class Sprite extends NodeWithSize with SpritePaint { /// The texture that the sprite will render to screen. /// @@ -15,19 +15,6 @@ class Sprite extends NodeWithSize { /// /// mySprite.constrainProportions = true; bool constrainProportions = false; - double _opacity = 1.0; - - /// The color to draw on top of the sprite, null if no color overlay is used. - /// - /// // Color the sprite red - /// mySprite.colorOverlay = new Color(0x77ff0000); - Color colorOverlay; - - /// The transfer mode used when drawing the sprite to screen. - /// - /// // Add the colors of the sprite with the colors of the background - /// mySprite.transferMode = TransferMode.plusMode; - TransferMode transferMode; Paint _cachedPaint = new Paint() ..setFilterQuality(FilterQuality.low) @@ -36,7 +23,7 @@ class Sprite extends NodeWithSize { /// Creates a new sprite from the provided [texture]. /// /// var mySprite = new Sprite(myTexture) - Sprite([this.texture]) { + Sprite([this.texture]) : super(Size.zero) { if (texture != null) { size = texture.size; pivot = texture.pivot; @@ -48,7 +35,7 @@ class Sprite extends NodeWithSize { /// Creates a new sprite from the provided [image]. /// /// var mySprite = new Sprite.fromImage(myImage); - Sprite.fromImage(Image image) { + Sprite.fromImage(Image image) : super(Size.zero) { assert(image != null); texture = new Texture(image); @@ -57,17 +44,6 @@ class Sprite extends NodeWithSize { pivot = new Point(0.5, 0.5); } - /// The opacity of the sprite in the range 0.0 to 1.0. - /// - /// mySprite.opacity = 0.5; - double get opacity => _opacity; - - void set opacity(double opacity) { - assert(opacity != null); - assert(opacity >= 0.0 && opacity <= 1.0); - _opacity = opacity; - } - void paint(PaintingCanvas canvas) { // Account for pivot point applyTransformForPivot(canvas); @@ -95,13 +71,7 @@ class Sprite extends NodeWithSize { canvas.scale(scaleX, scaleY); // Setup paint object for opacity and transfer mode - _cachedPaint.color = new Color.fromARGB((255.0*_opacity).toInt(), 255, 255, 255); - if (colorOverlay != null) { - _cachedPaint.setColorFilter(new ColorFilter.mode(colorOverlay, TransferMode.srcATop)); - } - if (transferMode != null) { - _cachedPaint.setTransferMode(transferMode); - } + _updatePaint(_cachedPaint); // Do actual drawing of the sprite texture.drawTexture(canvas, Point.origin, _cachedPaint); @@ -112,3 +82,42 @@ class Sprite extends NodeWithSize { } } } + +abstract class SpritePaint { + double _opacity = 1.0; + + /// The opacity of the sprite in the range 0.0 to 1.0. + /// + /// mySprite.opacity = 0.5; + double get opacity => _opacity; + + void set opacity(double opacity) { + assert(opacity != null); + assert(opacity >= 0.0 && opacity <= 1.0); + _opacity = opacity; + } + + /// The color to draw on top of the sprite, null if no color overlay is used. + /// + /// // Color the sprite red + /// mySprite.colorOverlay = new Color(0x77ff0000); + Color colorOverlay; + + /// The transfer mode used when drawing the sprite to screen. + /// + /// // Add the colors of the sprite with the colors of the background + /// mySprite.transferMode = TransferMode.plusMode; + TransferMode transferMode; + + void _updatePaint(Paint paint) { + paint.color = new Color.fromARGB((255.0*_opacity).toInt(), 255, 255, 255); + + if (colorOverlay != null) { + _cachedPaint.setColorFilter(new ColorFilter.mode(colorOverlay, TransferMode.srcATop)); + } + + if (transferMode != null) { + _cachedPaint.setTransferMode(transferMode); + } + } +} From 7b4f41e36ca181e026eb93fe3d2185fcfdb8d132 Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Mon, 10 Aug 2015 12:37:12 -0700 Subject: [PATCH 2/3] Adds new Layer class --- examples/game/lib/layer.dart | 19 +++++++++++++++++++ examples/game/lib/sprites.dart | 1 + 2 files changed, 20 insertions(+) create mode 100644 examples/game/lib/layer.dart diff --git a/examples/game/lib/layer.dart b/examples/game/lib/layer.dart new file mode 100644 index 00000000000..ca09d3ff84c --- /dev/null +++ b/examples/game/lib/layer.dart @@ -0,0 +1,19 @@ +part of sprites; + +class Layer extends Node with SpritePaint { + Paint _cachedPaint = new Paint() + ..setFilterQuality(FilterQuality.low) + ..isAntiAlias = false; + + void _prePaint(PaintingCanvas canvas, Matrix4 matrix) { + super._prePaint(canvas, matrix); + + _updatePaint(_cachedPaint); + canvas.saveLayer(null, _cachedPaint); + } + + void _postPaint(PaintingCanvas canvas, Matrix4 totalMatrix) { + canvas.restore(); + super._postPaint(canvas, totalMatrix); + } +} diff --git a/examples/game/lib/sprites.dart b/examples/game/lib/sprites.dart index ee4cdd77ea3..801dbc0dd45 100644 --- a/examples/game/lib/sprites.dart +++ b/examples/game/lib/sprites.dart @@ -21,6 +21,7 @@ import 'package:vector_math/vector_math.dart'; part 'action.dart'; part 'color_secuence.dart'; part 'image_map.dart'; +part 'layer.dart'; part 'node.dart'; part 'node3d.dart'; part 'node_with_size.dart'; From 35bdbbfee0981c18a38e8156101b39910b63006a Mon Sep 17 00:00:00 2001 From: Viktor Lidholt Date: Mon, 10 Aug 2015 12:37:44 -0700 Subject: [PATCH 3/3] Updates demo game with changes to Sprites and Nodes --- examples/game/lib/game_demo_world.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/game/lib/game_demo_world.dart b/examples/game/lib/game_demo_world.dart index 439476fae70..f86816d535a 100644 --- a/examples/game/lib/game_demo_world.dart +++ b/examples/game/lib/game_demo_world.dart @@ -650,7 +650,7 @@ class Hud extends NodeWithSize { _dirtyScore = true; } - Hud(this.spriteSheetUI) { + Hud(this.spriteSheetUI) : super(Size.zero) { pivot = Point.origin; sprtBgScore = new Sprite(spriteSheetUI["scoreboard.png"]);