diff --git a/doc/flame/examples/lib/drag_events.dart b/doc/flame/examples/lib/drag_events.dart index bae704e06..0743954b8 100644 --- a/doc/flame/examples/lib/drag_events.dart +++ b/doc/flame/examples/lib/drag_events.dart @@ -127,7 +127,7 @@ class Trail extends Component { final path = _paths[i]; final opacity = _opacities[i]; if (opacity > 0) { - _linePaint.color = _color.withValues(alpha: opacity); + _linePaint.color = _color.withOpacity(opacity); _linePaint.strokeWidth = lineWidth * opacity; canvas.drawPath(path, _linePaint); } @@ -216,11 +216,11 @@ class Star extends PositionComponent with DragCallbacks { @override void render(Canvas canvas) { if (isDragged) { - _paint.color = color.withValues(alpha: 0.5); + _paint.color = color.withOpacity(0.5); canvas.drawPath(_path, _paint); canvas.drawPath(_path, _borderPaint); } else { - _paint.color = color.withValues(alpha: 1); + _paint.color = color.withOpacity(1); canvas.drawPath(_path, _shadowPaint); canvas.drawPath(_path, _paint); } diff --git a/doc/flame/examples/lib/pointer_events.dart b/doc/flame/examples/lib/pointer_events.dart index 20a70b069..92ebfcaaf 100644 --- a/doc/flame/examples/lib/pointer_events.dart +++ b/doc/flame/examples/lib/pointer_events.dart @@ -32,7 +32,7 @@ class HoverTarget extends PositionComponent with HoverCallbacks { final _paint = Paint() ..color = HSLColor.fromAHSL(1, _random.nextDouble() * 360, 1, 0.8) .toColor() - .withValues(alpha: 0.5); + .withOpacity(0.5); @override void render(Canvas canvas) { @@ -41,11 +41,11 @@ class HoverTarget extends PositionComponent with HoverCallbacks { @override void onHoverEnter() { - _paint.color = _paint.color.withValues(alpha: 1); + _paint.color = _paint.color.withOpacity(1); } @override void onHoverExit() { - _paint.color = _paint.color.withValues(alpha: 0.5); + _paint.color = _paint.color.withOpacity(0.5); } } diff --git a/doc/flame/examples/lib/ray_cast.dart b/doc/flame/examples/lib/ray_cast.dart index 42f31d143..c23aa4c24 100644 --- a/doc/flame/examples/lib/ray_cast.dart +++ b/doc/flame/examples/lib/ray_cast.dart @@ -13,7 +13,7 @@ class RayCastExample extends FlameGame with HasCollisionDetection { final velocity = 60; double get resetPosition => -canvasSize.y; - Paint paint = BasicPalette.red.withOpacity(0.6).paint(); + Paint paint = Paint()..color = Colors.red.withOpacity(0.6); RaycastResult? result; diff --git a/doc/flame/examples/lib/ray_trace.dart b/doc/flame/examples/lib/ray_trace.dart index c39471ba9..e882524cc 100644 --- a/doc/flame/examples/lib/ray_trace.dart +++ b/doc/flame/examples/lib/ray_trace.dart @@ -10,7 +10,7 @@ import 'package:flutter/material.dart'; class RayTraceExample extends FlameGame with HasCollisionDetection, TapDetector { - Paint paint = BasicPalette.red.withOpacity(0.6).paint(); + Paint paint = Paint()..color = Colors.red.withOpacity(0.6); bool isClicked = false; Vector2 get origin => canvasSize / 2; diff --git a/doc/flame/examples/lib/tap_events.dart b/doc/flame/examples/lib/tap_events.dart index c1a1b6f2a..f582b7654 100644 --- a/doc/flame/examples/lib/tap_events.dart +++ b/doc/flame/examples/lib/tap_events.dart @@ -115,7 +115,7 @@ class ExpandingCircle extends Component { removeFromParent(); } else { final opacity = 1 - radius / maxRadius; - _paint.color = _baseColor.withValues(alpha: opacity); + _paint.color = _baseColor.withOpacity(opacity); _paint.strokeWidth = _outerRadius - _innerRadius; } } diff --git a/doc/flame/rendering/particles.md b/doc/flame/rendering/particles.md index 6297ff796..54a953c39 100644 --- a/doc/flame/rendering/particles.md +++ b/doc/flame/rendering/particles.md @@ -250,7 +250,7 @@ game.add( ParticleSystemComponent( particle: CircleParticle( radius: game.size.x / 2, - paint: Paint()..color = Colors.red.withValues(alpha: .5), + paint: Paint()..color = Colors.red.withOpacity(.5), ), ), ); diff --git a/examples/games/padracing/lib/lap_line.dart b/examples/games/padracing/lib/lap_line.dart index 1dc2854ad..2afc1e984 100644 --- a/examples/games/padracing/lib/lap_line.dart +++ b/examples/games/padracing/lib/lap_line.dart @@ -31,7 +31,7 @@ class LapLine extends BodyComponent with ContactCallbacks { @override Body createBody() { paint.color = (isFinish ? GameColors.green.color : GameColors.green.color) - ..withValues(alpha: 0.5); + ..withOpacity(0.5); paint ..style = PaintingStyle.fill ..shader = Gradient.radial( diff --git a/examples/games/padracing/lib/trail.dart b/examples/games/padracing/lib/trail.dart index 9492842f7..06133daf2 100644 --- a/examples/games/padracing/lib/trail.dart +++ b/examples/games/padracing/lib/trail.dart @@ -20,7 +20,7 @@ class Trail extends Component with HasPaint { @override Future onLoad() async { paint - ..color = (tire.paint.color.withValues(alpha: 0.9)) + ..color = (tire.paint.color.withOpacity(0.9)) ..strokeWidth = 1.0; } diff --git a/examples/lib/stories/camera_and_viewport/camera_component_properties_example.dart b/examples/lib/stories/camera_and_viewport/camera_component_properties_example.dart index 5df2f9302..0c9b22b3c 100644 --- a/examples/lib/stories/camera_and_viewport/camera_component_properties_example.dart +++ b/examples/lib/stories/camera_and_viewport/camera_component_properties_example.dart @@ -147,7 +147,7 @@ class ExpandingCircle extends CircleComponent { removeFromParent(); } else { final opacity = 1 - radius / maxRadius; - paint.color = const Color(0xffffffff).withValues(alpha: opacity); + paint.color = const Color(0xffffffff).withOpacity(opacity); } } } diff --git a/examples/lib/stories/camera_and_viewport/fixed_resolution_example.dart b/examples/lib/stories/camera_and_viewport/fixed_resolution_example.dart index 98b68e187..886a834fe 100644 --- a/examples/lib/stories/camera_and_viewport/fixed_resolution_example.dart +++ b/examples/lib/stories/camera_and_viewport/fixed_resolution_example.dart @@ -127,7 +127,7 @@ class TextButton extends ButtonComponent { ), buttonDown: RectangleComponent( size: Vector2(200, 100), - paint: BasicPalette.orange.withOpacity(0.5).paint(), + paint: Paint()..color = BasicPalette.orange.color.withOpacity(0.5), ), children: [ TextComponent( diff --git a/examples/lib/stories/collision_detection/multiple_shapes_example.dart b/examples/lib/stories/collision_detection/multiple_shapes_example.dart index 5545a2018..145f808ec 100644 --- a/examples/lib/stories/collision_detection/multiple_shapes_example.dart +++ b/examples/lib/stories/collision_detection/multiple_shapes_example.dart @@ -94,8 +94,8 @@ abstract class MyCollidable extends PositionComponent final Vector2 velocity; final delta = Vector2.zero(); double angleDelta = 0; - final Color _defaultColor = Colors.blue.withValues(alpha: 0.8); - final Color _collisionColor = Colors.green.withValues(alpha: 0.8); + final Color _defaultColor = Colors.blue.withOpacity(0.8); + final Color _collisionColor = Colors.green.withOpacity(0.8); late final Paint _dragIndicatorPaint; final ScreenHitbox screenHitbox; ShapeHitbox? hitbox; @@ -219,7 +219,7 @@ class CollidableCircle extends MyCollidable { class SnowmanPart extends CircleHitbox { @override final renderShape = true; - final startColor = Colors.white.withValues(alpha: 0.8); + final startColor = Colors.white.withOpacity(0.8); final Color hitColor; SnowmanPart(double radius, Vector2 position, this.hitColor) @@ -234,7 +234,7 @@ class SnowmanPart extends CircleHitbox { if (other.hitboxParent is ScreenHitbox) { paint.color = startColor; } else { - paint.color = hitColor.withValues(alpha: 0.8); + paint.color = hitColor.withOpacity(0.8); } } diff --git a/examples/lib/stories/collision_detection/raycast_example.dart b/examples/lib/stories/collision_detection/raycast_example.dart index 7b1e134ec..a3736cfa1 100644 --- a/examples/lib/stories/collision_detection/raycast_example.dart +++ b/examples/lib/stories/collision_detection/raycast_example.dart @@ -17,7 +17,7 @@ around trying not to hit them. Ray2? ray; Ray2? reflection; Vector2 origin = Vector2(250, 100); - Paint paint = Paint()..color = Colors.amber.withValues(alpha: 0.6); + Paint paint = Paint()..color = Colors.amber.withOpacity(0.6); final speed = 100; final inertia = 3.0; final safetyDistance = 50; diff --git a/examples/lib/stories/collision_detection/raycast_light_example.dart b/examples/lib/stories/collision_detection/raycast_light_example.dart index 64f8939ad..b6f8864b6 100644 --- a/examples/lib/stories/collision_detection/raycast_light_example.dart +++ b/examples/lib/stories/collision_detection/raycast_light_example.dart @@ -28,8 +28,8 @@ with with mouse. Paint tapPaint = Paint(); final _colorTween = ColorTween( - begin: Colors.blue.withValues(alpha: 0.2), - end: Colors.red.withValues(alpha: 0.2), + begin: Colors.blue.withOpacity(0.2), + end: Colors.red.withOpacity(0.2), ); static const numberOfRays = 2000; diff --git a/examples/lib/stories/collision_detection/raytrace_example.dart b/examples/lib/stories/collision_detection/raytrace_example.dart index 9e4efdb95..5115ed8bc 100644 --- a/examples/lib/stories/collision_detection/raytrace_example.dart +++ b/examples/lib/stories/collision_detection/raytrace_example.dart @@ -23,8 +23,8 @@ bounce on will appear. '''; final _colorTween = ColorTween( - begin: Colors.amber.withValues(alpha: 1.0), - end: Colors.lightBlueAccent.withValues(alpha: 1.0), + begin: Colors.amber.withOpacity(1.0), + end: Colors.lightBlueAccent.withOpacity(1.0), ); final random = Random(); Ray2? ray; diff --git a/examples/lib/stories/components/keys_example.dart b/examples/lib/stories/components/keys_example.dart index 84f15f7d7..8373039e4 100644 --- a/examples/lib/stories/components/keys_example.dart +++ b/examples/lib/stories/components/keys_example.dart @@ -106,13 +106,13 @@ class SelectableClass extends SpriteComponent { super.size, super.key, super.sprite, - }) : super(paint: Paint()..color = Colors.white.withValues(alpha: 0.5)); + }) : super(paint: Paint()..color = Colors.white.withOpacity(0.5)); bool _selected = false; bool get selected => _selected; set selected(bool value) { _selected = value; paint = Paint() - ..color = value ? Colors.white : Colors.white.withValues(alpha: 0.5); + ..color = value ? Colors.white : Colors.white.withOpacity(0.5); } } diff --git a/examples/lib/stories/effects/opacity_effect_example.dart b/examples/lib/stories/effects/opacity_effect_example.dart index 736263438..f13f5f3bd 100644 --- a/examples/lib/stories/effects/opacity_effect_example.dart +++ b/examples/lib/stories/effects/opacity_effect_example.dart @@ -42,7 +42,7 @@ class OpacityEffectExample extends FlameGame with TapDetector { @override void onTap() { - final opacity = sprite.paint.color.a; + final opacity = sprite.paint.color.opacity; if (opacity >= 0.5) { sprite.add(OpacityEffect.fadeOut(EffectController(duration: 1))); } else { diff --git a/examples/lib/stories/input/overlapping_tap_callbacks_example.dart b/examples/lib/stories/input/overlapping_tap_callbacks_example.dart index 1bb5d649d..78bcacd8e 100644 --- a/examples/lib/stories/input/overlapping_tap_callbacks_example.dart +++ b/examples/lib/stories/input/overlapping_tap_callbacks_example.dart @@ -30,7 +30,7 @@ class TapCallbacksSquare extends RectangleComponent with TapCallbacks { position: position ?? Vector2.all(100), size: Vector2.all(100), paint: continuePropagation - ? (Paint()..color = Colors.green.withValues(alpha: 0.9)) + ? (Paint()..color = Colors.green.withOpacity(0.9)) : PaintExtension.random(withAlpha: 0.9, base: 100), ); diff --git a/examples/lib/stories/rendering/particles_example.dart b/examples/lib/stories/rendering/particles_example.dart index 0b2ceb76d..b182a808e 100644 --- a/examples/lib/stories/rendering/particles_example.dart +++ b/examples/lib/stories/rendering/particles_example.dart @@ -432,9 +432,7 @@ class ParticlesExample extends FlameGame { renderer: (canvas, particle) { final paint = randomElement(paints); // Override the color to dynamically update opacity - paint.color = paint.color.withValues( - alpha: 1 - particle.progress, - ); + paint.color = paint.color.withOpacity(1 - particle.progress); canvas.drawCircle( Offset.zero, diff --git a/examples/lib/stories/system/resize_example.dart b/examples/lib/stories/system/resize_example.dart index f60458c64..3c12b69a8 100644 --- a/examples/lib/stories/system/resize_example.dart +++ b/examples/lib/stories/system/resize_example.dart @@ -13,7 +13,7 @@ class ResizingRectangle extends RectangleComponent { void onGameResize(Vector2 size) { super.onGameResize(size); - this.size = size * 0.4; + this.size = size * .4; } } diff --git a/packages/flame/lib/src/components/mixins/has_paint.dart b/packages/flame/lib/src/components/mixins/has_paint.dart index 4afdc4530..2c5b5bfb3 100644 --- a/packages/flame/lib/src/components/mixins/has_paint.dart +++ b/packages/flame/lib/src/components/mixins/has_paint.dart @@ -83,15 +83,12 @@ mixin HasPaint on Component throw ArgumentError('Opacity needs to be between 0 and 1'); } - setColor( - getPaint(paintId).color.withValues(alpha: opacity), - paintId: paintId, - ); + setColor(getPaint(paintId).color.withOpacity(opacity), paintId: paintId); } /// Returns the current opacity. double getOpacity({T? paintId}) { - return getPaint(paintId).color.a; + return getPaint(paintId).color.opacity; } /// Changes the opacity of the paint. @@ -103,6 +100,11 @@ mixin HasPaint on Component setColor(getPaint(paintId).color.withAlpha(alpha), paintId: paintId); } + /// Returns the current opacity. + int getAlpha({T? paintId}) { + return getPaint(paintId).color.alpha; + } + /// Shortcut for changing the color of the paint. void setColor(Color color, {T? paintId}) { getPaint(paintId).color = color; @@ -116,13 +118,13 @@ mixin HasPaint on Component } @override - double get opacity => paint.color.a; + double get opacity => paint.color.opacity; @override set opacity(double value) { - paint.color = paint.color.withValues(alpha: value); + paint.color = paint.color.withOpacity(value); for (final paint in _paints.values) { - paint.color = paint.color.withValues(alpha: value); + paint.color = paint.color.withOpacity(value); } } @@ -184,7 +186,7 @@ class _MultiPaintOpacityProvider implements OpacityProvider { ]; _layerOpacityRatios = target.paintLayersInternal ?.map( - (paint) => paint.color.a / maxOpacity, + (paint) => paint.color.opacity / maxOpacity, ) .toList(growable: false); } @@ -204,7 +206,7 @@ class _MultiPaintOpacityProvider implements OpacityProvider { } if (includeLayers) { target.paintLayersInternal?.forEach( - (paint) => maxOpacity = max(paint.color.a, maxOpacity), + (paint) => maxOpacity = max(paint.color.opacity, maxOpacity), ); } @@ -224,7 +226,7 @@ class _MultiPaintOpacityProvider implements OpacityProvider { for (var i = 0; i < (paintLayersInternal?.length ?? 0); ++i) { paintLayersInternal![i].color = paintLayersInternal[i] .color - .withValues(alpha: value * _layerOpacityRatios![i]); + .withOpacity(value * _layerOpacityRatios![i]); } } } diff --git a/packages/flame/lib/src/effects/color_effect.dart b/packages/flame/lib/src/effects/color_effect.dart index d06b22568..d50ec32a3 100644 --- a/packages/flame/lib/src/effects/color_effect.dart +++ b/packages/flame/lib/src/effects/color_effect.dart @@ -43,8 +43,8 @@ class ColorEffect extends ComponentEffect { @override void apply(double progress) { - final currentColor = color.withValues( - alpha: min(max(_tween.transform(progress), 0), 1), + final currentColor = color.withOpacity( + min(max(_tween.transform(progress), 0), 1), ); target.tint(currentColor, paintId: paintId); } diff --git a/packages/flame/lib/src/extensions/color.dart b/packages/flame/lib/src/extensions/color.dart index 1ebc33e10..4a9cdccc4 100644 --- a/packages/flame/lib/src/extensions/color.dart +++ b/packages/flame/lib/src/extensions/color.dart @@ -13,11 +13,11 @@ extension ColorExtension on Color { assert(amount >= 0 && amount <= 1); final f = 1 - amount; - return Color.from( - alpha: a, - red: r * f, - green: g * f, - blue: b * f, + return Color.fromARGB( + alpha, + (red * f).round(), + (green * f).round(), + (blue * f).round(), ); } @@ -29,11 +29,11 @@ extension ColorExtension on Color { Color brighten(double amount) { assert(amount >= 0 && amount <= 1); - return Color.from( - alpha: a, - red: r + (1.0 - r) * amount, - blue: b + (1.0 - b) * amount, - green: g + (1.0 - g) * amount, + return Color.fromARGB( + alpha, + red + ((255 - red) * amount).round(), + green + ((255 - green) * amount).round(), + blue + ((255 - blue) * amount).round(), ); } diff --git a/packages/flame/lib/src/extensions/image.dart b/packages/flame/lib/src/extensions/image.dart index bb1c449bd..3c3055f34 100644 --- a/packages/flame/lib/src/extensions/image.dart +++ b/packages/flame/lib/src/extensions/image.dart @@ -47,45 +47,48 @@ extension ImageExtension on Image { /// /// The [amount] is a double value between 0 and 1. Future darken(double amount) async { - return _transformColorsByAmount( - amount, - (color, amount) => color.darken(amount), - ); - } - - /// Change each pixel's color to be brighter and return a new [Image]. - /// - /// The [amount] is a double value between 0 and 1. - Future brighten(double amount) async { - return _transformColorsByAmount( - amount, - (color, amount) => color.brighten(amount), - ); - } - - Future _transformColorsByAmount( - double amount, - Color Function(Color, double) process, - ) async { assert(amount >= 0 && amount <= 1); final pixelData = await pixelsInUint8(); final newPixelData = Uint8List(pixelData.length); for (var i = 0; i < pixelData.length; i += 4) { - final originalColor = Color.fromARGB( + final color = Color.fromARGB( pixelData[i + 3], pixelData[i + 0], pixelData[i + 1], pixelData[i + 2], - ); + ).darken(amount); - final color = process(originalColor, amount); + newPixelData[i] = color.red; + newPixelData[i + 1] = color.green; + newPixelData[i + 2] = color.blue; + newPixelData[i + 3] = color.alpha; + } + return fromPixels(newPixelData, width, height); + } - newPixelData[i] = (255 * color.r).round(); - newPixelData[i + 1] = (255 * color.g).round(); - newPixelData[i + 2] = (255 * color.b).round(); - newPixelData[i + 3] = (255 * color.a).round(); + /// Change each pixel's color to be brighter and return a new [Image]. + /// + /// The [amount] is a double value between 0 and 1. + Future brighten(double amount) async { + assert(amount >= 0 && amount <= 1); + + final pixelData = await pixelsInUint8(); + final newPixelData = Uint8List(pixelData.length); + + for (var i = 0; i < pixelData.length; i += 4) { + final color = Color.fromARGB( + pixelData[i + 3], + pixelData[i + 0], + pixelData[i + 1], + pixelData[i + 2], + ).brighten(amount); + + newPixelData[i] = color.red; + newPixelData[i + 1] = color.green; + newPixelData[i + 2] = color.blue; + newPixelData[i + 3] = color.alpha; } return fromPixels(newPixelData, width, height); } diff --git a/packages/flame/lib/src/layers/processors.dart b/packages/flame/lib/src/layers/processors.dart index c7fd34971..7e21f97a4 100644 --- a/packages/flame/lib/src/layers/processors.dart +++ b/packages/flame/lib/src/layers/processors.dart @@ -14,10 +14,8 @@ class ShadowProcessor extends LayerProcessor { double opacity = 0.9, Color color = const Color(0xFF000000), }) : _shadowPaint = Paint() - ..colorFilter = ColorFilter.mode( - color.withValues(alpha: opacity), - BlendMode.srcATop, - ); + ..colorFilter = + ColorFilter.mode(color.withOpacity(opacity), BlendMode.srcATop); @override void process(Picture pic, Canvas canvas) { diff --git a/packages/flame/lib/src/palette.dart b/packages/flame/lib/src/palette.dart index da4de6193..1bd502146 100644 --- a/packages/flame/lib/src/palette.dart +++ b/packages/flame/lib/src/palette.dart @@ -7,10 +7,6 @@ class PaletteEntry { const PaletteEntry(this.color); - PaletteEntry withOpacity(double opacity) { - return PaletteEntry(color.withValues(alpha: opacity)); - } - PaletteEntry withAlpha(int alpha) { return PaletteEntry(color.withAlpha(alpha)); } diff --git a/packages/flame/test/_goldens/align_component_1.png b/packages/flame/test/_goldens/align_component_1.png index 3c0edc804..be6c17cd0 100644 Binary files a/packages/flame/test/_goldens/align_component_1.png and b/packages/flame/test/_goldens/align_component_1.png differ diff --git a/packages/flame/test/components/mixins/has_paint_test.dart b/packages/flame/test/components/mixins/has_paint_test.dart index 3dd03a715..3c917f010 100644 --- a/packages/flame/test/components/mixins/has_paint_test.dart +++ b/packages/flame/test/components/mixins/has_paint_test.dart @@ -1,7 +1,6 @@ import 'dart:ui'; import 'package:flame/components.dart'; -import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -171,7 +170,7 @@ void main() { final component = _MyComponent(); component.makeTransparent(); - expect(component.paint.color.a, 0); + expect(component.paint.color.opacity, 0); }, ); @@ -183,7 +182,7 @@ void main() { component.makeTransparent(paintId: _MyComponentKeys.background); expect( - component.getPaint(_MyComponentKeys.background).color.a, + component.getPaint(_MyComponentKeys.background).color.opacity, 0, ); }, @@ -196,7 +195,7 @@ void main() { component.makeTransparent(); component.makeOpaque(); - expect(component.paint.color.a, 1); + expect(component.paint.color.opacity, 1); }, ); @@ -210,9 +209,9 @@ void main() { ); component.makeOpaque(paintId: _MyComponentKeys.background); - expectDouble( - component.getPaint(_MyComponentKeys.background).color.a, - 1.0, + expect( + component.getPaint(_MyComponentKeys.background).color.opacity, + 1, ); }, ); @@ -223,7 +222,7 @@ void main() { final component = _MyComponent(); component.setOpacity(0.2); - expectDouble(component.paint.color.a, 0.2); + expect(component.paint.color.opacity, 0.2); }, ); @@ -234,8 +233,8 @@ void main() { component.setPaint(_MyComponentKeys.background, Paint()); component.setOpacity(0.2, paintId: _MyComponentKeys.background); - expectDouble( - component.getPaint(_MyComponentKeys.background).color.a, + expect( + component.getPaint(_MyComponentKeys.background).color.opacity, 0.2, ); }, diff --git a/packages/flame/test/effects/opacity_effect_test.dart b/packages/flame/test/effects/opacity_effect_test.dart index 1875a09f8..55c723ea0 100644 --- a/packages/flame/test/effects/opacity_effect_test.dart +++ b/packages/flame/test/effects/opacity_effect_test.dart @@ -33,7 +33,7 @@ void main() { OpacityEffect.by(0.4, EffectController(duration: 1)), ); game.update(0); - expectDouble(component.getOpacity(), 0.2, epsilon: epsilon); + expect(component.getOpacity(), 0.2); expect(component.children.length, 1); game.update(0.5); @@ -55,7 +55,7 @@ void main() { OpacityEffect.to(0.4, EffectController(duration: 1)), ); game.update(0); - expectDouble(component.getOpacity(), 0.2, epsilon: epsilon); + expect(component.getOpacity(), 0.2); expect(component.children.length, 1); game.update(0.5); @@ -215,12 +215,12 @@ void main() { game.update(1); - expect(component.getPaint('bluePaint').color.a, isZero); + expect(component.getPaint('bluePaint').color.opacity, isZero); // RGB components shouldn't be affected after opacity effect. - expect(component.getPaint('bluePaint').color.b, 1.0); - expect(component.getPaint('bluePaint').color.r, isZero); - expect(component.getPaint('bluePaint').color.g, isZero); + expect(component.getPaint('bluePaint').color.blue, 255); + expect(component.getPaint('bluePaint').color.red, isZero); + expect(component.getPaint('bluePaint').color.green, isZero); }, ); @@ -242,10 +242,10 @@ void main() { game.update(1); // All paints should have the same opacity after the effect completes. - expect(component.getPaint().color.a, isZero); - expect(component.getPaint(_PaintTypes.paint1).color.a, isZero); - expect(component.getPaint(_PaintTypes.paint2).color.a, isZero); - expect(component.getPaint(_PaintTypes.paint3).color.a, isZero); + expect(component.getPaint().color.opacity, isZero); + expect(component.getPaint(_PaintTypes.paint1).color.opacity, isZero); + expect(component.getPaint(_PaintTypes.paint2).color.opacity, isZero); + expect(component.getPaint(_PaintTypes.paint3).color.opacity, isZero); }, ); @@ -263,17 +263,17 @@ void main() { ..color = BasicPalette.green .paint() .color - .withValues(alpha: redInitialOpacity), + .withOpacity(redInitialOpacity), _PaintTypes.paint2: BasicPalette.green.paint() ..color = BasicPalette.green .paint() .color - .withValues(alpha: greenInitialOpacity), + .withOpacity(greenInitialOpacity), _PaintTypes.paint3: BasicPalette.blue.paint() ..color = BasicPalette.blue .paint() .color - .withValues(alpha: blueInitialOpacity), + .withOpacity(blueInitialOpacity), }, ); await game.ensureAdd(component); @@ -289,15 +289,15 @@ void main() { game.update(1); expectDouble( - component.getPaint(_PaintTypes.paint1).color.a, + component.getPaint(_PaintTypes.paint1).color.opacity, redInitialOpacity * targetOpacity, ); expectDouble( - component.getPaint(_PaintTypes.paint2).color.a, + component.getPaint(_PaintTypes.paint2).color.opacity, greenInitialOpacity * targetOpacity, ); expectDouble( - component.getPaint(_PaintTypes.paint3).color.a, + component.getPaint(_PaintTypes.paint3).color.opacity, blueInitialOpacity * targetOpacity, ); }, @@ -317,17 +317,17 @@ void main() { ..color = BasicPalette.green .paint() .color - .withValues(alpha: redInitialOpacity), + .withOpacity(redInitialOpacity), _PaintTypes.paint2: BasicPalette.green.paint() ..color = BasicPalette.green .paint() .color - .withValues(alpha: greenInitialOpacity), + .withOpacity(greenInitialOpacity), _PaintTypes.paint3: BasicPalette.blue.paint() ..color = BasicPalette.blue .paint() .color - .withValues(alpha: blueInitialOpacity), + .withOpacity(blueInitialOpacity), }, ); await game.ensureAdd(component); @@ -344,17 +344,17 @@ void main() { game.update(1); expectDouble( - component.getPaint(_PaintTypes.paint1).color.a, + component.getPaint(_PaintTypes.paint1).color.opacity, targetOpacity, ); expectDouble( - component.getPaint(_PaintTypes.paint2).color.a, + component.getPaint(_PaintTypes.paint2).color.opacity, (greenInitialOpacity / redInitialOpacity) * targetOpacity, ); // Opacity of this paint shouldn't be changed. expectDouble( - component.getPaint(_PaintTypes.paint3).color.a, + component.getPaint(_PaintTypes.paint3).color.opacity, blueInitialOpacity, ); }, diff --git a/packages/flame/test/extensions/image_extension_test.dart b/packages/flame/test/extensions/image_extension_test.dart index fe2555ae7..57afac872 100644 --- a/packages/flame/test/extensions/image_extension_test.dart +++ b/packages/flame/test/extensions/image_extension_test.dart @@ -120,12 +120,11 @@ void main() { } int _colorBit(int index, Color color) { - final value = switch (index % 4) { - 0 => color.r, - 1 => color.g, - 2 => color.b, - 3 => color.a, + return switch (index % 4) { + 0 => color.red, + 1 => color.green, + 2 => color.blue, + 3 => color.alpha, _ => throw UnimplementedError(), }; - return (255 * value).round(); } diff --git a/packages/flame/test/extensions/paint_test.dart b/packages/flame/test/extensions/paint_test.dart index 77ef8e159..8a60ce9cd 100644 --- a/packages/flame/test/extensions/paint_test.dart +++ b/packages/flame/test/extensions/paint_test.dart @@ -46,8 +46,9 @@ void main() { // valid inputs are : ccc, CCC, #ccc, #CCC, #c1c1c1, #C1C1C1, c1c1c1, // C1C1C1 final color = ColorExtension.random(); - - final sixHexColor = '${_hex2(color.r)}${_hex2(color.g)}${_hex2(color.b)}'; + final sixHexColor = color.red.toRadixString(16).padLeft(2, '0') + + color.green.toRadixString(16).padLeft(2, '0') + + color.blue.toRadixString(16).padLeft(2, '0'); // C1C1C1 final sixUpperCaseColor = sixHexColor.toUpperCase(); @@ -80,8 +81,9 @@ void main() { ); // Let's generate a new color from only 3 digits - final threeHexColor = - '${_hex1(color.r)}${_hex1(color.g)}${_hex1(color.b)}'; + final threeHexColor = color.red.toRadixString(16).padLeft(1, '0')[0] + + color.green.toRadixString(16).padLeft(1, '0')[0] + + color.blue.toRadixString(16).padLeft(1, '0')[0]; final threeDigitsColor = ColorExtension.fromRGBHexString(threeHexColor); // CCC @@ -125,8 +127,10 @@ void main() { // valid inputs are : fccc, FCCC, #fccc, #FCCC, #ffc1c1c1, #FFC1C1C1, // ffc1c1c1, FFC1C1C1 var color = ColorExtension.random(rng: r); - final sixHexColor = '${_hex2(color.a)}${_hex2(color.r)}' - '${_hex2(color.g)}${_hex2(color.b)}'; + final sixHexColor = color.alpha.toRadixString(16).padLeft(2, '0') + + color.red.toRadixString(16).padLeft(2, '0') + + color.green.toRadixString(16).padLeft(2, '0') + + color.blue.toRadixString(16).padLeft(2, '0'); // FFC1C1C1 final sixUpperCaseColor = sixHexColor.toUpperCase(); @@ -159,8 +163,10 @@ void main() { ); // Let's generate a new color from only 3 digits - final threeHexColor = '${_hex1(color.a)}${_hex1(color.r)}' - '${_hex1(color.g)}${_hex1(color.b)}'; + final threeHexColor = color.alpha.toRadixString(16).padLeft(1, '0')[0] + + color.red.toRadixString(16).padLeft(1, '0')[0] + + color.green.toRadixString(16).padLeft(1, '0')[0] + + color.blue.toRadixString(16).padLeft(1, '0')[0]; color = ColorExtension.fromARGBHexString(threeHexColor); // FCCC @@ -207,18 +213,10 @@ void main() { // As explained in the documentation // object with the set alpha as [withAlpha] expect( - paint.color.a, - closeTo(color.a, 10e-6), + paint.color.alpha, + color.alpha, reason: 'alpha does not have the right value', ); }); }); } - -String _hex2(double v) { - return (255 * v).round().toRadixString(16).padLeft(2, '0'); -} - -String _hex1(double v) { - return (255 * v).round().toRadixString(16).padLeft(1, '0')[0]; -} diff --git a/packages/flame/test/text/sprite_font_renderer_test.dart b/packages/flame/test/text/sprite_font_renderer_test.dart index 40731e609..872e7ea13 100644 --- a/packages/flame/test/text/sprite_font_renderer_test.dart +++ b/packages/flame/test/text/sprite_font_renderer_test.dart @@ -55,7 +55,6 @@ void main() { ]); }, goldenFile: '../_goldens/sprite_font_renderer_1.png', - skip: true, ); testGolden( @@ -117,7 +116,6 @@ void main() { }, goldenFile: '../_goldens/sprite_font_renderer_2.png', size: Vector2(200, 140), - skip: true, ); testGolden( @@ -219,7 +217,6 @@ void main() { }, goldenFile: '../_goldens/sprite_font_renderer_3.png', size: Vector2(200, 70), - skip: true, ); testGolden( @@ -266,7 +263,6 @@ void main() { }, goldenFile: '../_goldens/sprite_font_renderer_4.png', size: Vector2(200, 130), - skip: true, ); }); } diff --git a/packages/flame_3d/lib/src/extensions/color.dart b/packages/flame_3d/lib/src/extensions/color.dart index 51d12dbab..9d06264fc 100644 --- a/packages/flame_3d/lib/src/extensions/color.dart +++ b/packages/flame_3d/lib/src/extensions/color.dart @@ -3,5 +3,10 @@ import 'dart:ui'; extension ColorExtension on Color { /// Returns a Float32List that represents the color as a vector. - Float32List get storage => Float32List.fromList([a, r, g, b]); + Float32List get storage => Float32List.fromList([ + opacity, + red.toDouble() / 255, + green.toDouble() / 255, + blue.toDouble() / 255, + ]); } diff --git a/packages/flame_3d/lib/src/resources/texture/color_texture.dart b/packages/flame_3d/lib/src/resources/texture/color_texture.dart index 7e867e590..2ef6a490e 100644 --- a/packages/flame_3d/lib/src/resources/texture/color_texture.dart +++ b/packages/flame_3d/lib/src/resources/texture/color_texture.dart @@ -11,7 +11,6 @@ class ColorTexture extends Texture { ColorTexture(Color color, {int width = 1, int height = 1}) : super( Uint32List.fromList( - // ignore: deprecated_member_use List.filled(width * height, color.value), ).buffer.asByteData(), width: width, diff --git a/packages/flame_isolate/example/lib/terrain/grass.dart b/packages/flame_isolate/example/lib/terrain/grass.dart index 0c2b0f5c8..8b14a8bb6 100755 --- a/packages/flame_isolate/example/lib/terrain/grass.dart +++ b/packages/flame_isolate/example/lib/terrain/grass.dart @@ -1,11 +1,10 @@ import 'package:flame/components.dart'; -import 'package:flame/palette.dart'; import 'package:flame_isolate_example/terrain/terrain.dart'; import 'package:flutter/material.dart'; class Grass extends PositionComponent with Terrain { static final _color = Paint()..color = const Color(0xff567d46); - static final _debugColor = BasicPalette.black.withOpacity(0.5).paint(); + static final _debugColor = Paint()..color = Colors.black.withOpacity(0.5); late final _rect = size.toRect(); late final _rect2 = Rect.fromCenter( diff --git a/packages/flame_oxygen/example/lib/system/kawabunga_system.dart b/packages/flame_oxygen/example/lib/system/kawabunga_system.dart index da50c4249..1173c703f 100644 --- a/packages/flame_oxygen/example/lib/system/kawabunga_system.dart +++ b/packages/flame_oxygen/example/lib/system/kawabunga_system.dart @@ -16,9 +16,7 @@ class KawabungaSystem extends BaseSystem with UpdateSystem { final textComponent = entity.get()!; final textRenderer = TextPaint( style: textComponent.style.copyWith( - color: textComponent.style.color!.withValues( - alpha: 1 - timer.percentage, - ), + color: textComponent.style.color!.withOpacity(1 - timer.percentage), ), ); diff --git a/packages/flame_sprite_fusion/test/sprite_fusion_tilemap_component_test.dart b/packages/flame_sprite_fusion/test/sprite_fusion_tilemap_component_test.dart index 247f7d099..b8f6e54ba 100644 --- a/packages/flame_sprite_fusion/test/sprite_fusion_tilemap_component_test.dart +++ b/packages/flame_sprite_fusion/test/sprite_fusion_tilemap_component_test.dart @@ -102,7 +102,6 @@ void main() { }, size: Vector2(360, 216), goldenFile: 'goldens/sprite_fusion_render_test.png', - skip: true, ); testGolden( @@ -121,7 +120,6 @@ void main() { }, size: Vector2(360, 216), goldenFile: 'goldens/sprite_fusion_position_test.png', - skip: true, ); testGolden( @@ -140,7 +138,6 @@ void main() { }, size: Vector2(360, 216), goldenFile: 'goldens/sprite_fusion_anchor_test.png', - skip: true, ); testGolden( @@ -159,7 +156,6 @@ void main() { }, size: Vector2(360, 216), goldenFile: 'goldens/sprite_fusion_scale_test.png', - skip: true, ); testGolden( @@ -178,7 +174,6 @@ void main() { }, size: Vector2(360, 216), goldenFile: 'goldens/sprite_fusion_angle_test.png', - skip: true, ); }); } diff --git a/packages/flame_svg/test/_goldens/render_sharply.png b/packages/flame_svg/test/_goldens/render_sharply.png index e915b2dfe..445e79c89 100644 Binary files a/packages/flame_svg/test/_goldens/render_sharply.png and b/packages/flame_svg/test/_goldens/render_sharply.png differ diff --git a/packages/flame_tiled/test/tile_atlas_test.dart b/packages/flame_tiled/test/tile_atlas_test.dart index c6c7d5e6e..a465192e0 100644 --- a/packages/flame_tiled/test/tile_atlas_test.dart +++ b/packages/flame_tiled/test/tile_atlas_test.dart @@ -115,28 +115,24 @@ void main() { expect(atlas2.atlas!.isCloneOf(atlas2.atlas!), isTrue); }); - test( - 'packs complex maps with multiple images', - () async { - final component = await TiledComponent.load( - 'isometric_plain.tmx', - Vector2(128, 74), - bundle: bundle, - images: Images(bundle: bundle), - ); + test('packs complex maps with multiple images', () async { + final component = await TiledComponent.load( + 'isometric_plain.tmx', + Vector2(128, 74), + bundle: bundle, + images: Images(bundle: bundle), + ); - final atlas = TiledAtlas.atlasMap.values.first; - expect( - await imageToPng(atlas.atlas!), - matchesGoldenFile('goldens/larger_atlas.png'), - ); - expect( - renderMapToPng(component), - matchesGoldenFile('goldens/larger_atlas_component.png'), - ); - }, - skip: true, - ); + final atlas = TiledAtlas.atlasMap.values.first; + expect( + await imageToPng(atlas.atlas!), + matchesGoldenFile('goldens/larger_atlas.png'), + ); + expect( + renderMapToPng(component), + matchesGoldenFile('goldens/larger_atlas_component.png'), + ); + }); test( 'packs complex maps with multiple images using a custom spacing', @@ -162,45 +158,36 @@ void main() { ), ); }, - skip: true, ); - test( - 'can ignore tilesets in the packing', - () async { - await TiledComponent.load( - 'isometric_plain.tmx', - Vector2(128, 74), - bundle: bundle, - images: Images(bundle: bundle), - tsxPackingFilter: (tileset) => tileset.name != 'isometric_plain_2', - ); + test('can ignore tilesets in the packing', () async { + await TiledComponent.load( + 'isometric_plain.tmx', + Vector2(128, 74), + bundle: bundle, + images: Images(bundle: bundle), + tsxPackingFilter: (tileset) => tileset.name != 'isometric_plain_2', + ); - final atlas = TiledAtlas.atlasMap.values.first; - expect( - await imageToPng(atlas.atlas!), - matchesGoldenFile('goldens/larger_atlas_with_skipped_tileset.png'), - ); - }, - skip: true, - ); + final atlas = TiledAtlas.atlasMap.values.first; + expect( + await imageToPng(atlas.atlas!), + matchesGoldenFile('goldens/larger_atlas_with_skipped_tileset.png'), + ); + }); - test( - 'clearing cache', - () async { - await TiledAtlas.fromTiledMap( - simpleMap, - images: Images(bundle: bundle), - ); + test('clearing cache', () async { + await TiledAtlas.fromTiledMap( + simpleMap, + images: Images(bundle: bundle), + ); - expect(TiledAtlas.atlasMap.isNotEmpty, true); + expect(TiledAtlas.atlasMap.isNotEmpty, true); - TiledAtlas.clearCache(); + TiledAtlas.clearCache(); - expect(TiledAtlas.atlasMap.isEmpty, true); - }, - skip: true, - ); + expect(TiledAtlas.atlasMap.isEmpty, true); + }); }); group('Single tileset map', () { @@ -220,44 +207,42 @@ void main() { }); test( - '''Two maps with a same tileset but different tile alignment should be rendered differently''', - () async { - final components = await Future.wait([ - TiledComponent.load( - 'single_tile_map_1.tmx', - Vector2(16, 16), - bundle: bundle, - images: Images(bundle: bundle), - ), - TiledComponent.load( - 'single_tile_map_2.tmx', - Vector2(16, 16), - bundle: bundle, - images: Images(bundle: bundle), - ), - ]); + '''Two maps with a same tileset but different tile alignment should be rendered differently''', + () async { + final components = await Future.wait([ + TiledComponent.load( + 'single_tile_map_1.tmx', + Vector2(16, 16), + bundle: bundle, + images: Images(bundle: bundle), + ), + TiledComponent.load( + 'single_tile_map_2.tmx', + Vector2(16, 16), + bundle: bundle, + images: Images(bundle: bundle), + ), + ]); - final atlas = TiledAtlas.atlasMap.values.first; - final imageRendered_1 = renderMapToPng(components[0]); - final imageRendered_2 = renderMapToPng(components[1]); + final atlas = TiledAtlas.atlasMap.values.first; + final imageRendered_1 = renderMapToPng(components[0]); + final imageRendered_2 = renderMapToPng(components[1]); - expect(TiledAtlas.atlasMap.length, 1); - expect( - await imageToPng(atlas.atlas!), - matchesGoldenFile('goldens/single_tile_atlas.png'), - ); - expect(imageRendered_1, isNot(same(imageRendered_2))); - expect( - imageRendered_1, - matchesGoldenFile('goldens/single_tile_map_1.png'), - ); - expect( - imageRendered_2, - matchesGoldenFile('goldens/single_tile_map_2.png'), - ); - }, - skip: true, - ); + expect(TiledAtlas.atlasMap.length, 1); + expect( + await imageToPng(atlas.atlas!), + matchesGoldenFile('goldens/single_tile_atlas.png'), + ); + expect(imageRendered_1, isNot(same(imageRendered_2))); + expect( + imageRendered_1, + matchesGoldenFile('goldens/single_tile_map_1.png'), + ); + expect( + imageRendered_2, + matchesGoldenFile('goldens/single_tile_map_2.png'), + ); + }); }); }); } diff --git a/packages/flame_tiled/test/tiled_test.dart b/packages/flame_tiled/test/tiled_test.dart index 194300c4f..cf4afcf17 100644 --- a/packages/flame_tiled/test/tiled_test.dart +++ b/packages/flame_tiled/test/tiled_test.dart @@ -182,7 +182,6 @@ void main() { test( 'Correctly loads batches list', () => expect(overlapMap.renderableLayers.length == 2, true), - skip: true, ); test( @@ -191,334 +190,309 @@ void main() { canvasPixelData.length == 16 * 32 * pixel, true, ), - skip: true, ); - test( - 'Base test - right tile pixel is red', - () { - expect( - canvasPixelData[16 * pixel] == 255 && - canvasPixelData[(16 * pixel) + 1] == 0 && - canvasPixelData[(16 * pixel) + 2] == 0 && - canvasPixelData[(16 * pixel) + 3] == 255, - true, - ); - final rightTilePixels = []; - for (var i = 16 * pixel; i < 16 * 32 * pixel; i += 32 * pixel) { - rightTilePixels.addAll(canvasPixelData.getRange(i, i + (16 * pixel))); - } + test('Base test - right tile pixel is red', () { + expect( + canvasPixelData[16 * pixel] == 255 && + canvasPixelData[(16 * pixel) + 1] == 0 && + canvasPixelData[(16 * pixel) + 2] == 0 && + canvasPixelData[(16 * pixel) + 3] == 255, + true, + ); + final rightTilePixels = []; + for (var i = 16 * pixel; i < 16 * 32 * pixel; i += 32 * pixel) { + rightTilePixels.addAll(canvasPixelData.getRange(i, i + (16 * pixel))); + } - var allRed = true; - for (var i = 0; i < rightTilePixels.length; i += pixel) { - allRed &= rightTilePixels[i] == 255 && - rightTilePixels[i + 1] == 0 && - rightTilePixels[i + 2] == 0 && - rightTilePixels[i + 3] == 255; - } - expect(allRed, true); - }, - skip: true, - ); + var allRed = true; + for (var i = 0; i < rightTilePixels.length; i += pixel) { + allRed &= rightTilePixels[i] == 255 && + rightTilePixels[i + 1] == 0 && + rightTilePixels[i + 2] == 0 && + rightTilePixels[i + 3] == 255; + } + expect(allRed, true); + }); - test( - 'Left tile pixel is green', - () { - expect( - canvasPixelData[15 * pixel] == 0 && - canvasPixelData[(15 * pixel) + 1] == 255 && - canvasPixelData[(15 * pixel) + 2] == 0 && - canvasPixelData[(15 * pixel) + 3] == 255, - true, - ); + test('Left tile pixel is green', () { + expect( + canvasPixelData[15 * pixel] == 0 && + canvasPixelData[(15 * pixel) + 1] == 255 && + canvasPixelData[(15 * pixel) + 2] == 0 && + canvasPixelData[(15 * pixel) + 3] == 255, + true, + ); - final leftTilePixels = []; - for (var i = 0; i < 15 * 32 * pixel; i += 32 * pixel) { - leftTilePixels.addAll(canvasPixelData.getRange(i, i + (16 * pixel))); - } + final leftTilePixels = []; + for (var i = 0; i < 15 * 32 * pixel; i += 32 * pixel) { + leftTilePixels.addAll(canvasPixelData.getRange(i, i + (16 * pixel))); + } - var allGreen = true; - for (var i = 0; i < leftTilePixels.length; i += pixel) { - allGreen &= leftTilePixels[i] == 0 && - leftTilePixels[i + 1] == 255 && - leftTilePixels[i + 2] == 0 && - leftTilePixels[i + 3] == 255; - } - expect(allGreen, true); - }, - skip: true, - ); + var allGreen = true; + for (var i = 0; i < leftTilePixels.length; i += pixel) { + allGreen &= leftTilePixels[i] == 0 && + leftTilePixels[i + 1] == 255 && + leftTilePixels[i + 2] == 0 && + leftTilePixels[i + 3] == 255; + } + expect(allGreen, true); + }); }); - group( - 'Flipped and rotated tiles render correctly with sprite batch:', - () { - late Uint8List pixelsBeforeFlipApplied; - late Uint8List pixelsAfterFlipApplied; - late RenderableTiledMap overlapMap; + group('Flipped and rotated tiles render correctly with sprite batch:', () { + late Uint8List pixelsBeforeFlipApplied; + late Uint8List pixelsAfterFlipApplied; + late RenderableTiledMap overlapMap; - Future renderMap() async { - final canvasRecorder = PictureRecorder(); - final canvas = Canvas(canvasRecorder); - overlapMap.render(canvas); - final picture = canvasRecorder.endRecording(); + Future renderMap() async { + final canvasRecorder = PictureRecorder(); + final canvas = Canvas(canvasRecorder); + overlapMap.render(canvas); + final picture = canvasRecorder.endRecording(); - final image = await picture.toImageSafe(64, 32); - final bytes = await image.toByteData(); - return bytes!.buffer.asUint8List(); + final image = await picture.toImageSafe(64, 32); + final bytes = await image.toByteData(); + return bytes!.buffer.asUint8List(); + } + + setUp(() async { + final bundle = TestAssetBundle( + imageNames: [ + '4_color_sprite.png', + ], + stringNames: ['8_tiles-flips.tmx'], + ); + overlapMap = await RenderableTiledMap.fromFile( + '8_tiles-flips.tmx', + Vector2.all(16), + bundle: bundle, + images: Images(bundle: bundle), + ); + + pixelsBeforeFlipApplied = await renderMap(); + await Flame.images.ready(); + pixelsAfterFlipApplied = await renderMap(); + }); + + test('[useAtlas = true] Green tile pixels are in correct spots', () { + const oneColorRect = 8; + final leftTilePixels = []; + for (var i = 65 * oneColorRect * pixel; + i < ((64 * 23) + (oneColorRect * 3)) * pixel; + i += 64 * pixel) { + leftTilePixels + .addAll(pixelsAfterFlipApplied.getRange(i, i + (16 * pixel))); } - setUp(() async { - final bundle = TestAssetBundle( - imageNames: [ - '4_color_sprite.png', - ], - stringNames: ['8_tiles-flips.tmx'], - ); - overlapMap = await RenderableTiledMap.fromFile( + var allGreen = true; + for (var i = 0; i < leftTilePixels.length; i += pixel) { + allGreen &= leftTilePixels[i] == 0 && + leftTilePixels[i + 1] == 255 && + leftTilePixels[i + 2] == 0 && + leftTilePixels[i + 3] == 255; + } + expect(allGreen, true); + + final rightTilePixels = []; + for (var i = 69 * 8 * pixel; + i < ((64 * 23) + (8 * 7)) * pixel; + i += 64 * pixel) { + rightTilePixels + .addAll(pixelsAfterFlipApplied.getRange(i, i + (16 * pixel))); + } + + for (var i = 0; i < rightTilePixels.length; i += pixel) { + allGreen &= rightTilePixels[i] == 0 && + rightTilePixels[i + 1] == 255 && + rightTilePixels[i + 2] == 0 && + rightTilePixels[i + 3] == 255; + } + expect(allGreen, true); + }); + + test('[useAtlas = false] Green tile pixels are in correct spots', () { + final leftTilePixels = []; + for (var i = 65 * 8 * pixel; + i < ((64 * 23) + (8 * 3)) * pixel; + i += 64 * pixel) { + leftTilePixels + .addAll(pixelsBeforeFlipApplied.getRange(i, i + (16 * pixel))); + } + + var allGreen = true; + for (var i = 0; i < leftTilePixels.length; i += pixel) { + allGreen &= leftTilePixels[i] == 0 && + leftTilePixels[i + 1] == 255 && + leftTilePixels[i + 2] == 0 && + leftTilePixels[i + 3] == 255; + } + expect(allGreen, true); + + final rightTilePixels = []; + for (var i = 69 * 8 * pixel; + i < ((64 * 23) + (8 * 7)) * pixel; + i += 64 * pixel) { + rightTilePixels + .addAll(pixelsBeforeFlipApplied.getRange(i, i + (16 * pixel))); + } + + for (var i = 0; i < rightTilePixels.length; i += pixel) { + allGreen &= rightTilePixels[i] == 0 && + rightTilePixels[i + 1] == 255 && + rightTilePixels[i + 2] == 0 && + rightTilePixels[i + 3] == 255; + } + expect(allGreen, true); + }); + }); + + group('ignoring flip makes different texture and rendering result', () { + Image? texture; + Uint8List? rendered; + + Future prepareForGolden({required bool ignoreFlip}) async { + final bundle = TestAssetBundle( + imageNames: [ + '4_color_sprite.png', + ], + stringNames: ['8_tiles-flips.tmx'], + ); + final tiledComponent = TiledComponent( + await RenderableTiledMap.fromFile( '8_tiles-flips.tmx', Vector2.all(16), + ignoreFlip: ignoreFlip, bundle: bundle, images: Images(bundle: bundle), - ); - - pixelsBeforeFlipApplied = await renderMap(); - await Flame.images.ready(); - pixelsAfterFlipApplied = await renderMap(); - }); - - test('[useAtlas = true] Green tile pixels are in correct spots', () { - const oneColorRect = 8; - final leftTilePixels = []; - for (var i = 65 * oneColorRect * pixel; - i < ((64 * 23) + (oneColorRect * 3)) * pixel; - i += 64 * pixel) { - leftTilePixels - .addAll(pixelsAfterFlipApplied.getRange(i, i + (16 * pixel))); - } - - var allGreen = true; - for (var i = 0; i < leftTilePixels.length; i += pixel) { - allGreen &= leftTilePixels[i] == 0 && - leftTilePixels[i + 1] == 255 && - leftTilePixels[i + 2] == 0 && - leftTilePixels[i + 3] == 255; - } - expect(allGreen, true); - - final rightTilePixels = []; - for (var i = 69 * 8 * pixel; - i < ((64 * 23) + (8 * 7)) * pixel; - i += 64 * pixel) { - rightTilePixels - .addAll(pixelsAfterFlipApplied.getRange(i, i + (16 * pixel))); - } - - for (var i = 0; i < rightTilePixels.length; i += pixel) { - allGreen &= rightTilePixels[i] == 0 && - rightTilePixels[i + 1] == 255 && - rightTilePixels[i + 2] == 0 && - rightTilePixels[i + 3] == 255; - } - expect(allGreen, true); - }); - - test('[useAtlas = false] Green tile pixels are in correct spots', () { - final leftTilePixels = []; - for (var i = 65 * 8 * pixel; - i < ((64 * 23) + (8 * 3)) * pixel; - i += 64 * pixel) { - leftTilePixels - .addAll(pixelsBeforeFlipApplied.getRange(i, i + (16 * pixel))); - } - - var allGreen = true; - for (var i = 0; i < leftTilePixels.length; i += pixel) { - allGreen &= leftTilePixels[i] == 0 && - leftTilePixels[i + 1] == 255 && - leftTilePixels[i + 2] == 0 && - leftTilePixels[i + 3] == 255; - } - expect(allGreen, true); - - final rightTilePixels = []; - for (var i = 69 * 8 * pixel; - i < ((64 * 23) + (8 * 7)) * pixel; - i += 64 * pixel) { - rightTilePixels - .addAll(pixelsBeforeFlipApplied.getRange(i, i + (16 * pixel))); - } - - for (var i = 0; i < rightTilePixels.length; i += pixel) { - allGreen &= rightTilePixels[i] == 0 && - rightTilePixels[i + 1] == 255 && - rightTilePixels[i + 2] == 0 && - rightTilePixels[i + 3] == 255; - } - expect(allGreen, true); - }); - }, - skip: true, - ); - - group( - 'ignoring flip makes different texture and rendering result', - () { - Image? texture; - Uint8List? rendered; - - Future prepareForGolden({required bool ignoreFlip}) async { - final bundle = TestAssetBundle( - imageNames: [ - '4_color_sprite.png', - ], - stringNames: ['8_tiles-flips.tmx'], - ); - final tiledComponent = TiledComponent( - await RenderableTiledMap.fromFile( - '8_tiles-flips.tmx', - Vector2.all(16), - ignoreFlip: ignoreFlip, - bundle: bundle, - images: Images(bundle: bundle), - ), - ); - - await Flame.images.ready(); - - texture = (tiledComponent.tileMap.renderableLayers[0] as FlameTileLayer) - .tiledAtlas - .batch - ?.atlas; - - rendered = await renderMapToPng(tiledComponent); - } - - test('flip works with [ignoreFlip = false]', () async { - await prepareForGolden(ignoreFlip: false); - expect(texture, matchesGoldenFile('goldens/texture_with_flip.png')); - expect(rendered, matchesGoldenFile('goldens/rendered_with_flip.png')); - }); - - test('flip ignored with [ignoreFlip = true]', () async { - await prepareForGolden(ignoreFlip: true); - expect( - texture, - matchesGoldenFile('goldens/texture_with_flip_ignored.png'), - ); - expect( - rendered, - matchesGoldenFile('goldens/rendered_with_flip_ignored.png'), - ); - }); - }, - skip: true, - ); - - group( - 'Test getLayer:', - () { - late RenderableTiledMap renderableTiledMap; - setUp(() async { - Flame.bundle = TestAssetBundle( - imageNames: ['map-level1.png'], - stringNames: ['layers_test.tmx'], - ); - renderableTiledMap = await RenderableTiledMap.fromFile( - 'layers_test.tmx', - Vector2.all(32), - bundle: Flame.bundle, - ); - }); - - test('Get Tile Layer', () { - expect( - renderableTiledMap.getLayer('MyTileLayer'), - isNotNull, - ); - }); - - test('Get Object Layer', () { - expect( - renderableTiledMap.getLayer('MyObjectLayer'), - isNotNull, - ); - }); - - test('Get Image Layer', () { - expect( - renderableTiledMap.getLayer('MyImageLayer'), - isNotNull, - ); - }); - - test('Get Group Layer', () { - expect( - renderableTiledMap.getLayer('MyGroupLayer'), - isNotNull, - ); - }); - - test('Get no layer', () { - expect( - renderableTiledMap.getLayer('Nonexistent layer'), - isNull, - ); - }); - }, - skip: true, - ); - - group( - 'orthogonal with groups, offsets, opacity and parallax', - () { - late TiledComponent component; - final mapSizePx = Vector2(32 * 16, 128 * 16); - - setUp(() async { - Flame.bundle = TestAssetBundle( - imageNames: [ - 'image1.png', - 'map-level1.png', - ], - stringNames: ['map.tmx'], - ); - component = await TiledComponent.load( - 'map.tmx', - Vector2(16, 16), - bundle: Flame.bundle, - ); - - // Need to initialize a game and call `onLoad` and `onGameResize` to - // get the camera and canvas sizes all initialized - final game = FlameGame(); - game.onGameResize(mapSizePx); - final camera = game.camera; - game.world.add(component); - camera.viewfinder.position = Vector2(150, 20); - camera.viewport.size = mapSizePx.clone(); - game.onGameResize(mapSizePx); - component.onGameResize(mapSizePx); - await component.onLoad(); - await game.ready(); - }); - - test('component size', () { - expect(component.tileMap.destTileSize, Vector2(16, 16)); - expect(component.size, mapSizePx); - }); - - test( - 'renders', - () async { - final pngData = await renderMapToPng(component); - - expect(pngData, matchesGoldenFile('goldens/orthogonal.png')); - }, + ), ); - }, - skip: true, - ); + + await Flame.images.ready(); + + texture = (tiledComponent.tileMap.renderableLayers[0] as FlameTileLayer) + .tiledAtlas + .batch + ?.atlas; + + rendered = await renderMapToPng(tiledComponent); + } + + test('flip works with [ignoreFlip = false]', () async { + await prepareForGolden(ignoreFlip: false); + expect(texture, matchesGoldenFile('goldens/texture_with_flip.png')); + expect(rendered, matchesGoldenFile('goldens/rendered_with_flip.png')); + }); + + test('flip ignored with [ignoreFlip = true]', () async { + await prepareForGolden(ignoreFlip: true); + expect( + texture, + matchesGoldenFile('goldens/texture_with_flip_ignored.png'), + ); + expect( + rendered, + matchesGoldenFile('goldens/rendered_with_flip_ignored.png'), + ); + }); + }); + + group('Test getLayer:', () { + late RenderableTiledMap renderableTiledMap; + setUp(() async { + Flame.bundle = TestAssetBundle( + imageNames: ['map-level1.png'], + stringNames: ['layers_test.tmx'], + ); + renderableTiledMap = await RenderableTiledMap.fromFile( + 'layers_test.tmx', + Vector2.all(32), + bundle: Flame.bundle, + ); + }); + + test('Get Tile Layer', () { + expect( + renderableTiledMap.getLayer('MyTileLayer'), + isNotNull, + ); + }); + + test('Get Object Layer', () { + expect( + renderableTiledMap.getLayer('MyObjectLayer'), + isNotNull, + ); + }); + + test('Get Image Layer', () { + expect( + renderableTiledMap.getLayer('MyImageLayer'), + isNotNull, + ); + }); + + test('Get Group Layer', () { + expect( + renderableTiledMap.getLayer('MyGroupLayer'), + isNotNull, + ); + }); + + test('Get no layer', () { + expect( + renderableTiledMap.getLayer('Nonexistent layer'), + isNull, + ); + }); + }); + + group('orthogonal with groups, offsets, opacity and parallax', () { + late TiledComponent component; + final mapSizePx = Vector2(32 * 16, 128 * 16); + + setUp(() async { + Flame.bundle = TestAssetBundle( + imageNames: [ + 'image1.png', + 'map-level1.png', + ], + stringNames: ['map.tmx'], + ); + component = await TiledComponent.load( + 'map.tmx', + Vector2(16, 16), + bundle: Flame.bundle, + ); + + // Need to initialize a game and call `onLoad` and `onGameResize` to + // get the camera and canvas sizes all initialized + final game = FlameGame(); + game.onGameResize(mapSizePx); + final camera = game.camera; + game.world.add(component); + camera.viewfinder.position = Vector2(150, 20); + camera.viewport.size = mapSizePx.clone(); + game.onGameResize(mapSizePx); + component.onGameResize(mapSizePx); + await component.onLoad(); + await game.ready(); + }); + + test('component size', () { + expect(component.tileMap.destTileSize, Vector2(16, 16)); + expect(component.size, mapSizePx); + }); + + test( + 'renders', + () async { + final pngData = await renderMapToPng(component); + + expect(pngData, matchesGoldenFile('goldens/orthogonal.png')); + }, + ); + }); group('isometric', () { late TiledComponent component; @@ -631,322 +605,306 @@ void main() { }); }); - group( - 'tile offset', - () { - late TiledComponent component; + group('tile offset', () { + late TiledComponent component; - Future setupMap( - String tmxFile, - String imageFile, - Vector2 destTileSize, - ) async { - final bundle = TestAssetBundle( - imageNames: [ - imageFile, - ], - stringNames: [tmxFile], - ); - return component = await TiledComponent.load( - tmxFile, - destTileSize, - bundle: bundle, - images: Images(bundle: bundle), - ); - } + Future setupMap( + String tmxFile, + String imageFile, + Vector2 destTileSize, + ) async { + final bundle = TestAssetBundle( + imageNames: [ + imageFile, + ], + stringNames: [tmxFile], + ); + return component = await TiledComponent.load( + tmxFile, + destTileSize, + bundle: bundle, + images: Images(bundle: bundle), + ); + } - test('tile offset hexagonal', () async { - await setupMap( - // flame tiled currently does not support hexagon side length - // property; to use export from Tiled, tweak that value - 'test_tile_offset_hexagonal.tmx', - '4_color_sprite.png', - Vector2(16, 16), - ); + test('tile offset hexagonal', () async { + await setupMap( + // flame tiled currently does not support hexagon side length property, + // to use export from Tiled, tweak that value + 'test_tile_offset_hexagonal.tmx', + '4_color_sprite.png', + Vector2(16, 16), + ); - expect(component.size, Vector2(40, 28)); + expect(component.size, Vector2(40, 28)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/test_tile_offset_hexagonal.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/test_tile_offset_hexagonal.png'), + ); + }); - test('tile offset isometric', () async { - await setupMap( - 'test_tile_offset_isometric.tmx', - '4_color_sprite.png', - Vector2(16, 16), - ); + test('tile offset isometric', () async { + await setupMap( + 'test_tile_offset_isometric.tmx', + '4_color_sprite.png', + Vector2(16, 16), + ); - expect(component.size, Vector2(32, 32)); + expect(component.size, Vector2(32, 32)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/test_tile_offset_isometric.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/test_tile_offset_isometric.png'), + ); + }); - test('tile offset orthogonal', () async { - await setupMap( - 'test_tile_offset_orthogonal.tmx', - '4_color_sprite.png', - Vector2(16, 16), - ); + test('tile offset orthogonal', () async { + await setupMap( + 'test_tile_offset_orthogonal.tmx', + '4_color_sprite.png', + Vector2(16, 16), + ); - expect(component.size, Vector2(32, 32)); + expect(component.size, Vector2(32, 32)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/test_tile_offset_orthogonal.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/test_tile_offset_orthogonal.png'), + ); + }); - test('tile offset staggered', () async { - await setupMap( - 'test_tile_offset_staggered.tmx', - '4_color_sprite.png', - Vector2(16, 16), - ); + test('tile offset staggered', () async { + await setupMap( + 'test_tile_offset_staggered.tmx', + '4_color_sprite.png', + Vector2(16, 16), + ); - expect(component.size, Vector2(40, 24)); + expect(component.size, Vector2(40, 24)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/test_tile_offset_staggered.png'), - ); - }); - }, - skip: true, - ); + expect( + pngData, + matchesGoldenFile('goldens/test_tile_offset_staggered.png'), + ); + }); + }); - group( - 'isometric staggered', - () { - late TiledComponent component; + group('isometric staggered', () { + late TiledComponent component; - Future setupMap( - String tmxFile, - String imageFile, - Vector2 destTileSize, - ) async { - final bundle = TestAssetBundle( - imageNames: [ - imageFile, - ], - stringNames: [tmxFile], - ); - return component = await TiledComponent.load( - tmxFile, - destTileSize, - bundle: bundle, - images: Images(bundle: bundle), - ); - } + Future setupMap( + String tmxFile, + String imageFile, + Vector2 destTileSize, + ) async { + final bundle = TestAssetBundle( + imageNames: [ + imageFile, + ], + stringNames: [tmxFile], + ); + return component = await TiledComponent.load( + tmxFile, + destTileSize, + bundle: bundle, + images: Images(bundle: bundle), + ); + } - test('x + odd', () async { - await setupMap( - 'iso_staggered_overlap_x_odd.tmx', - 'dirt_atlas.png', - Vector2(128, 64), - ); + test('x + odd', () async { + await setupMap( + 'iso_staggered_overlap_x_odd.tmx', + 'dirt_atlas.png', + Vector2(128, 64), + ); - expect(component.size, Vector2(320, 288)); + expect(component.size, Vector2(320, 288)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/iso_staggered_overlap_x_odd.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/iso_staggered_overlap_x_odd.png'), + ); + }); - test('x + even + half sized', () async { - await setupMap( - 'iso_staggered_overlap_x_even.tmx', - 'dirt_atlas.png', - Vector2(128 / 2, 64 / 2), - ); + test('x + even + half sized', () async { + await setupMap( + 'iso_staggered_overlap_x_even.tmx', + 'dirt_atlas.png', + Vector2(128 / 2, 64 / 2), + ); - expect(component.size, Vector2(320 / 2, 288 / 2)); + expect(component.size, Vector2(320 / 2, 288 / 2)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/iso_staggered_overlap_x_even.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/iso_staggered_overlap_x_even.png'), + ); + }); - test('y + odd + half', () async { - await setupMap( - 'iso_staggered_overlap_y_odd.tmx', - 'dirt_atlas.png', - Vector2(128 / 2, 64 / 2), - ); + test('y + odd + half', () async { + await setupMap( + 'iso_staggered_overlap_y_odd.tmx', + 'dirt_atlas.png', + Vector2(128 / 2, 64 / 2), + ); - expect(component.size, Vector2(576 / 2, 160 / 2)); + expect(component.size, Vector2(576 / 2, 160 / 2)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/iso_staggered_overlap_y_odd.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/iso_staggered_overlap_y_odd.png'), + ); + }); - test('y + even', () async { - await setupMap( - 'iso_staggered_overlap_y_even.tmx', - 'dirt_atlas.png', - Vector2(128, 64), - ); + test('y + even', () async { + await setupMap( + 'iso_staggered_overlap_y_even.tmx', + 'dirt_atlas.png', + Vector2(128, 64), + ); - expect(component.size, Vector2(576, 160)); + expect(component.size, Vector2(576, 160)); - final pngData = await renderMapToPng(component); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/iso_staggered_overlap_y_even.png'), - ); - }); - }, - skip: true, - ); + expect( + pngData, + matchesGoldenFile('goldens/iso_staggered_overlap_y_even.png'), + ); + }); + }); - group( - 'shifted and scaled', - () { - late TiledComponent component; - final size = Vector2(256, 128); + group('shifted and scaled', () { + late TiledComponent component; + final size = Vector2(256, 128); - Future setupMap( - Vector2 destTileSize, - ) async { - final bundle = TestAssetBundle( - imageNames: [ - 'isometric_spritesheet.png', - ], - stringNames: ['test_shifted.tmx'], - ); - component = await TiledComponent.load( - 'test_shifted.tmx', - destTileSize, - bundle: bundle, - images: Images(bundle: bundle), - ); - } + Future setupMap( + Vector2 destTileSize, + ) async { + final bundle = TestAssetBundle( + imageNames: [ + 'isometric_spritesheet.png', + ], + stringNames: ['test_shifted.tmx'], + ); + component = await TiledComponent.load( + 'test_shifted.tmx', + destTileSize, + bundle: bundle, + images: Images(bundle: bundle), + ); + } - test('regular', () async { - await setupMap(size); - final pngData = await renderMapToPng(component); + test('regular', () async { + await setupMap(size); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/shifted_scaled_regular.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/shifted_scaled_regular.png'), + ); + }); - test('smaller', () async { - final smallSize = size / 3; - await setupMap(smallSize); - final pngData = await renderMapToPng(component); + test('smaller', () async { + final smallSize = size / 3; + await setupMap(smallSize); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/shifted_scaled_smaller.png'), - ); - }); + expect( + pngData, + matchesGoldenFile('goldens/shifted_scaled_smaller.png'), + ); + }); - test('larger', () async { - final largeSize = size * 2; - await setupMap(largeSize); - final pngData = await renderMapToPng(component); + test('larger', () async { + final largeSize = size * 2; + await setupMap(largeSize); + final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/shifted_scaled_larger.png'), - ); - }); - }, - skip: true, - ); + expect( + pngData, + matchesGoldenFile('goldens/shifted_scaled_larger.png'), + ); + }); + }); - group( - 'TileStack', - () { - late TiledComponent component; - final size = Vector2(256 / 2, 128 / 2); + group('TileStack', () { + late TiledComponent component; + final size = Vector2(256 / 2, 128 / 2); - setUp(() async { - final bundle = TestAssetBundle( - imageNames: [ - 'isometric_spritesheet.png', - ], - stringNames: ['test_isometric.tmx'], - ); - component = await TiledComponent.load( - 'test_isometric.tmx', - size, - bundle: bundle, - images: Images(bundle: bundle), - ); - }); - test('from all layers', () { - var stack = component.tileMap.tileStack(0, 0, all: true); - expect(stack.length, 2); + setUp(() async { + final bundle = TestAssetBundle( + imageNames: [ + 'isometric_spritesheet.png', + ], + stringNames: ['test_isometric.tmx'], + ); + component = await TiledComponent.load( + 'test_isometric.tmx', + size, + bundle: bundle, + images: Images(bundle: bundle), + ); + }); + test('from all layers', () { + var stack = component.tileMap.tileStack(0, 0, all: true); + expect(stack.length, 2); - stack = component.tileMap.tileStack(1, 0, all: true); - expect(stack.length, 1); - }); + stack = component.tileMap.tileStack(1, 0, all: true); + expect(stack.length, 1); + }); - test('from some layers', () { - var stack = component.tileMap.tileStack(0, 0, named: {'empty'}); - expect(stack.length, 0); + test('from some layers', () { + var stack = component.tileMap.tileStack(0, 0, named: {'empty'}); + expect(stack.length, 0); - stack = component.tileMap.tileStack(0, 0, named: {'item'}); - expect(stack.length, 1); + stack = component.tileMap.tileStack(0, 0, named: {'item'}); + expect(stack.length, 1); - stack = component.tileMap.tileStack(0, 0, ids: {1}); - expect(stack.length, 1); + stack = component.tileMap.tileStack(0, 0, ids: {1}); + expect(stack.length, 1); - stack = component.tileMap.tileStack(0, 0, ids: {1, 2}); - expect(stack.length, 2); - }); + stack = component.tileMap.tileStack(0, 0, ids: {1, 2}); + expect(stack.length, 2); + }); - test('can be positioned together', () async { - final stack = component.tileMap.tileStack(0, 0, all: true); - stack.position = stack.position + Vector2.all(20); + test('can be positioned together', () async { + final stack = component.tileMap.tileStack(0, 0, all: true); + stack.position = stack.position + Vector2.all(20); - final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/tile_stack_all_move.png'), - ); - }); + final pngData = await renderMapToPng(component); + expect( + pngData, + matchesGoldenFile('goldens/tile_stack_all_move.png'), + ); + }); - test('can be positioned singularly', () async { - final stack = component.tileMap.tileStack(0, 0, named: {'item'}); - stack.position = stack.position + Vector2(-20, 20); + test('can be positioned singularly', () async { + final stack = component.tileMap.tileStack(0, 0, named: {'item'}); + stack.position = stack.position + Vector2(-20, 20); - final pngData = await renderMapToPng(component); - expect( - pngData, - matchesGoldenFile('goldens/tile_stack_single_move.png'), - ); - }); - }, - skip: true, - ); + final pngData = await renderMapToPng(component); + expect( + pngData, + matchesGoldenFile('goldens/tile_stack_single_move.png'), + ); + }); + }); group('animated tiles', () { late TiledComponent component; @@ -1045,38 +1003,34 @@ void main() { /// This will not produce a pretty map for non-orthogonal, but that's /// OK, we're looking for parsing and handling of animations. - test( - 'renders ($mapType)', - () async { - var pngData = await renderMapToPng(component); - await expectLater( - pngData, - matchesGoldenFile('goldens/dungeon_animation_${mapType}_0.png'), - ); + test('renders ($mapType)', () async { + var pngData = await renderMapToPng(component); + await expectLater( + pngData, + matchesGoldenFile('goldens/dungeon_animation_${mapType}_0.png'), + ); - component.update(0.18); - pngData = await renderMapToPng(component); - await expectLater( - pngData, - matchesGoldenFile('goldens/dungeon_animation_${mapType}_1.png'), - ); + component.update(0.18); + pngData = await renderMapToPng(component); + await expectLater( + pngData, + matchesGoldenFile('goldens/dungeon_animation_${mapType}_1.png'), + ); - component.update(0.18); - pngData = await renderMapToPng(component); - await expectLater( - pngData, - matchesGoldenFile('goldens/dungeon_animation_${mapType}_2.png'), - ); + component.update(0.18); + pngData = await renderMapToPng(component); + await expectLater( + pngData, + matchesGoldenFile('goldens/dungeon_animation_${mapType}_2.png'), + ); - component.update(0.18); - pngData = await renderMapToPng(component); - await expectLater( - pngData, - matchesGoldenFile('goldens/dungeon_animation_${mapType}_3.png'), - ); - }, - skip: true, - ); + component.update(0.18); + pngData = await renderMapToPng(component); + await expectLater( + pngData, + matchesGoldenFile('goldens/dungeon_animation_${mapType}_3.png'), + ); + }); }); } }); @@ -1107,17 +1061,13 @@ void main() { ); }); - test( - 'renders ($mapType)', - () async { - final pngData = await renderMapToPng(component); - await expectLater( - pngData, - matchesGoldenFile('goldens/oversized_tiles_$mapType.png'), - ); - }, - skip: true, - ); + test('renders ($mapType)', () async { + final pngData = await renderMapToPng(component); + await expectLater( + pngData, + matchesGoldenFile('goldens/oversized_tiles_$mapType.png'), + ); + }); }); } });