Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 40 additions & 8 deletions examples/lib/stories/rendering/text_example.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';

import 'package:flame/components.dart';
import 'package:flame/effects.dart';
import 'package:flame/game.dart';
import 'package:flame/palette.dart';
import 'package:flame/text.dart';
Expand Down Expand Up @@ -82,6 +83,37 @@ class TextExample extends FlameGame {
margins: EdgeInsets.fromLTRB(10, 10, 10, 10),
),
),
TextComponent(
text: 'I fade in and fade out',
Comment thread
erickzanardo marked this conversation as resolved.
anchor: Anchor.topRight,
position: Vector2(size.x - 50, 20),
children: [
SequenceEffect(
[
OpacityEffect.fadeOut(
LinearEffectController(1.5),
),
OpacityEffect.fadeIn(
LinearEffectController(1.5),
),
],
infinite: true,
),
],
),
TextComponent(
text: 'I change my color!',
anchor: Anchor.topRight,
position: Vector2(size.x - 50, 50),
children: [
ColorEffect(
Colors.blue,
InfiniteEffectController(
LinearEffectController(1.5),
),
),
],
),
],
);
}
Expand Down Expand Up @@ -114,7 +146,7 @@ final _shaded = TextPaint(
);

class MyTextBox extends TextBoxComponent {
late Paint paint;
late Paint bgPaint;
late Rect bgRect;

MyTextBox(
Expand All @@ -136,25 +168,25 @@ class MyTextBox extends TextBoxComponent {

@override
Future<void> onLoad() {
paint = Paint();
bgPaint = Paint();
bgRect = Rect.fromLTWH(0, 0, width, height);
size.addListener(() {
bgRect = Rect.fromLTWH(0, 0, width, height);
});

paint.color = Colors.white10;
bgPaint.color = Colors.white10;
return super.onLoad();
}

@override
void render(Canvas canvas) {
canvas.drawRect(bgRect, paint);
canvas.drawRect(bgRect, bgPaint);
super.render(canvas);
}
}

class MyScrollTextBox extends ScrollTextBoxComponent {
late Paint paint;
late Paint bgPaint;
late Rect backgroundRect;

MyScrollTextBox(
Expand All @@ -167,16 +199,16 @@ class MyScrollTextBox extends ScrollTextBoxComponent {

@override
FutureOr<void> onLoad() {
paint = Paint();
bgPaint = Paint();
backgroundRect = Rect.fromLTWH(0, 0, width, height);

paint.color = Colors.white10;
bgPaint.color = Colors.white10;
return super.onLoad();
}

@override
void render(Canvas canvas) {
canvas.drawRect(backgroundRect, paint);
canvas.drawRect(backgroundRect, bgPaint);
super.render(canvas);
}
}
10 changes: 10 additions & 0 deletions packages/flame/lib/src/components/mixins/has_paint.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,13 +113,15 @@ mixin HasPaint<T extends Object> on Component
/// Shortcut for changing the color of the paint.
void setColor(Color color, {T? paintId}) {
getPaint(paintId).color = color;
onChanged();
}

/// Applies a color filter to the paint which will make
/// things rendered with the paint looking like it was
/// tinted with the given color.
void tint(Color color, {T? paintId}) {
getPaint(paintId).colorFilter = ColorFilter.mode(color, BlendMode.srcATop);
onChanged();
}

@override
Expand All @@ -131,6 +133,7 @@ mixin HasPaint<T extends Object> on Component
for (final paint in _paints.values) {
paint.color = paint.color.withValues(alpha: value);
}
onChanged();
}

@override
Expand Down Expand Up @@ -158,6 +161,7 @@ mixin HasPaint<T extends Object> on Component
layerPaint.colorFilter = filter;
}
}
onChanged();
}

/// Creates an [OpacityProvider] for given [paintId] and can be used as
Expand Down Expand Up @@ -189,6 +193,12 @@ mixin HasPaint<T extends Object> on Component
includeLayers: includeLayers,
);
}

