mirror of
https://github.com/flame-engine/flame.git
synced 2025-10-31 00:48:47 +08:00
Work around Flutter bug for ColorEffect and fix broken links (#1178)
* Fix `ColorEffect` Flutter bug and example links * Remove accidental code * Fix `ColorEffect` test
This commit is contained in:
@ -18,6 +18,30 @@ import 'tappables_example.dart';
|
|||||||
|
|
||||||
void addInputStories(Dashbook dashbook) {
|
void addInputStories(Dashbook dashbook) {
|
||||||
dashbook.storiesOf('Input')
|
dashbook.storiesOf('Input')
|
||||||
|
..add(
|
||||||
|
'Tappables',
|
||||||
|
(_) => GameWidget(game: TappablesExample()),
|
||||||
|
codeLink: baseLink('input/tappables_example.dart'),
|
||||||
|
info: TappablesExample.description,
|
||||||
|
)
|
||||||
|
..add(
|
||||||
|
'Draggables',
|
||||||
|
(context) {
|
||||||
|
return GameWidget(
|
||||||
|
game: DraggablesExample(
|
||||||
|
zoom: context.listProperty('zoom', 1, [0.5, 1, 1.5]),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
codeLink: baseLink('input/draggables_example.dart'),
|
||||||
|
info: DraggablesExample.description,
|
||||||
|
)
|
||||||
|
..add(
|
||||||
|
'Hoverables',
|
||||||
|
(_) => GameWidget(game: HoverablesExample()),
|
||||||
|
codeLink: baseLink('input/hoverables_example.dart'),
|
||||||
|
info: HoverablesExample.description,
|
||||||
|
)
|
||||||
..add(
|
..add(
|
||||||
'Keyboard',
|
'Keyboard',
|
||||||
(_) => GameWidget(game: KeyboardExample()),
|
(_) => GameWidget(game: KeyboardExample()),
|
||||||
@ -57,36 +81,12 @@ void addInputStories(Dashbook dashbook) {
|
|||||||
codeLink: baseLink('input/multitap_advanced_example.dart'),
|
codeLink: baseLink('input/multitap_advanced_example.dart'),
|
||||||
info: MultitapAdvancedExample.description,
|
info: MultitapAdvancedExample.description,
|
||||||
)
|
)
|
||||||
..add(
|
|
||||||
'Tappables',
|
|
||||||
(_) => GameWidget(game: TappablesExample()),
|
|
||||||
codeLink: baseLink('input/tappables_example.dart'),
|
|
||||||
info: TappablesExample.description,
|
|
||||||
)
|
|
||||||
..add(
|
..add(
|
||||||
'Overlapping Tappables',
|
'Overlapping Tappables',
|
||||||
(_) => GameWidget(game: OverlappingTappablesExample()),
|
(_) => GameWidget(game: OverlappingTappablesExample()),
|
||||||
codeLink: baseLink('input/overlapping_tappables_example.dart'),
|
codeLink: baseLink('input/overlapping_tappables_example.dart'),
|
||||||
info: OverlappingTappablesExample.description,
|
info: OverlappingTappablesExample.description,
|
||||||
)
|
)
|
||||||
..add(
|
|
||||||
'Draggables',
|
|
||||||
(context) {
|
|
||||||
return GameWidget(
|
|
||||||
game: DraggablesExample(
|
|
||||||
zoom: context.listProperty('zoom', 1, [0.5, 1, 1.5]),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
codeLink: baseLink('input/draggables_example.dart'),
|
|
||||||
info: DraggablesExample.description,
|
|
||||||
)
|
|
||||||
..add(
|
|
||||||
'Hoverables',
|
|
||||||
(_) => GameWidget(game: HoverablesExample()),
|
|
||||||
codeLink: baseLink('input/hoverables_example.dart'),
|
|
||||||
info: HoverablesExample.description,
|
|
||||||
)
|
|
||||||
..add(
|
..add(
|
||||||
'Joystick',
|
'Joystick',
|
||||||
(_) => GameWidget(game: JoystickExample()),
|
(_) => GameWidget(game: JoystickExample()),
|
||||||
|
|||||||
@ -17,7 +17,7 @@ void addParallaxStories(Dashbook dashbook) {
|
|||||||
..add(
|
..add(
|
||||||
'Basic',
|
'Basic',
|
||||||
(_) => GameWidget(game: BasicParallaxExample()),
|
(_) => GameWidget(game: BasicParallaxExample()),
|
||||||
codeLink: baseLink('parallax/basic_animation_example.dart'),
|
codeLink: baseLink('parallax/basic_parallax_example.dart'),
|
||||||
info: BasicParallaxExample.description,
|
info: BasicParallaxExample.description,
|
||||||
)
|
)
|
||||||
..add(
|
..add(
|
||||||
|
|||||||
@ -20,13 +20,13 @@ void addRenderingStories(Dashbook dashbook) {
|
|||||||
..add(
|
..add(
|
||||||
'Isometric Tile Map',
|
'Isometric Tile Map',
|
||||||
(_) => GameWidget(game: IsometricTileMapExample()),
|
(_) => GameWidget(game: IsometricTileMapExample()),
|
||||||
codeLink: baseLink('tile_maps/isometric_tile_map_example.dart'),
|
codeLink: baseLink('rendering/isometric_tile_map_example.dart'),
|
||||||
info: IsometricTileMapExample.description,
|
info: IsometricTileMapExample.description,
|
||||||
)
|
)
|
||||||
..add(
|
..add(
|
||||||
'Nine Tile Box',
|
'Nine Tile Box',
|
||||||
(_) => GameWidget(game: NineTileBoxExample()),
|
(_) => GameWidget(game: NineTileBoxExample()),
|
||||||
codeLink: baseLink('utils/nine_tile_box_example.dart'),
|
codeLink: baseLink('rendering/nine_tile_box_example.dart'),
|
||||||
info: NineTileBoxExample.description,
|
info: NineTileBoxExample.description,
|
||||||
)
|
)
|
||||||
..add(
|
..add(
|
||||||
@ -44,7 +44,7 @@ void addRenderingStories(Dashbook dashbook) {
|
|||||||
..add(
|
..add(
|
||||||
'Particles',
|
'Particles',
|
||||||
(_) => GameWidget(game: ParticlesExample()),
|
(_) => GameWidget(game: ParticlesExample()),
|
||||||
codeLink: baseLink('utils/particles_example.dart'),
|
codeLink: baseLink('rendering/particles_example.dart'),
|
||||||
info: ParticlesExample.description,
|
info: ParticlesExample.description,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ void addSpritesStories(Dashbook dashbook) {
|
|||||||
..add(
|
..add(
|
||||||
'Basic Sprite',
|
'Basic Sprite',
|
||||||
(_) => GameWidget(game: BasicSpriteExample()),
|
(_) => GameWidget(game: BasicSpriteExample()),
|
||||||
codeLink: baseLink('sprites/basic_animation_example.dart'),
|
codeLink: baseLink('sprites/basic_sprite_example.dart'),
|
||||||
info: BasicSpriteExample.description,
|
info: BasicSpriteExample.description,
|
||||||
)
|
)
|
||||||
..add(
|
..add(
|
||||||
|
|||||||
@ -17,13 +17,13 @@ void addSystemStories(Dashbook dashbook) {
|
|||||||
..add(
|
..add(
|
||||||
'Overlay',
|
'Overlay',
|
||||||
overlayBuilder,
|
overlayBuilder,
|
||||||
codeLink: baseLink('widgets/overlays_example.dart'),
|
codeLink: baseLink('system/overlays_example.dart'),
|
||||||
info: OverlaysExample.description,
|
info: OverlaysExample.description,
|
||||||
)
|
)
|
||||||
..add(
|
..add(
|
||||||
'Without FlameGame',
|
'Without FlameGame',
|
||||||
(_) => GameWidget(game: NoFlameGameExample()),
|
(_) => GameWidget(game: NoFlameGameExample()),
|
||||||
codeLink: baseLink('utils/without_flamegame_example.dart'),
|
codeLink: baseLink('system/without_flamegame_example.dart'),
|
||||||
info: NoFlameGameExample.description,
|
info: NoFlameGameExample.description,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ class CustomPainterExample extends FlameGame with TapDetector {
|
|||||||
|
|
||||||
On the screen you can see a component using a custom painter being
|
On the screen you can see a component using a custom painter being
|
||||||
rendered on a FlameGame, and if you tap, that same painter is used to
|
rendered on a FlameGame, and if you tap, that same painter is used to
|
||||||
show the happy face on a widget overlay.
|
show a smiley on a widget overlay.
|
||||||
''';
|
''';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -22,10 +22,10 @@ class CustomPainterExample extends FlameGame with TapDetector {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void onTap() {
|
void onTap() {
|
||||||
if (overlays.isActive('HappyFace')) {
|
if (overlays.isActive('Smiley')) {
|
||||||
overlays.remove('HappyFace');
|
overlays.remove('Smiley');
|
||||||
} else {
|
} else {
|
||||||
overlays.add('HappyFace');
|
overlays.add('Smiley');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -34,10 +34,10 @@ Widget customPainterBuilder(DashbookContext ctx) {
|
|||||||
return GameWidget(
|
return GameWidget(
|
||||||
game: CustomPainterExample(),
|
game: CustomPainterExample(),
|
||||||
overlayBuilderMap: {
|
overlayBuilderMap: {
|
||||||
'HappyFace': (context, game) {
|
'Smiley': (context, game) {
|
||||||
return Center(
|
return Center(
|
||||||
child: Container(
|
child: Container(
|
||||||
color: Colors.white,
|
color: Colors.transparent,
|
||||||
width: 200,
|
width: 200,
|
||||||
height: 200,
|
height: 200,
|
||||||
child: Column(
|
child: Column(
|
||||||
@ -45,7 +45,7 @@ Widget customPainterBuilder(DashbookContext ctx) {
|
|||||||
const Text(
|
const Text(
|
||||||
'Hey, I can be a widget too!',
|
'Hey, I can be a widget too!',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.black,
|
color: Colors.white70,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 32),
|
const SizedBox(height: 32),
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import '../../components.dart';
|
import '../../components.dart';
|
||||||
@ -33,7 +35,10 @@ class ColorEffect extends ComponentEffect<HasPaint> {
|
|||||||
@override
|
@override
|
||||||
void apply(double progress) {
|
void apply(double progress) {
|
||||||
final currentColor = color.withOpacity(
|
final currentColor = color.withOpacity(
|
||||||
_tween.transform(progress),
|
// Currently there is a bug when opacity is 0 in the color filter.
|
||||||
|
// "Expected a value of type 'SkDeletable', but got one of type 'Null'"
|
||||||
|
// https://github.com/flutter/flutter/issues/89433
|
||||||
|
max(_tween.transform(progress), 1 / 255),
|
||||||
);
|
);
|
||||||
target.tint(currentColor, paintId: paintId);
|
target.tint(currentColor, paintId: paintId);
|
||||||
super.apply(progress);
|
super.apply(progress);
|
||||||
|
|||||||
@ -19,7 +19,11 @@ void main() {
|
|||||||
game.update(0);
|
game.update(0);
|
||||||
expect(
|
expect(
|
||||||
component.paint.colorFilter.toString(),
|
component.paint.colorFilter.toString(),
|
||||||
equals('ColorFilter.mode(Color(0x00f44336), BlendMode.srcATop)'),
|
// Once https://github.com/flutter/flutter/issues/89433 has been fixed
|
||||||
|
// the two equals lines should be swapped and the ColorEffect should go
|
||||||
|
// to opacity 0.
|
||||||
|
//equals('ColorFilter.mode(Color(0x00f44336), BlendMode.srcATop)'),
|
||||||
|
equals('ColorFilter.mode(Color(0x01f44336), BlendMode.srcATop)'),
|
||||||
);
|
);
|
||||||
|
|
||||||
game.update(0.5);
|
game.update(0.5);
|
||||||
|
|||||||
Reference in New Issue
Block a user