fix: added resizing logic

pull/358/head
alestiago 3 years ago
parent ca1f0c31da
commit 50a3097077

@ -7,9 +7,9 @@ import 'package:pinball_components/pinball_components.dart';
/// {@template focus_data} /// {@template focus_data}
/// Defines a [Camera] focus point. /// Defines a [Camera] focus point.
/// {@endtemplate} /// {@endtemplate}
class FocusData { class _FocusData {
/// {@template focus_data} /// {@macro focus_data}
FocusData({ const _FocusData({
required this.zoom, required this.zoom,
required this.position, required this.position,
}); });
@ -24,7 +24,9 @@ class FocusData {
/// Changes the game focus when the [GameBloc] status changes. /// Changes the game focus when the [GameBloc] status changes.
class CameraFocusingBehavior extends Component class CameraFocusingBehavior extends Component
with FlameBlocListenable<GameBloc, GameState>, HasGameRef { with FlameBlocListenable<GameBloc, GameState>, HasGameRef {
late final Map<String, FocusData> _foci; final Map<GameStatus, _FocusData> _foci = {};
GameStatus? _activeFocus;
@override @override
bool listenWhen(GameState? previousState, GameState newState) { bool listenWhen(GameState? previousState, GameState newState) {
@ -32,51 +34,57 @@ class CameraFocusingBehavior extends Component
} }
@override @override
void onNewState(GameState state) { void onNewState(GameState state) => _zoomTo(state.status);
switch (state.status) {
case GameStatus.waiting: @override
break; void onGameResize(Vector2 size) {
case GameStatus.playing: _foci.addAll(
_zoom(_foci['game']!); {
break; GameStatus.waiting: _FocusData(
case GameStatus.gameOver: zoom: size.y / 175, // 16
_zoom(_foci['backbox']!); position: Vector2(0, -112),
break; ),
GameStatus.playing: _FocusData(
zoom: size.y / 165, // 18
position: Vector2(0, -7.8),
),
GameStatus.gameOver: _FocusData(
zoom: size.y / 109, // 10
position: Vector2(0, -111),
),
},
);
if (_activeFocus != null) {
_zoomTo(_activeFocus!);
} }
super.onGameResize(size);
} }
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
_foci = { _snap(GameStatus.waiting);
'game': FocusData(
zoom: gameRef.size.y / 16,
position: Vector2(0, -7.8),
),
'waiting': FocusData(
zoom: gameRef.size.y / 18,
position: Vector2(0, -112),
),
'backbox': FocusData(
zoom: gameRef.size.y / 10,
position: Vector2(0, -111),
),
};
_snap(_foci['waiting']!);
} }
void _snap(FocusData data) { void _snap(GameStatus focusKey) {
_activeFocus = focusKey;
final focusData = _foci[_activeFocus]!;
gameRef.camera gameRef.camera
..speed = 100 ..speed = 100
..followVector2(data.position) ..followVector2(focusData.position)
..zoom = data.zoom; ..zoom = focusData.zoom;
} }
void _zoom(FocusData data) { void _zoomTo(GameStatus focusKey) {
final zoom = CameraZoom(value: data.zoom); _activeFocus = focusKey;
final focusData = _foci[_activeFocus]!;
final zoom = CameraZoom(value: focusData.zoom);
zoom.completed.then((_) { zoom.completed.then((_) {
gameRef.camera.moveTo(data.position); gameRef.camera.moveTo(focusData.position);
}); });
add(zoom); add(zoom);
} }

Loading…
Cancel
Save