fix: enable auto-pulling for all devices

pull/455/head
alestiago 3 years ago
parent e90de8dedd
commit 6da4564d53

@ -5,7 +5,6 @@ import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
import 'package:platform_helper/platform_helper.dart';
/// Listens to the [GameBloc] and updates the game accordingly. /// Listens to the [GameBloc] and updates the game accordingly.
class GameBlocStatusListener extends Component class GameBlocStatusListener extends Component
@ -69,24 +68,15 @@ class GameBlocStatusListener extends Component
} }
void _addPlungerBehaviors(Plunger plunger) { void _addPlungerBehaviors(Plunger plunger) {
final platformHelper = readProvider<PlatformHelper>();
const pullingStrength = 7.0; const pullingStrength = 7.0;
final provider = plunger.firstChild<FlameBlocProvider<PlungerCubit, PlungerState>>()!.addAll(
plunger.firstChild<FlameBlocProvider<PlungerCubit, PlungerState>>()!;
if (platformHelper.isMobile) {
provider.add(
PlungerAutoPullingBehavior(strength: pullingStrength),
);
} else {
provider.addAll(
[ [
PlungerKeyControllingBehavior(),
PlungerPullingBehavior(strength: pullingStrength), PlungerPullingBehavior(strength: pullingStrength),
PlungerAutoPullingBehavior(strength: pullingStrength),
PlungerKeyControllingBehavior()
], ],
); );
} }
}
void _removePlungerBehaviors(Plunger plunger) { void _removePlungerBehaviors(Plunger plunger) {
plunger plunger

@ -167,7 +167,7 @@ class PinballGame extends PinballForge2DGame
.whereType<FlameBlocProvider<PlungerCubit, PlungerState>>() .whereType<FlameBlocProvider<PlungerCubit, PlungerState>>()
.first .first
.bloc .bloc
.pulled(); .autopulled();
} else { } else {
final tappedLeftSide = info.eventPosition.widget.x < canvasSize.x / 2; final tappedLeftSide = info.eventPosition.widget.x < canvasSize.x / 2;
focusedBoardSide[pointerId] = focusedBoardSide[pointerId] =

@ -35,7 +35,9 @@ class PlungerAutoPullingBehavior extends PlungerPullingBehavior {
@override @override
void update(double dt) { void update(double dt) {
super.update(dt); if (bloc.state.isAutopulling) {
_plunger.body.linearVelocity = Vector2(0, _strength);
}
final joint = _plunger.body.joints.whereType<PrismaticJoint>().single; final joint = _plunger.body.joints.whereType<PrismaticJoint>().single;
final reachedBottom = joint.getJointTranslation() <= joint.getLowerLimit(); final reachedBottom = joint.getJointTranslation() <= joint.getLowerLimit();

@ -8,4 +8,6 @@ class PlungerCubit extends Cubit<PlungerState> {
void pulled() => emit(PlungerState.pulling); void pulled() => emit(PlungerState.pulling);
void released() => emit(PlungerState.releasing); void released() => emit(PlungerState.releasing);
void autopulled() => emit(PlungerState.autopulling);
} }

@ -4,9 +4,12 @@ enum PlungerState {
pulling, pulling,
releasing, releasing,
autopulling,
} }
extension PlungerStateX on PlungerState { extension PlungerStateX on PlungerState {
bool get isPulling => this == PlungerState.pulling; bool get isPulling => this == PlungerState.pulling;
bool get isReleasing => this == PlungerState.releasing; bool get isReleasing => this == PlungerState.releasing;
bool get isAutopulling => this == PlungerState.autopulling;
} }

@ -97,7 +97,8 @@ class _PlungerSpriteAnimationGroupComponent
void onNewState(PlungerState state) { void onNewState(PlungerState state) {
super.onNewState(state); super.onNewState(state);
final startedReleasing = state.isReleasing && !current!.isReleasing; final startedReleasing = state.isReleasing && !current!.isReleasing;
final startedPulling = state.isPulling && !current!.isPulling; final startedPulling =
(state.isPulling || state.isAutopulling) && !current!.isPulling;
if (startedReleasing || startedPulling) { if (startedReleasing || startedPulling) {
animation?.reset(); animation?.reset();
} }
@ -132,6 +133,7 @@ class _PlungerSpriteAnimationGroupComponent
animations = { animations = {
PlungerState.releasing: pullAnimation.reversed(), PlungerState.releasing: pullAnimation.reversed(),
PlungerState.pulling: pullAnimation, PlungerState.pulling: pullAnimation,
PlungerState.autopulling: pullAnimation,
}; };
current = readBloc<PlungerCubit, PlungerState>().state; current = readBloc<PlungerCubit, PlungerState>().state;

@ -102,8 +102,8 @@ void main() {
final plungerBloc = _MockPlungerCubit(); final plungerBloc = _MockPlungerCubit();
whenListen<PlungerState>( whenListen<PlungerState>(
plungerBloc, plungerBloc,
Stream.value(PlungerState.pulling), Stream.value(PlungerState.autopulling),
initialState: PlungerState.pulling, initialState: PlungerState.autopulling,
); );
const strength = 2.0; const strength = 2.0;

@ -36,7 +36,6 @@ class _TestGame extends Forge2DGame with HasTappables {
Future<void> pump( Future<void> pump(
Iterable<Component> children, { Iterable<Component> children, {
PinballAudioPlayer? pinballAudioPlayer, PinballAudioPlayer? pinballAudioPlayer,
PlatformHelper? platformHelper,
GoogleWordCubit? googleWordBloc, GoogleWordCubit? googleWordBloc,
}) async { }) async {
return ensureAdd( return ensureAdd(
@ -62,7 +61,7 @@ class _TestGame extends Forge2DGame with HasTappables {
_MockAppLocalizations(), _MockAppLocalizations(),
), ),
FlameProvider<PlatformHelper>.value( FlameProvider<PlatformHelper>.value(
platformHelper ?? PlatformHelper(), PlatformHelper(),
), ),
], ],
children: children, children: children,
@ -80,8 +79,6 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository {
class _MockShareRepository extends Mock implements ShareRepository {} class _MockShareRepository extends Mock implements ShareRepository {}
class _MockPlatformHelper extends Mock implements PlatformHelper {}
class _MockPlungerCubit extends Mock implements PlungerCubit {} class _MockPlungerCubit extends Mock implements PlungerCubit {}
class _MockGoogleWordCubit extends Mock implements GoogleWordCubit {} class _MockGoogleWordCubit extends Mock implements GoogleWordCubit {}
@ -460,10 +457,8 @@ void main() {
); );
flameTester.test( flameTester.test(
'adds PlungerKeyControllingBehavior to Plunger when on desktop', 'adds PlungerKeyControllingBehavior to Plunger',
(game) async { (game) async {
final platformHelper = _MockPlatformHelper();
when(() => platformHelper.isMobile).thenReturn(false);
final component = GameBlocStatusListener(); final component = GameBlocStatusListener();
final leaderboardRepository = _MockLeaderboardRepository(); final leaderboardRepository = _MockLeaderboardRepository();
final shareRepository = _MockShareRepository(); final shareRepository = _MockShareRepository();
@ -482,7 +477,6 @@ void main() {
bloc: _MockSignpostCubit(), bloc: _MockSignpostCubit(),
), ),
], ],
platformHelper: platformHelper,
); );
await plunger.ensureAdd( await plunger.ensureAdd(
FlameBlocProvider<PlungerCubit, PlungerState>( FlameBlocProvider<PlungerCubit, PlungerState>(
@ -506,10 +500,8 @@ void main() {
); );
flameTester.test( flameTester.test(
'adds PlungerPullingBehavior to Plunger when on desktop', 'adds PlungerPullingBehavior to Plunger',
(game) async { (game) async {
final platformHelper = _MockPlatformHelper();
when(() => platformHelper.isMobile).thenReturn(false);
final component = GameBlocStatusListener(); final component = GameBlocStatusListener();
final leaderboardRepository = _MockLeaderboardRepository(); final leaderboardRepository = _MockLeaderboardRepository();
final shareRepository = _MockShareRepository(); final shareRepository = _MockShareRepository();
@ -528,7 +520,6 @@ void main() {
bloc: _MockSignpostCubit(), bloc: _MockSignpostCubit(),
), ),
], ],
platformHelper: platformHelper,
); );
await plunger.ensureAdd( await plunger.ensureAdd(
FlameBlocProvider<PlungerCubit, PlungerState>( FlameBlocProvider<PlungerCubit, PlungerState>(
@ -542,17 +533,19 @@ void main() {
await game.ready(); await game.ready();
expect( expect(
plunger.descendants().whereType<PlungerPullingBehavior>().length, plunger
.descendants()
.whereType<PlungerPullingBehavior>()
.where((behavior) => behavior is! PlungerAutoPullingBehavior)
.length,
equals(1), equals(1),
); );
}, },
); );
flameTester.test( flameTester.test(
'adds PlungerAutoPullingBehavior to Plunger when on mobile', 'adds PlungerAutoPullingBehavior to Plunger',
(game) async { (game) async {
final platformHelper = _MockPlatformHelper();
when(() => platformHelper.isMobile).thenReturn(true);
final component = GameBlocStatusListener(); final component = GameBlocStatusListener();
final leaderboardRepository = _MockLeaderboardRepository(); final leaderboardRepository = _MockLeaderboardRepository();
final shareRepository = _MockShareRepository(); final shareRepository = _MockShareRepository();
@ -571,7 +564,6 @@ void main() {
bloc: _MockSignpostCubit(), bloc: _MockSignpostCubit(),
), ),
], ],
platformHelper: platformHelper,
); );
await plunger.ensureAdd( await plunger.ensureAdd(
FlameBlocProvider<PlungerCubit, PlungerState>( FlameBlocProvider<PlungerCubit, PlungerState>(

@ -434,7 +434,7 @@ void main() {
.single .single
.bloc; .bloc;
expect(plungerBloc.state, PlungerState.pulling); expect(plungerBloc.state, PlungerState.autopulling);
}); });
}); });
}); });

Loading…
Cancel
Save