chees_skin_model.dart 3.0 KB

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