import 'dart:async'; import 'package:dart_jts/dart_jts.dart'; import 'package:trackoffical_app/model/game_person_data.dart'; import 'package:trackoffical_app/service/game/game_instance_guardian.dart'; import 'package:trackoffical_app/service/game/game_manager_service.dart'; import '../../../model/game_map.dart'; import '../../../model/m_position.dart'; import '../../../service/app.dart'; import '../layer/layer_controller.dart'; class GuardianControllerMock extends LayerController { var instance = GameInstanceGuardian(underGuardianId: -1); final selectedPersonIndex = 0.obs; final Rx lockUnderGuardianToCenterUserId = Rx(null); final Rx guardianPosition = Rx(null); final Rx guardianPositionOnMap = Rx(null); final isShowGuardian = true.obs; final isShowRoute = true.obs; StreamSubscription? _subscriptionPosition; GamePersonData? get selectedPersonData { if (instance.gamePersonData.isEmpty) { return null; } var i = instance.gamePersonData.length - 1; if (selectedPersonIndex.value < i) { i = selectedPersonIndex.value; } return instance.gamePersonData[i]; } void setUserById(int userId){ for(var i=0; i< instance.gamePersonData.length;i++){ if(instance.gamePersonData[i].userId==userId){ selectedPersonIndex.value =i; break; } } } GamePersonData? getUserById(int userId){ for(var i=0; i< instance.gamePersonData.length;i++){ if(instance.gamePersonData[i].userId==userId){ return instance.gamePersonData[i]; } } return null; } void lockUnderGuardianToCenter(GamePersonData person){ if(lockUnderGuardianToCenterUserId.value!=null){ lockUnderGuardianToCenterUserId.value=null; isEnableUserTouchTranslation=true; }else{ lockUnderGuardianToCenterUserId.value = person.userId; isEnableUserTouchTranslation=false; } } void moveScreenCenterToGuardianLocation(){ final gp = guardianPositionOnMap.value; if(gp!= null){ moveOnMapPointToScreen(gp, mapRotateCenter.value); } } @override GameMap? get gameMap => instance.gameMapData; @override void onMapSizeChange(Size size) { super.onMapSizeChange(size); mapRotateCenter.value = Offset(size.width / 2, size.height / 2); } @override void onClose() { super.onClose(); guardianPosition.close(); } } class GuardianController extends GuardianControllerMock { @override GameInstanceGuardian get instance { final i = GameManagerService.to.instance!; if (i is! GameInstanceGuardian) { throw RuntimeException('未开始监控'); } return i; } Timer? _timerUnderGuardianToScreenCenter; @override void onReady() { super.onReady(); final userId = Get.arguments; if(userId is int){ setUserById(userId); } final locationStream = App.to.locationStream; App.to.locationStart(500.milliseconds, 0); _subscriptionPosition?.cancel(); _subscriptionPosition=locationStream.listen((event) { guardianPosition.value=event; gameMap?.worldToPixel(event).then((offset){ guardianPositionOnMap.value= offset; }); }); // guardianPosition.bindStream(Sensor.locationStream.map((event) => event.toModel())); _timerUnderGuardianToScreenCenter = Timer.periodic(200.milliseconds, (timer) { final userId = lockUnderGuardianToCenterUserId.value; if(userId!= null){ final user = getUserById(userId); if(user!= null){ var p = user.myPositionOnMap; if(p!= null){ moveOnMapPointToScreen(p, mapRotateCenter.value); } } } }); } @override void onClose() { super.onClose(); _timerUnderGuardianToScreenCenter?.cancel(); _subscriptionPosition?.cancel(); GameManagerService.to.instanceStop(); App.to.locationStop(); } }