import 'dart:async'; import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:fixnum/fixnum.dart'; import 'package:grpc/grpc.dart'; import 'package:trackoffical_app/model/game_map.dart'; // import 'package:trackoffical_app/model/settlement.dart'; import 'package:trackoffical_app/pb.dart' as pb; import 'package:trackoffical_app/service/app_map.dart'; import 'package:trackoffical_app/service/game/game_model.dart'; import 'package:trackoffical_app/service/game/plug.dart'; // import 'package:trackoffical_app/service/game/plug_location.dart'; // import 'package:trackoffical_app/service/game/plug_sport_wear.dart'; // import 'package:trackoffical_app/service/game/rule_in_order.dart'; import 'package:trackoffical_app/service/game/show_position_controller.dart'; import 'package:trackoffical_app/utils.dart'; // import 'package:trackoffical_app/view/ingame/settlement_view.dart'; import 'package:vibration/vibration.dart'; import 'package:wakelock/wakelock.dart'; import '../../logger.dart'; import '../../model/m_control_point.dart'; import '../api.dart'; import '../../model.dart'; import '../app.dart'; import '../database.dart'; import 'map_status.dart'; import 'plug_orientation.dart'; // import 'rule.dart'; // import '../image.dart'; class MapService extends GetxService { static MapService get to => Get.find(); final DatabaseService _database = Get.find(); final GameModel _model = Get.find(); final App _app = Get.find(); final mapStatus = MapStatus(); final errorMsg = ''.obs; final name = "".obs; var mapId = 0; Offset? get positionOnMap => _model.myPositionOnMap.value; // static const _progressMap = 0.6; // static const _progressApi = 0.2; final _loadProgress = 0.0.obs; double get loadProgress => _loadProgress.value; List get controlPointWantSequence => _model.controlPointWantSequence; Future mapLoad() async { info('载入地图[$mapId]'); // await _plugsClear(); final gameMap = pb.ToMapInfoV2().zipImage.toGameMap(); mapStatus.gameMapData = gameMap; await gameMap.loadMemory(onReceiveProgress: (count, total) { if (total > 0) { var p = count.toDouble() / total; // p = p * _progressMap + _progressApi; _loadProgress.value = p; } }); mapStatus.mapImageData.value = gameMap.pic!; // --- 确定地图图片首次缩放比例 --- final screenSize = _app.screenSize; final fitted = applyBoxFit( BoxFit.contain, Size(gameMap.width, gameMap.height), Size(screenSize.width, screenSize.height)); mapStatus.picFirstScale = fitted.destination.width / fitted.source.width; // -------------- _model.mapRotateCenter = Offset(screenSize.width / 2, screenSize.height / 2); await mapStatus.resetMatrix(); // _model.controlPointWantSequence.value = // await _getControlPointWantSequence(); // _gameLoadCheckedCP(); // final plugLocation = PlugLocation( // gameMap: gameMap, // lastInfo: _model.gameSrcState.value.pbGameSave.gameGpsInfos); // // _plugs.add(plugLocation); // _plugs.add(PlugSportWear( // lastHr: _model.gameSrcState.value.pbGameSave.gameHrInfos)); // _plugs.add(PlugOrientation(mapStatus: mapStatus)); // // await _plugsAllInit(); info('载入完成'); } showLocation() { final p = positionOnMap; if (p != null) { final dst = _model.mapRotateCenter; if (_model.isEnableUserLocation && !_model.isAlwaysShowMyLocation) { Get.find().show(); } if (dst != null) { mapStatus.movePicPointTo(p, dst); } } } @override void onReady() { } @override void onClose() { } static Future init() async { final gs = MapService(); return gs; } }