feat: finishing contrls

pull/187/head
Erick Zanardo 4 years ago
parent e8cd40f14b
commit e596cac6c1

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:math';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -10,8 +11,7 @@ import 'package:pinball_components/pinball_components.dart';
/// [PositionComponent] that handles the user input on the /// [PositionComponent] that handles the user input on the
/// game over display view. /// game over display view.
/// {@endtemplate} /// {@endtemplate}
class BackboardGameOver extends PositionComponent class BackboardGameOver extends PositionComponent with HasGameRef {
with HasGameRef, KeyboardHandler {
/// {@macro backboard_game_over} /// {@macro backboard_game_over}
BackboardGameOver({ BackboardGameOver({
required int score, required int score,
@ -76,12 +76,29 @@ class BackboardGameOver extends PositionComponent
), ),
); );
} }
unawaited(
add(
KeyboardInputController(
keyUp: {
LogicalKeyboardKey.arrowLeft: () => _movePrompt(true),
LogicalKeyboardKey.arrowRight: () => _movePrompt(false),
},
),
),
);
} }
@override bool _movePrompt(bool left) {
bool onKeyEvent(RawKeyEvent event, Set<LogicalKeyboardKey> keysPressed) { final prompts = children.whereType<BackboardLetterPrompt>().toList();
final isUp = event is RawKeyUpEvent;
final current = prompts.firstWhere((prompt) => prompt.hasFocus)
..hasFocus = false;
var index = prompts.indexOf(current) + (left ? -1 : 1);
index = min(max(0, index), prompts.length - 1);
prompts[index].hasFocus = true;
return true; return false;
} }
} }

@ -1,8 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'dart:ui'; import 'dart:math';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
/// {@template backboard_letter_prompt} /// {@template backboard_letter_prompt}
@ -20,10 +21,10 @@ class BackboardLetterPrompt extends PositionComponent {
); );
static const _alphabetCode = 65; static const _alphabetCode = 65;
static const _alphabetLength = 26; static const _alphabetLength = 25;
var _charIndex = 0;
bool _hasFocus; bool _hasFocus;
String _char = '';
late RectangleComponent _underscore; late RectangleComponent _underscore;
late TextComponent _input; late TextComponent _input;
@ -43,7 +44,7 @@ class BackboardLetterPrompt extends PositionComponent {
unawaited(add(_underscore)); unawaited(add(_underscore));
_input = TextComponent( _input = TextComponent(
text: _hasFocus ? 'A' : '', text: 'A',
textRenderer: Backboard.textPaint, textRenderer: Backboard.textPaint,
anchor: Anchor.center, anchor: Anchor.center,
); );
@ -61,14 +62,42 @@ class BackboardLetterPrompt extends PositionComponent {
); );
unawaited(add(_underscoreBlinker)); unawaited(add(_underscoreBlinker));
}
void up() { unawaited(
add(
KeyboardInputController(
keyUp: {
LogicalKeyboardKey.arrowUp: () => _cycle(true),
LogicalKeyboardKey.arrowDown: () => _cycle(false),
},
),
),
);
} }
void down() { bool _cycle(bool up) {
if (_hasFocus) {
final newCharCode =
min(max(_charIndex + (up ? 1 : -1), 0), _alphabetLength);
_input.text = String.fromCharCode(_alphabetCode + newCharCode);
_charIndex = newCharCode;
return false;
}
return true;
} }
void nextPrompt() { /// Returns if this prompt has focus on it
bool get hasFocus => _hasFocus;
/// Updates this prompt focus
set hasFocus(bool hasFocus) {
if (hasFocus) {
_underscoreBlinker.timer.resume();
} else {
_underscoreBlinker.timer.pause();
}
_underscore.paint.color = Colors.white;
_hasFocus = hasFocus;
} }
} }

@ -1,2 +1,3 @@
export 'blueprint.dart'; export 'blueprint.dart';
export 'keyboard_input_controller.dart';
export 'priority.dart'; export 'priority.dart';

@ -0,0 +1,36 @@
import 'package:flame/components.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// The signature for a key handle function
typedef KeyHandlerCallback = bool Function();
/// {@template keyboard_input_controller}
/// A that receives keyboard input and execute registered methods
/// {@endtemplate}
class KeyboardInputController extends Component with KeyboardHandler {
/// {@macro keyboard_input_controller}
KeyboardInputController({
Map<LogicalKeyboardKey, KeyHandlerCallback> keyUp = const {},
Map<LogicalKeyboardKey, KeyHandlerCallback> keyDown = const {},
}) : _keyUp = keyUp,
_keyDown = keyDown;
final Map<LogicalKeyboardKey, KeyHandlerCallback> _keyUp;
final Map<LogicalKeyboardKey, KeyHandlerCallback> _keyDown;
@override
bool onKeyEvent(RawKeyEvent event, Set<LogicalKeyboardKey> keysPressed) {
final isUp = event is RawKeyUpEvent;
final handlers = isUp ? _keyUp : _keyDown;
final handler = handlers[event.logicalKey];
if (handler != null) {
return handler();
}
return true;
}
}
Loading…
Cancel
Save