From ff3d91075c49df8efb6130f8e8ac9b711a1a8a14 Mon Sep 17 00:00:00 2001 From: Erick Date: Fri, 30 Jun 2023 01:03:00 -0300 Subject: [PATCH] feat: Adding filterQuality arguments to Parallax load methods (#2596) The Parallax already supported filter quality, but the loader methods were missing parameters for it to be passed to the loaded instances, making it impossible (unless manually loading) to set a filter quality in a parallax. By setting a filter quality to none (which on flutter means that the next neighbour algorithm will be user) on pixel art sprites we can keep the crisp look that that style of art demands. --- .../parallax/advanced_parallax_example.dart | 3 +++ .../parallax/animation_parallax_example.dart | 3 +++ .../parallax/basic_parallax_example.dart | 3 +++ .../parallax/component_parallax_example.dart | 3 +++ .../parallax/no_fcs_parallax_example.dart | 3 +++ .../sandbox_layer_parallax_example.dart | 6 ++++++ .../lib/src/components/parallax_component.dart | 4 ++++ packages/flame/lib/src/parallax.dart | 18 ++++++++++++++++++ 8 files changed, 43 insertions(+) diff --git a/examples/lib/stories/parallax/advanced_parallax_example.dart b/examples/lib/stories/parallax/advanced_parallax_example.dart index cdfa05827..79d4e9ecd 100644 --- a/examples/lib/stories/parallax/advanced_parallax_example.dart +++ b/examples/lib/stories/parallax/advanced_parallax_example.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flame/components.dart'; import 'package:flame/game.dart'; import 'package:flame/parallax.dart'; @@ -21,6 +23,7 @@ class AdvancedParallaxExample extends FlameGame { (e) => loadParallaxLayer( ParallaxImageData(e.key), velocityMultiplier: Vector2(e.value, 1.0), + filterQuality: FilterQuality.none, ), ); final parallax = ParallaxComponent( diff --git a/examples/lib/stories/parallax/animation_parallax_example.dart b/examples/lib/stories/parallax/animation_parallax_example.dart index 571f890c3..4363d4e8b 100644 --- a/examples/lib/stories/parallax/animation_parallax_example.dart +++ b/examples/lib/stories/parallax/animation_parallax_example.dart @@ -12,6 +12,7 @@ class AnimationParallaxExample extends FlameGame { Future onLoad() async { final cityLayer = await loadParallaxLayer( ParallaxImageData('parallax/city.png'), + filterQuality: FilterQuality.none, ); final rainLayer = await loadParallaxLayer( @@ -24,6 +25,7 @@ class AnimationParallaxExample extends FlameGame { ), ), velocityMultiplier: Vector2(2, 0), + filterQuality: FilterQuality.none, ); final cloudsLayer = await loadParallaxLayer( @@ -31,6 +33,7 @@ class AnimationParallaxExample extends FlameGame { velocityMultiplier: Vector2(4, 0), fill: LayerFill.none, alignment: Alignment.topLeft, + filterQuality: FilterQuality.none, ); final parallax = Parallax( diff --git a/examples/lib/stories/parallax/basic_parallax_example.dart b/examples/lib/stories/parallax/basic_parallax_example.dart index e05fd3e0d..d7ce1f54f 100644 --- a/examples/lib/stories/parallax/basic_parallax_example.dart +++ b/examples/lib/stories/parallax/basic_parallax_example.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flame/components.dart'; import 'package:flame/game.dart'; import 'package:flame/parallax.dart'; @@ -21,6 +23,7 @@ class BasicParallaxExample extends FlameGame { _imageNames, baseVelocity: Vector2(20, 0), velocityMultiplierDelta: Vector2(1.8, 1.0), + filterQuality: FilterQuality.none, ); add(parallax); } diff --git a/examples/lib/stories/parallax/component_parallax_example.dart b/examples/lib/stories/parallax/component_parallax_example.dart index 0f1ed7dd6..2fbc7e1c9 100644 --- a/examples/lib/stories/parallax/component_parallax_example.dart +++ b/examples/lib/stories/parallax/component_parallax_example.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flame/components.dart'; import 'package:flame/game.dart'; import 'package:flame/parallax.dart'; @@ -27,6 +29,7 @@ class MyParallaxComponent extends ParallaxComponent { ], baseVelocity: Vector2(20, 0), velocityMultiplierDelta: Vector2(1.8, 1.0), + filterQuality: FilterQuality.none, ); } } diff --git a/examples/lib/stories/parallax/no_fcs_parallax_example.dart b/examples/lib/stories/parallax/no_fcs_parallax_example.dart index c9b74434b..9c4ab68f2 100644 --- a/examples/lib/stories/parallax/no_fcs_parallax_example.dart +++ b/examples/lib/stories/parallax/no_fcs_parallax_example.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flame/extensions.dart'; import 'package:flame/game.dart'; import 'package:flame/parallax.dart'; @@ -26,6 +28,7 @@ class NoFCSParallaxExample extends Game { size: size, baseVelocity: Vector2(20, 0), velocityMultiplierDelta: Vector2(1.8, 1.0), + filterQuality: FilterQuality.none, ); } diff --git a/examples/lib/stories/parallax/sandbox_layer_parallax_example.dart b/examples/lib/stories/parallax/sandbox_layer_parallax_example.dart index 5c235f938..0044e545d 100644 --- a/examples/lib/stories/parallax/sandbox_layer_parallax_example.dart +++ b/examples/lib/stories/parallax/sandbox_layer_parallax_example.dart @@ -26,22 +26,27 @@ class SandboxLayerParallaxExample extends FlameGame { Future onLoad() async { final bgLayer = await loadParallaxLayer( ParallaxImageData('parallax/bg.png'), + filterQuality: FilterQuality.none, ); final mountainFarLayer = await loadParallaxLayer( ParallaxImageData('parallax/mountain-far.png'), velocityMultiplier: Vector2(1.8, 0), + filterQuality: FilterQuality.none, ); final mountainLayer = await loadParallaxLayer( ParallaxImageData('parallax/mountains.png'), velocityMultiplier: Vector2(2.8, 0), + filterQuality: FilterQuality.none, ); final treeLayer = await loadParallaxLayer( ParallaxImageData('parallax/trees.png'), velocityMultiplier: Vector2(3.8, 0), + filterQuality: FilterQuality.none, ); final foregroundTreesLayer = await loadParallaxLayer( ParallaxImageData('parallax/foreground-trees.png'), velocityMultiplier: Vector2(4.8, 0), + filterQuality: FilterQuality.none, ); final airplaneLayer = await loadParallaxLayer( ParallaxAnimationData( @@ -56,6 +61,7 @@ class SandboxLayerParallaxExample extends FlameGame { velocityMultiplier: planeSpeed, fill: planeFill, alignment: planeAlignment, + filterQuality: FilterQuality.none, ); final parallax = Parallax( diff --git a/packages/flame/lib/src/components/parallax_component.dart b/packages/flame/lib/src/components/parallax_component.dart index cf44465a0..53bad6dda 100644 --- a/packages/flame/lib/src/components/parallax_component.dart +++ b/packages/flame/lib/src/components/parallax_component.dart @@ -22,6 +22,7 @@ extension ParallaxComponentExtension on FlameGame { double? angle, Anchor? anchor, int? priority, + FilterQuality? filterQuality, ComponentKey? key, }) async { return ParallaxComponent.load( @@ -38,6 +39,7 @@ extension ParallaxComponentExtension on FlameGame { angle: angle, anchor: anchor, priority: priority, + filterQuality: filterQuality, key: key, ); } @@ -144,6 +146,7 @@ class ParallaxComponent extends PositionComponent double? angle, Anchor? anchor, int? priority, + FilterQuality? filterQuality, ComponentKey? key, }) async { return ParallaxComponent( @@ -156,6 +159,7 @@ class ParallaxComponent extends PositionComponent alignment: alignment, fill: fill, images: images, + filterQuality: filterQuality, ), position: position, size: size, diff --git a/packages/flame/lib/src/parallax.dart b/packages/flame/lib/src/parallax.dart index 55ca774ad..a1583d7ae 100644 --- a/packages/flame/lib/src/parallax.dart +++ b/packages/flame/lib/src/parallax.dart @@ -19,6 +19,7 @@ extension ParallaxExtension on Game { ImageRepeat repeat = ImageRepeat.repeatX, Alignment alignment = Alignment.bottomLeft, LayerFill fill = LayerFill.height, + FilterQuality? filterQuality, }) { return Parallax.load( dataList, @@ -29,6 +30,7 @@ extension ParallaxExtension on Game { alignment: alignment, fill: fill, images: images, + filterQuality: filterQuality, ); } @@ -55,6 +57,7 @@ extension ParallaxExtension on Game { ImageRepeat repeat = ImageRepeat.repeatX, Alignment alignment = Alignment.bottomLeft, LayerFill fill = LayerFill.height, + FilterQuality? filterQuality, }) { return ParallaxAnimation.load( path, @@ -63,6 +66,7 @@ extension ParallaxExtension on Game { alignment: alignment, fill: fill, images: images, + filterQuality: filterQuality, ); } @@ -72,6 +76,7 @@ extension ParallaxExtension on Game { Alignment alignment = Alignment.bottomLeft, LayerFill fill = LayerFill.height, Vector2? velocityMultiplier, + FilterQuality? filterQuality, }) { return ParallaxLayer.load( data, @@ -80,6 +85,7 @@ extension ParallaxExtension on Game { alignment: alignment, fill: fill, images: images, + filterQuality: filterQuality, ); } } @@ -172,6 +178,7 @@ class ParallaxAnimation extends ParallaxRenderer { super.repeat, super.alignment, super.fill, + super.filterQuality, }) : _animationTicker = animation.createTicker(); /// Takes a path of an image, a SpriteAnimationData, and optionally arguments @@ -192,6 +199,7 @@ class ParallaxAnimation extends ParallaxRenderer { Alignment alignment = Alignment.bottomLeft, LayerFill fill = LayerFill.height, Images? images, + FilterQuality? filterQuality, }) async { images ??= Flame.images; @@ -206,6 +214,7 @@ class ParallaxAnimation extends ParallaxRenderer { repeat: repeat, alignment: alignment, fill: fill, + filterQuality: filterQuality, ); } @@ -336,6 +345,7 @@ class ParallaxLayer { Alignment alignment = Alignment.bottomLeft, LayerFill fill = LayerFill.height, Images? images, + FilterQuality? filterQuality, }) async { return ParallaxLayer( await data.load( @@ -343,6 +353,7 @@ class ParallaxLayer { alignment, fill, images, + filterQuality, ), velocityMultiplier: velocityMultiplier, ); @@ -358,6 +369,7 @@ abstract class ParallaxData { Alignment alignment, LayerFill fill, Images? images, + FilterQuality? filterQuality, ); } @@ -373,6 +385,7 @@ class ParallaxImageData extends ParallaxData { Alignment alignment, LayerFill fill, Images? images, + FilterQuality? filterQuality, ) { return ParallaxImage.load( path, @@ -380,6 +393,7 @@ class ParallaxImageData extends ParallaxData { alignment: alignment, fill: fill, images: images, + filterQuality: filterQuality, ); } } @@ -397,6 +411,7 @@ class ParallaxAnimationData extends ParallaxData { Alignment alignment, LayerFill fill, Images? images, + FilterQuality? filterQuality, ) { return ParallaxAnimation.load( path, @@ -405,6 +420,7 @@ class ParallaxAnimationData extends ParallaxData { alignment: alignment, fill: fill, images: images, + filterQuality: filterQuality, ); } } @@ -496,6 +512,7 @@ class Parallax { Alignment alignment = Alignment.bottomLeft, LayerFill fill = LayerFill.height, Images? images, + FilterQuality? filterQuality, }) async { final velocityDelta = velocityMultiplierDelta ?? Vector2.all(1.0); final layers = await Future.wait( @@ -510,6 +527,7 @@ class Parallax { alignment, fill, images, + filterQuality, ); return ParallaxLayer( renderer,