mirror of
				https://github.com/flame-engine/flame.git
				synced 2025-11-01 01:18:38 +08:00 
			
		
		
		
	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.
This commit is contained in:
		| @ -1,3 +1,5 @@ | |||||||
|  | import 'dart:ui'; | ||||||
|  |  | ||||||
| import 'package:flame/components.dart'; | import 'package:flame/components.dart'; | ||||||
| import 'package:flame/game.dart'; | import 'package:flame/game.dart'; | ||||||
| import 'package:flame/parallax.dart'; | import 'package:flame/parallax.dart'; | ||||||
| @ -21,6 +23,7 @@ class AdvancedParallaxExample extends FlameGame { | |||||||
|       (e) => loadParallaxLayer( |       (e) => loadParallaxLayer( | ||||||
|         ParallaxImageData(e.key), |         ParallaxImageData(e.key), | ||||||
|         velocityMultiplier: Vector2(e.value, 1.0), |         velocityMultiplier: Vector2(e.value, 1.0), | ||||||
|  |         filterQuality: FilterQuality.none, | ||||||
|       ), |       ), | ||||||
|     ); |     ); | ||||||
|     final parallax = ParallaxComponent( |     final parallax = ParallaxComponent( | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ class AnimationParallaxExample extends FlameGame { | |||||||
|   Future<void> onLoad() async { |   Future<void> onLoad() async { | ||||||
|     final cityLayer = await loadParallaxLayer( |     final cityLayer = await loadParallaxLayer( | ||||||
|       ParallaxImageData('parallax/city.png'), |       ParallaxImageData('parallax/city.png'), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     final rainLayer = await loadParallaxLayer( |     final rainLayer = await loadParallaxLayer( | ||||||
| @ -24,6 +25,7 @@ class AnimationParallaxExample extends FlameGame { | |||||||
|         ), |         ), | ||||||
|       ), |       ), | ||||||
|       velocityMultiplier: Vector2(2, 0), |       velocityMultiplier: Vector2(2, 0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     final cloudsLayer = await loadParallaxLayer( |     final cloudsLayer = await loadParallaxLayer( | ||||||
| @ -31,6 +33,7 @@ class AnimationParallaxExample extends FlameGame { | |||||||
|       velocityMultiplier: Vector2(4, 0), |       velocityMultiplier: Vector2(4, 0), | ||||||
|       fill: LayerFill.none, |       fill: LayerFill.none, | ||||||
|       alignment: Alignment.topLeft, |       alignment: Alignment.topLeft, | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     final parallax = Parallax( |     final parallax = Parallax( | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
|  | import 'dart:ui'; | ||||||
|  |  | ||||||
| import 'package:flame/components.dart'; | import 'package:flame/components.dart'; | ||||||
| import 'package:flame/game.dart'; | import 'package:flame/game.dart'; | ||||||
| import 'package:flame/parallax.dart'; | import 'package:flame/parallax.dart'; | ||||||
| @ -21,6 +23,7 @@ class BasicParallaxExample extends FlameGame { | |||||||
|       _imageNames, |       _imageNames, | ||||||
|       baseVelocity: Vector2(20, 0), |       baseVelocity: Vector2(20, 0), | ||||||
|       velocityMultiplierDelta: Vector2(1.8, 1.0), |       velocityMultiplierDelta: Vector2(1.8, 1.0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|     add(parallax); |     add(parallax); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
|  | import 'dart:ui'; | ||||||
|  |  | ||||||
| import 'package:flame/components.dart'; | import 'package:flame/components.dart'; | ||||||
| import 'package:flame/game.dart'; | import 'package:flame/game.dart'; | ||||||
| import 'package:flame/parallax.dart'; | import 'package:flame/parallax.dart'; | ||||||
| @ -27,6 +29,7 @@ class MyParallaxComponent extends ParallaxComponent<ComponentParallaxExample> { | |||||||
|       ], |       ], | ||||||
|       baseVelocity: Vector2(20, 0), |       baseVelocity: Vector2(20, 0), | ||||||
|       velocityMultiplierDelta: Vector2(1.8, 1.0), |       velocityMultiplierDelta: Vector2(1.8, 1.0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
|  | import 'dart:ui'; | ||||||
|  |  | ||||||
| import 'package:flame/extensions.dart'; | import 'package:flame/extensions.dart'; | ||||||
| import 'package:flame/game.dart'; | import 'package:flame/game.dart'; | ||||||
| import 'package:flame/parallax.dart'; | import 'package:flame/parallax.dart'; | ||||||
| @ -26,6 +28,7 @@ class NoFCSParallaxExample extends Game { | |||||||
|       size: size, |       size: size, | ||||||
|       baseVelocity: Vector2(20, 0), |       baseVelocity: Vector2(20, 0), | ||||||
|       velocityMultiplierDelta: Vector2(1.8, 1.0), |       velocityMultiplierDelta: Vector2(1.8, 1.0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | |||||||
| @ -26,22 +26,27 @@ class SandboxLayerParallaxExample extends FlameGame { | |||||||
|   Future<void> onLoad() async { |   Future<void> onLoad() async { | ||||||
|     final bgLayer = await loadParallaxLayer( |     final bgLayer = await loadParallaxLayer( | ||||||
|       ParallaxImageData('parallax/bg.png'), |       ParallaxImageData('parallax/bg.png'), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|     final mountainFarLayer = await loadParallaxLayer( |     final mountainFarLayer = await loadParallaxLayer( | ||||||
|       ParallaxImageData('parallax/mountain-far.png'), |       ParallaxImageData('parallax/mountain-far.png'), | ||||||
|       velocityMultiplier: Vector2(1.8, 0), |       velocityMultiplier: Vector2(1.8, 0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|     final mountainLayer = await loadParallaxLayer( |     final mountainLayer = await loadParallaxLayer( | ||||||
|       ParallaxImageData('parallax/mountains.png'), |       ParallaxImageData('parallax/mountains.png'), | ||||||
|       velocityMultiplier: Vector2(2.8, 0), |       velocityMultiplier: Vector2(2.8, 0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|     final treeLayer = await loadParallaxLayer( |     final treeLayer = await loadParallaxLayer( | ||||||
|       ParallaxImageData('parallax/trees.png'), |       ParallaxImageData('parallax/trees.png'), | ||||||
|       velocityMultiplier: Vector2(3.8, 0), |       velocityMultiplier: Vector2(3.8, 0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|     final foregroundTreesLayer = await loadParallaxLayer( |     final foregroundTreesLayer = await loadParallaxLayer( | ||||||
|       ParallaxImageData('parallax/foreground-trees.png'), |       ParallaxImageData('parallax/foreground-trees.png'), | ||||||
|       velocityMultiplier: Vector2(4.8, 0), |       velocityMultiplier: Vector2(4.8, 0), | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|     final airplaneLayer = await loadParallaxLayer( |     final airplaneLayer = await loadParallaxLayer( | ||||||
|       ParallaxAnimationData( |       ParallaxAnimationData( | ||||||
| @ -56,6 +61,7 @@ class SandboxLayerParallaxExample extends FlameGame { | |||||||
|       velocityMultiplier: planeSpeed, |       velocityMultiplier: planeSpeed, | ||||||
|       fill: planeFill, |       fill: planeFill, | ||||||
|       alignment: planeAlignment, |       alignment: planeAlignment, | ||||||
|  |       filterQuality: FilterQuality.none, | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     final parallax = Parallax( |     final parallax = Parallax( | ||||||
|  | |||||||
| @ -22,6 +22,7 @@ extension ParallaxComponentExtension on FlameGame { | |||||||
|     double? angle, |     double? angle, | ||||||
|     Anchor? anchor, |     Anchor? anchor, | ||||||
|     int? priority, |     int? priority, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|     ComponentKey? key, |     ComponentKey? key, | ||||||
|   }) async { |   }) async { | ||||||
|     return ParallaxComponent.load( |     return ParallaxComponent.load( | ||||||
| @ -38,6 +39,7 @@ extension ParallaxComponentExtension on FlameGame { | |||||||
|       angle: angle, |       angle: angle, | ||||||
|       anchor: anchor, |       anchor: anchor, | ||||||
|       priority: priority, |       priority: priority, | ||||||
|  |       filterQuality: filterQuality, | ||||||
|       key: key, |       key: key, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| @ -144,6 +146,7 @@ class ParallaxComponent<T extends FlameGame> extends PositionComponent | |||||||
|     double? angle, |     double? angle, | ||||||
|     Anchor? anchor, |     Anchor? anchor, | ||||||
|     int? priority, |     int? priority, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|     ComponentKey? key, |     ComponentKey? key, | ||||||
|   }) async { |   }) async { | ||||||
|     return ParallaxComponent( |     return ParallaxComponent( | ||||||
| @ -156,6 +159,7 @@ class ParallaxComponent<T extends FlameGame> extends PositionComponent | |||||||
|         alignment: alignment, |         alignment: alignment, | ||||||
|         fill: fill, |         fill: fill, | ||||||
|         images: images, |         images: images, | ||||||
|  |         filterQuality: filterQuality, | ||||||
|       ), |       ), | ||||||
|       position: position, |       position: position, | ||||||
|       size: size, |       size: size, | ||||||
|  | |||||||
| @ -19,6 +19,7 @@ extension ParallaxExtension on Game { | |||||||
|     ImageRepeat repeat = ImageRepeat.repeatX, |     ImageRepeat repeat = ImageRepeat.repeatX, | ||||||
|     Alignment alignment = Alignment.bottomLeft, |     Alignment alignment = Alignment.bottomLeft, | ||||||
|     LayerFill fill = LayerFill.height, |     LayerFill fill = LayerFill.height, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   }) { |   }) { | ||||||
|     return Parallax.load( |     return Parallax.load( | ||||||
|       dataList, |       dataList, | ||||||
| @ -29,6 +30,7 @@ extension ParallaxExtension on Game { | |||||||
|       alignment: alignment, |       alignment: alignment, | ||||||
|       fill: fill, |       fill: fill, | ||||||
|       images: images, |       images: images, | ||||||
|  |       filterQuality: filterQuality, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @ -55,6 +57,7 @@ extension ParallaxExtension on Game { | |||||||
|     ImageRepeat repeat = ImageRepeat.repeatX, |     ImageRepeat repeat = ImageRepeat.repeatX, | ||||||
|     Alignment alignment = Alignment.bottomLeft, |     Alignment alignment = Alignment.bottomLeft, | ||||||
|     LayerFill fill = LayerFill.height, |     LayerFill fill = LayerFill.height, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   }) { |   }) { | ||||||
|     return ParallaxAnimation.load( |     return ParallaxAnimation.load( | ||||||
|       path, |       path, | ||||||
| @ -63,6 +66,7 @@ extension ParallaxExtension on Game { | |||||||
|       alignment: alignment, |       alignment: alignment, | ||||||
|       fill: fill, |       fill: fill, | ||||||
|       images: images, |       images: images, | ||||||
|  |       filterQuality: filterQuality, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @ -72,6 +76,7 @@ extension ParallaxExtension on Game { | |||||||
|     Alignment alignment = Alignment.bottomLeft, |     Alignment alignment = Alignment.bottomLeft, | ||||||
|     LayerFill fill = LayerFill.height, |     LayerFill fill = LayerFill.height, | ||||||
|     Vector2? velocityMultiplier, |     Vector2? velocityMultiplier, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   }) { |   }) { | ||||||
|     return ParallaxLayer.load( |     return ParallaxLayer.load( | ||||||
|       data, |       data, | ||||||
| @ -80,6 +85,7 @@ extension ParallaxExtension on Game { | |||||||
|       alignment: alignment, |       alignment: alignment, | ||||||
|       fill: fill, |       fill: fill, | ||||||
|       images: images, |       images: images, | ||||||
|  |       filterQuality: filterQuality, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @ -172,6 +178,7 @@ class ParallaxAnimation extends ParallaxRenderer { | |||||||
|     super.repeat, |     super.repeat, | ||||||
|     super.alignment, |     super.alignment, | ||||||
|     super.fill, |     super.fill, | ||||||
|  |     super.filterQuality, | ||||||
|   }) : _animationTicker = animation.createTicker(); |   }) : _animationTicker = animation.createTicker(); | ||||||
|  |  | ||||||
|   /// Takes a path of an image, a SpriteAnimationData, and optionally arguments |   /// Takes a path of an image, a SpriteAnimationData, and optionally arguments | ||||||
| @ -192,6 +199,7 @@ class ParallaxAnimation extends ParallaxRenderer { | |||||||
|     Alignment alignment = Alignment.bottomLeft, |     Alignment alignment = Alignment.bottomLeft, | ||||||
|     LayerFill fill = LayerFill.height, |     LayerFill fill = LayerFill.height, | ||||||
|     Images? images, |     Images? images, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   }) async { |   }) async { | ||||||
|     images ??= Flame.images; |     images ??= Flame.images; | ||||||
|  |  | ||||||
| @ -206,6 +214,7 @@ class ParallaxAnimation extends ParallaxRenderer { | |||||||
|       repeat: repeat, |       repeat: repeat, | ||||||
|       alignment: alignment, |       alignment: alignment, | ||||||
|       fill: fill, |       fill: fill, | ||||||
|  |       filterQuality: filterQuality, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @ -336,6 +345,7 @@ class ParallaxLayer { | |||||||
|     Alignment alignment = Alignment.bottomLeft, |     Alignment alignment = Alignment.bottomLeft, | ||||||
|     LayerFill fill = LayerFill.height, |     LayerFill fill = LayerFill.height, | ||||||
|     Images? images, |     Images? images, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   }) async { |   }) async { | ||||||
|     return ParallaxLayer( |     return ParallaxLayer( | ||||||
|       await data.load( |       await data.load( | ||||||
| @ -343,6 +353,7 @@ class ParallaxLayer { | |||||||
|         alignment, |         alignment, | ||||||
|         fill, |         fill, | ||||||
|         images, |         images, | ||||||
|  |         filterQuality, | ||||||
|       ), |       ), | ||||||
|       velocityMultiplier: velocityMultiplier, |       velocityMultiplier: velocityMultiplier, | ||||||
|     ); |     ); | ||||||
| @ -358,6 +369,7 @@ abstract class ParallaxData { | |||||||
|     Alignment alignment, |     Alignment alignment, | ||||||
|     LayerFill fill, |     LayerFill fill, | ||||||
|     Images? images, |     Images? images, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   ); |   ); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -373,6 +385,7 @@ class ParallaxImageData extends ParallaxData { | |||||||
|     Alignment alignment, |     Alignment alignment, | ||||||
|     LayerFill fill, |     LayerFill fill, | ||||||
|     Images? images, |     Images? images, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   ) { |   ) { | ||||||
|     return ParallaxImage.load( |     return ParallaxImage.load( | ||||||
|       path, |       path, | ||||||
| @ -380,6 +393,7 @@ class ParallaxImageData extends ParallaxData { | |||||||
|       alignment: alignment, |       alignment: alignment, | ||||||
|       fill: fill, |       fill: fill, | ||||||
|       images: images, |       images: images, | ||||||
|  |       filterQuality: filterQuality, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @ -397,6 +411,7 @@ class ParallaxAnimationData extends ParallaxData { | |||||||
|     Alignment alignment, |     Alignment alignment, | ||||||
|     LayerFill fill, |     LayerFill fill, | ||||||
|     Images? images, |     Images? images, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   ) { |   ) { | ||||||
|     return ParallaxAnimation.load( |     return ParallaxAnimation.load( | ||||||
|       path, |       path, | ||||||
| @ -405,6 +420,7 @@ class ParallaxAnimationData extends ParallaxData { | |||||||
|       alignment: alignment, |       alignment: alignment, | ||||||
|       fill: fill, |       fill: fill, | ||||||
|       images: images, |       images: images, | ||||||
|  |       filterQuality: filterQuality, | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @ -496,6 +512,7 @@ class Parallax { | |||||||
|     Alignment alignment = Alignment.bottomLeft, |     Alignment alignment = Alignment.bottomLeft, | ||||||
|     LayerFill fill = LayerFill.height, |     LayerFill fill = LayerFill.height, | ||||||
|     Images? images, |     Images? images, | ||||||
|  |     FilterQuality? filterQuality, | ||||||
|   }) async { |   }) async { | ||||||
|     final velocityDelta = velocityMultiplierDelta ?? Vector2.all(1.0); |     final velocityDelta = velocityMultiplierDelta ?? Vector2.all(1.0); | ||||||
|     final layers = await Future.wait<ParallaxLayer>( |     final layers = await Future.wait<ParallaxLayer>( | ||||||
| @ -510,6 +527,7 @@ class Parallax { | |||||||
|           alignment, |           alignment, | ||||||
|           fill, |           fill, | ||||||
|           images, |           images, | ||||||
|  |           filterQuality, | ||||||
|         ); |         ); | ||||||
|         return ParallaxLayer( |         return ParallaxLayer( | ||||||
|           renderer, |           renderer, | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Erick
					Erick