/// Can be overridden to react when the [paint] object
/// changed.
///
/// Default implementation is a no-op.
void onChanged() {}
Comment thread
erickzanardo marked this conversation as resolved.
}

class _ProxyOpacityProvider<T extends Object> implements OpacityProvider {
Expand Down
15 changes: 13 additions & 2 deletions packages/flame/lib/src/components/text_component.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import 'package:flame/text.dart';
import 'package:flutter/painting.dart';
import 'package:meta/meta.dart';

class TextComponent<T extends TextRenderer> extends PositionComponent {
class TextComponent<T extends TextRenderer> extends PositionComponent
with HasPaint {
TextComponent({
String? text,
T? textRenderer,
Expand Down Expand Up @@ -40,9 +41,13 @@ class TextComponent<T extends TextRenderer> extends PositionComponent {

late InlineTextElement _textElement;

void _updateElement() {
_textElement = _textRenderer.format(_text);
}

@internal
void updateBounds() {
_textElement = _textRenderer.format(_text);
_updateElement();
final measurements = _textElement.metrics;
_textElement.translate(0, measurements.ascent);
size.setValues(measurements.width, measurements.height);
Expand All @@ -52,4 +57,10 @@ class TextComponent<T extends TextRenderer> extends PositionComponent {
void render(Canvas canvas) {
_textElement.draw(canvas);
}

@override
void onChanged() {
_textRenderer = _textRenderer.copyWithPaint(paint) as T;
_updateElement();
}
}
15 changes: 15 additions & 0 deletions packages/flame/lib/src/text/renderers/sprite_font_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ class SpriteFontRenderer extends TextRenderer {
}
}

SpriteFontRenderer.fromPaint(
this.font, {
required this.paint,
this.scale = 1.0,
this.letterSpacing = 0.0,
});

final SpriteFont font;
final double scale;
final double letterSpacing;
Expand Down Expand Up @@ -56,4 +63,12 @@ class SpriteFontRenderer extends TextRenderer {
),
);
}

@override
TextRenderer copyWithPaint(Paint paint) {
return SpriteFontRenderer.fromPaint(
font,
paint: paint,
);
}
}
11 changes: 11 additions & 0 deletions packages/flame/lib/src/text/renderers/text_paint.dart
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,17 @@ class TextPaint extends TextRenderer {
return _textPainterCache.getValue(text)!;
}

@override
TextRenderer copyWithPaint(Paint paint) {
return copyWith(
(style) {
return style.copyWith(
Comment thread
spydon marked this conversation as resolved.
foreground: paint,
);
},
);
}

TextPaint copyWith(
TextStyle Function(TextStyle) transform, {
TextDirection? textDirection,
Expand Down
4 changes: 4 additions & 0 deletions packages/flame/lib/src/text/renderers/text_renderer.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:ui';

import 'package:flame/extensions.dart';
import 'package:flame/src/anchor.dart';
import 'package:flame/text.dart';
Expand All @@ -11,6 +13,8 @@ abstract class TextRenderer {
return format(text).metrics;
}

TextRenderer copyWithPaint(Paint paint);

void render(
Canvas canvas,
String text,
Expand Down
5 changes: 5 additions & 0 deletions packages/flame/test/text/text_renderer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ class _CustomTextRenderer extends TextRenderer {
InlineTextElement format(String text) {
return _CustomTextElement();
}

@override
TextRenderer copyWithPaint(Paint paint) {
return _CustomTextRenderer();
}
}

class _CustomTextElement extends InlineTextElement {
Expand Down
11 changes: 11 additions & 0 deletions packages/flame_test/lib/src/debug_text_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,17 @@ class DebugTextRenderer extends TextRenderer {

@override
InlineTextElement format(String text) => _DebugTextElement(this, text);

@override
TextRenderer copyWithPaint(Paint paint) {
return DebugTextRenderer(
color: paint.color,
fontSize: fontSize,
lineHeight: lineHeight,
fontWeight: fontWeight,
fontStyle: fontStyle,
);
}
}

class _DebugTextElement extends InlineTextElement {
Expand Down
Loading