mirror of https://github.com/flutter/pinball.git
parent
8afd39c5f9
commit
05e3049205
@ -0,0 +1 @@
|
||||
export 'multipliers_behavior.dart';
|
@ -0,0 +1,26 @@
|
||||
import 'package:flame/components.dart';
|
||||
import 'package:pinball/game/game.dart';
|
||||
import 'package:pinball_components/pinball_components.dart';
|
||||
import 'package:pinball_flame/pinball_flame.dart';
|
||||
|
||||
/// Toggle each [Multiplier] when GameState.multiplier changes.
|
||||
class MultipliersBehavior extends Component
|
||||
with HasGameRef<PinballGame>, ParentIsA<Multipliers> {
|
||||
@override
|
||||
void onMount() {
|
||||
super.onMount();
|
||||
|
||||
// TODO(ruimiguel): filter only when multiplier has change, not every other
|
||||
// state.
|
||||
gameRef.read<GameBloc>().stream.listen((state) {
|
||||
final multipliers = parent.children.whereType<Multiplier>();
|
||||
for (final multiplier in multipliers) {
|
||||
// TODO(ruimiguel): use here GameState.multiplier when merged
|
||||
// https://github.com/VGVentures/pinball/pull/213.
|
||||
final currentMultiplier = state.score.bitLength % 6 + 1;
|
||||
|
||||
multiplier.bloc.toggle(currentMultiplier);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
// ignore_for_file: public_member_api_docs
|
||||
|
||||
import 'dart:math' as math;
|
||||
import 'package:flame/components.dart';
|
||||
import 'package:pinball/game/components/multipliers/behaviors/behaviors.dart';
|
||||
import 'package:pinball_components/pinball_components.dart';
|
||||
|
||||
/// {@template multipliers_component}
|
||||
/// A group for the multipliers over the board.
|
||||
/// {@endtemplate}
|
||||
class Multipliers extends Component {
|
||||
/// {@macro multipliers_component}
|
||||
Multipliers()
|
||||
: super(
|
||||
children: [
|
||||
Multiplier(
|
||||
value: MultiplierValue.x2,
|
||||
position: Vector2(-19.5, -2),
|
||||
rotation: -15 * math.pi / 180,
|
||||
),
|
||||
Multiplier(
|
||||
value: MultiplierValue.x3,
|
||||
position: Vector2(13, -9.4),
|
||||
rotation: 15 * math.pi / 180,
|
||||
),
|
||||
Multiplier(
|
||||
value: MultiplierValue.x4,
|
||||
position: Vector2(0, -21.2),
|
||||
),
|
||||
Multiplier(
|
||||
value: MultiplierValue.x5,
|
||||
position: Vector2(-8.5, -28),
|
||||
rotation: -3 * math.pi / 180,
|
||||
),
|
||||
Multiplier(
|
||||
value: MultiplierValue.x6,
|
||||
position: Vector2(10, -30.7),
|
||||
rotation: 8 * math.pi / 180,
|
||||
),
|
||||
MultipliersBehavior(),
|
||||
],
|
||||
);
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
// ignore_for_file: public_member_api_docs
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:pinball_components/pinball_components.dart';
|
||||
|
||||
part 'multiplier_state.dart';
|
||||
|
||||
class MultiplierCubit extends Cubit<MultiplierState> {
|
||||
MultiplierCubit(MultiplierValue multiplierValue)
|
||||
: super(
|
||||
MultiplierState(
|
||||
value: multiplierValue,
|
||||
spriteState: MultiplierSpriteState.dimmed,
|
||||
),
|
||||
);
|
||||
|
||||
/// Event added when the game current multiplier changes.
|
||||
void toggle(int multiplier) {
|
||||
if (state.equalsTo(multiplier)) {
|
||||
if (state.spriteState == MultiplierSpriteState.dimmed) {
|
||||
emit(state.copyWith(spriteState: MultiplierSpriteState.lit));
|
||||
}
|
||||
} else {
|
||||
if (state.spriteState == MultiplierSpriteState.lit) {
|
||||
emit(state.copyWith(spriteState: MultiplierSpriteState.dimmed));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension on MultiplierState {
|
||||
bool equalsTo(int value) {
|
||||
switch (this.value) {
|
||||
case MultiplierValue.x2:
|
||||
return value == 2;
|
||||
case MultiplierValue.x3:
|
||||
return value == 3;
|
||||
case MultiplierValue.x4:
|
||||
return value == 4;
|
||||
case MultiplierValue.x5:
|
||||
return value == 5;
|
||||
case MultiplierValue.x6:
|
||||
return value == 6;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
// ignore_for_file: public_member_api_docs
|
||||
|
||||
part of 'multiplier_cubit.dart';
|
||||
|
||||
/// Indicates the different sprite states for [MultiplierSpriteGroupComponent].
|
||||
enum MultiplierSpriteState {
|
||||
lit,
|
||||
dimmed,
|
||||
}
|
||||
|
||||
/// Indicates the [MultiplierCubit]'s current state.
|
||||
class MultiplierState extends Equatable {
|
||||
const MultiplierState({
|
||||
required this.value,
|
||||
required this.spriteState,
|
||||
});
|
||||
|
||||
/// Current value for the [Multiplier]
|
||||
final MultiplierValue value;
|
||||
|
||||
/// The [MultiplierSpriteGroupComponent] current sprite state
|
||||
final MultiplierSpriteState spriteState;
|
||||
|
||||
MultiplierState copyWith({
|
||||
MultiplierSpriteState? spriteState,
|
||||
}) {
|
||||
return MultiplierState(
|
||||
value: value,
|
||||
spriteState: spriteState ?? this.spriteState,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object> get props => [value, spriteState];
|
||||
}
|
Loading…
Reference in new issue