diff --git a/packages/flame/lib/src/components/text_component.dart b/packages/flame/lib/src/components/text_component.dart index eee7cb64b43..7dc0209dd83 100644 --- a/packages/flame/lib/src/components/text_component.dart +++ b/packages/flame/lib/src/components/text_component.dart @@ -1,16 +1,30 @@ import 'dart:ui'; import 'package:flame/components.dart'; +import 'package:flame/src/text/formatter_text_renderer.dart'; +import 'package:flame/src/text/inline/text_element.dart'; import 'package:flame/src/text/text_renderer.dart'; import 'package:flutter/painting.dart'; import 'package:meta/meta.dart'; class TextComponent extends PositionComponent { - String _text; - T _textRenderer; + TextComponent({ + String? text, + T? textRenderer, + super.position, + super.size, + super.scale, + super.angle, + super.anchor, + super.children, + super.priority, + }) : _text = text ?? '', + _textRenderer = textRenderer ?? TextRenderer.createDefault() { + updateBounds(); + } String get text => _text; - + String _text; set text(String text) { if (_text != text) { _text = text; @@ -19,35 +33,34 @@ class TextComponent extends PositionComponent { } T get textRenderer => _textRenderer; - + T _textRenderer; set textRenderer(T textRenderer) { _textRenderer = textRenderer; updateBounds(); } - TextComponent({ - String? text, - T? textRenderer, - super.position, - super.size, - super.scale, - super.angle, - super.anchor, - super.children, - super.priority, - }) : _text = text ?? '', - _textRenderer = textRenderer ?? TextRenderer.createDefault() { - updateBounds(); - } + TextElement? _textElement; @internal void updateBounds() { - final expectedSize = textRenderer.measureText(_text); - size.setValues(expectedSize.x, expectedSize.y); + if (_textRenderer is FormatterTextRenderer) { + _textElement = + (_textRenderer as FormatterTextRenderer).formatter.format(_text); + final measurements = _textElement!.lastLine.metrics; + _textElement!.lastLine.translate(0, measurements.ascent); + size.setValues(measurements.width, measurements.height); + } else { + final expectedSize = textRenderer.measureText(_text); + size.setValues(expectedSize.x, expectedSize.y); + } } @override void render(Canvas canvas) { - _textRenderer.render(canvas, text, Vector2.zero()); + if (_textElement != null) { + _textElement!.render(canvas); + } else { + _textRenderer.render(canvas, text, Vector2.zero()); + } } }