chess_pieces.dart 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import 'package:cchess/cchess.dart';
  2. import 'package:flutter/material.dart';
  3. import '../models/game_event.dart';
  4. import '../models/game_manager.dart';
  5. import 'piece.dart';
  6. class ChessPieces extends StatefulWidget {
  7. final List<ChessItem> items;
  8. final ChessItem? activeItem;
  9. const ChessPieces({
  10. Key? key,
  11. required this.items,
  12. this.activeItem,
  13. }) : super(key: key);
  14. @override
  15. State<ChessPieces> createState() => _ChessPiecesState();
  16. }
  17. class _ChessPiecesState extends State<ChessPieces> {
  18. late GameManager gamer = GameManager.instance;
  19. int curTeam = -1;
  20. @override
  21. void initState() {
  22. super.initState();
  23. initGamer();
  24. }
  25. void initGamer() {
  26. gamer.on<GamePlayerEvent>(onChangePlayer);
  27. curTeam = gamer.curHand;
  28. }
  29. @override
  30. void dispose() {
  31. gamer.off<GamePlayerEvent>(onChangePlayer);
  32. super.dispose();
  33. }
  34. void onChangePlayer(GameEvent event) {
  35. if (!mounted) return;
  36. setState(() {
  37. curTeam = event.data;
  38. });
  39. }
  40. @override
  41. Widget build(BuildContext context) {
  42. initGamer();
  43. return Stack(
  44. alignment: Alignment.center,
  45. fit: StackFit.expand,
  46. children: widget.items.map<Widget>((ChessItem item) {
  47. bool isActive = false;
  48. bool isHover = false;
  49. if (item.isBlank) {
  50. //return;
  51. } else if (widget.activeItem != null) {
  52. if (widget.activeItem!.position == item.position) {
  53. isActive = true;
  54. if (curTeam == item.team) {
  55. isHover = true;
  56. }
  57. }
  58. }
  59. return AnimatedAlign(
  60. duration: const Duration(milliseconds: 250),
  61. curve: Curves.easeOutQuint,
  62. alignment: gamer.skin.getAlign(item.position),
  63. child: SizedBox(
  64. width: gamer.skin.size * gamer.scale,
  65. height: gamer.skin.size * gamer.scale,
  66. //transform: isActive && lastPosition.isEmpty ? Matrix4(1, 0, 0, 0.0, -0.105 * skewStepper, 1 - skewStepper*0.1, 0, -0.004 * skewStepper, 0, 0, 1, 0, 0, 0, 0, 1) : Matrix4.identity(),
  67. child: Piece(
  68. item: item,
  69. isHover: isHover,
  70. isActive: isActive,
  71. ),
  72. ),
  73. );
  74. }).toList(),
  75. );
  76. }
  77. }