chees_skin_model.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import 'dart:convert';
  2. import 'package:cchess/cchess.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_chinese_chees/utils/game_manager.dart';
  6. /// Description: 象棋皮肤,默认实木
  7. /// Time : 04/28/2023 Friday
  8. /// Author : liuyuqi.gov@msn.cn
  9. class ChessSkin {
  10. GameManager manager;
  11. String folder = "";
  12. double width = 521;
  13. double height = 577;
  14. double size = 57;
  15. Offset offset = const Offset(4, 3);
  16. String board = "board.jpg";
  17. String blank = "blank.png";
  18. Map<String, String> redMap = {
  19. "K": "rk.gif",
  20. "A": "ra.png",
  21. "B": "rb.png",
  22. "C": "rc.png",
  23. "N": "rn.png",
  24. "R": "rr.png",
  25. "P": "rp.png"
  26. };
  27. Map<String, String> blackMap = {
  28. "k": "bk.png",
  29. "a": "ba.png",
  30. "b": "bb.png",
  31. "c": "bc.png",
  32. "n": "bn.png",
  33. "r": "br.png",
  34. "p": "bp.png"
  35. };
  36. late ValueNotifier<bool> readyNotifier;
  37. ChessSkin(this.folder, this.manager) {
  38. readyNotifier = ValueNotifier(false);
  39. String jsonfile = "assets/skins/$folder/config.json";
  40. rootBundle.loadString(jsonfile).then((String fileContents) {
  41. loadJson(fileContents);
  42. }).catchError((error) {
  43. logger.warning('Skin file $jsonfile error', error);
  44. readyNotifier.value = true;
  45. });
  46. }
  47. void loadJson(String content) {
  48. Map<String, dynamic> json = jsonDecode(content);
  49. json.forEach((key, value) {
  50. switch (key) {
  51. case 'width':
  52. width = value.toDouble();
  53. break;
  54. case 'height':
  55. height = value.toDouble();
  56. break;
  57. case 'size':
  58. size = value.toDouble();
  59. break;
  60. case 'board':
  61. board = value.toString();
  62. break;
  63. case 'blank':
  64. blank = value.toString();
  65. break;
  66. case 'offset':
  67. offset = Offset(value['dx'].toDouble(), value['dy'].toDouble());
  68. break;
  69. case 'red':
  70. redMap = value.cast<String, String>();
  71. break;
  72. case 'black':
  73. blackMap = value.cast<String, String>();
  74. break;
  75. }
  76. });
  77. readyNotifier.value = true;
  78. }
  79. String get boardImage => "assets/skins/$folder/$board";
  80. String getRedChess(String code) {
  81. if (!redMap.containsKey(code.toUpperCase())) {
  82. logger.info('Code error: $code');
  83. return "assets/skins/$folder/$blank";
  84. }
  85. return "assets/skins/$folder/${redMap[code.toUpperCase()]}";
  86. }
  87. String getBlackChess(String code) {
  88. if (!blackMap.containsKey(code.toLowerCase())) {
  89. logger.info('Code error: $code');
  90. return "assets/skins/$folder/$blank";
  91. }
  92. return "assets/skins/$folder/${blackMap[code.toLowerCase()]}";
  93. }
  94. Alignment getAlign(ChessPos? pos) {
  95. if (pos == null) {
  96. return const Alignment(1.2, 0);
  97. }
  98. final x = ((pos.x * size + offset.dx) * 2) / (width - size) - 1;
  99. final y = ((((9 - pos.y) * size + offset.dy) * 2) / (height - size) - 1);
  100. return Alignment(
  101. manager.isFlip ? -x : x,
  102. manager.isFlip ? -y : y,
  103. );
  104. }
  105. }