Improve map lock and smart heading behavior

This commit is contained in:
2026-03-25 14:56:28 +08:00
parent d1cc6cc473
commit a19342d61f
8 changed files with 300 additions and 62 deletions

View File

@@ -42,6 +42,7 @@ type MapPageData = MapEngineViewState & {
compassLabels: CompassLabelData[]
sideButtonMode: SideButtonMode
sideToggleIconSrc: string
sideButton2Class: string
sideButton4Class: string
sideButton11Class: string
sideButton16Class: string
@@ -49,7 +50,7 @@ type MapPageData = MapEngineViewState & {
showRightButtonGroups: boolean
showBottomDebugButton: boolean
}
const INTERNAL_BUILD_VERSION = 'map-build-207'
const INTERNAL_BUILD_VERSION = 'map-build-213'
const CLASSIC_REMOTE_GAME_CONFIG_URL = 'https://oss-mbh5.colormaprun.com/gotomars/event/classic-sequential.json'
const SCORE_O_REMOTE_GAME_CONFIG_URL = 'https://oss-mbh5.colormaprun.com/gotomars/event/score-o.json'
let mapEngine: MapEngine | null = null
@@ -131,13 +132,19 @@ function getSideActionButtonClass(state: SideActionButtonState): string {
return 'map-side-button map-side-button--default'
}
function buildSideButtonState(data: Pick<MapPageData, 'sideButtonMode' | 'showGameInfoPanel' | 'skipButtonEnabled' | 'gameSessionStatus'>) {
function buildSideButtonState(data: Pick<MapPageData, 'sideButtonMode' | 'showGameInfoPanel' | 'skipButtonEnabled' | 'gameSessionStatus' | 'gpsLockEnabled' | 'gpsLockAvailable'>) {
const sideButton2State: SideActionButtonState = !data.gpsLockAvailable
? 'muted'
: data.gpsLockEnabled
? 'active'
: 'default'
const sideButton4State: SideActionButtonState = data.gameSessionStatus === 'idle' ? 'default' : 'active'
const sideButton11State: SideActionButtonState = data.showGameInfoPanel ? 'active' : 'default'
const sideButton16State: SideActionButtonState = data.skipButtonEnabled ? 'default' : 'muted'
return {
sideToggleIconSrc: getSideToggleIconSrc(data.sideButtonMode),
sideButton2Class: getSideActionButtonClass(sideButton2State),
sideButton4Class: getSideActionButtonClass(sideButton4State),
sideButton11Class: getSideActionButtonClass(sideButton11State),
sideButton16Class: getSideActionButtonClass(sideButton16State),
@@ -180,6 +187,8 @@ Page({
panelProgressText: '0/0',
gameSessionStatus: 'idle',
gameModeText: '顺序赛',
gpsLockEnabled: false,
gpsLockAvailable: false,
locationSourceMode: 'real',
locationSourceText: '真实定位',
mockBridgeConnected: false,
@@ -239,6 +248,8 @@ Page({
showGameInfoPanel: false,
skipButtonEnabled: false,
gameSessionStatus: 'idle',
gpsLockEnabled: false,
gpsLockAvailable: false,
}),
} as unknown as MapPageData,
@@ -306,6 +317,8 @@ Page({
panelProgressText: '0/0',
gameSessionStatus: 'idle',
gameModeText: '顺序赛',
gpsLockEnabled: false,
gpsLockAvailable: false,
locationSourceMode: 'real',
locationSourceText: '真实定位',
mockBridgeConnected: false,
@@ -363,6 +376,8 @@ Page({
showGameInfoPanel: false,
skipButtonEnabled: false,
gameSessionStatus: 'idle',
gpsLockEnabled: false,
gpsLockAvailable: false,
}),
})
},
@@ -723,9 +738,21 @@ Page({
},
handleForceExitGame() {
if (mapEngine) {
mapEngine.handleForceExitGame()
if (!mapEngine || this.data.gameSessionStatus === 'idle') {
return
}
wx.showModal({
title: '确认退出',
content: '确认强制结束当前对局并返回开始前状态?',
confirmText: '确认退出',
cancelText: '取消',
success: (result) => {
if (result.confirm && mapEngine) {
mapEngine.handleForceExitGame()
}
},
})
},
handleSkipAction() {
@@ -781,6 +808,8 @@ Page({
showGameInfoPanel: true,
skipButtonEnabled: this.data.skipButtonEnabled,
gameSessionStatus: this.data.gameSessionStatus,
gpsLockEnabled: this.data.gpsLockEnabled,
gpsLockAvailable: this.data.gpsLockAvailable,
}),
})
},
@@ -793,6 +822,8 @@ Page({
showGameInfoPanel: false,
skipButtonEnabled: this.data.skipButtonEnabled,
gameSessionStatus: this.data.gameSessionStatus,
gpsLockEnabled: this.data.gpsLockEnabled,
gpsLockAvailable: this.data.gpsLockAvailable,
}),
})
},
@@ -832,9 +863,16 @@ Page({
showGameInfoPanel: this.data.showGameInfoPanel,
skipButtonEnabled: this.data.skipButtonEnabled,
gameSessionStatus: this.data.gameSessionStatus,
gpsLockEnabled: this.data.gpsLockEnabled,
gpsLockAvailable: this.data.gpsLockAvailable,
}),
})
},
handleToggleGpsLock() {
if (mapEngine) {
mapEngine.handleToggleGpsLock()
}
},
handleToggleMapRotateMode() {
if (!mapEngine) {
return
@@ -856,6 +894,8 @@ Page({
showGameInfoPanel: false,
skipButtonEnabled: this.data.skipButtonEnabled,
gameSessionStatus: this.data.gameSessionStatus,
gpsLockEnabled: this.data.gpsLockEnabled,
gpsLockAvailable: this.data.gpsLockAvailable,
}),
})
},
@@ -868,6 +908,8 @@ Page({
showGameInfoPanel: this.data.showGameInfoPanel,
skipButtonEnabled: this.data.skipButtonEnabled,
gameSessionStatus: this.data.gameSessionStatus,
gpsLockEnabled: this.data.gpsLockEnabled,
gpsLockAvailable: this.data.gpsLockAvailable,
}),
})
},

View File

@@ -25,7 +25,6 @@
></canvas>
</view>
<view class="map-stage__crosshair"></view>
<view class="map-stage__map-pulse {{mapPulseFxClass}}" wx:if="{{mapPulseVisible}}" style="left: {{mapPulseLeftPx}}px; top: {{mapPulseTopPx}}px;"></view>
<view class="map-stage__stage-fx {{stageFxClass}}" wx:if="{{stageFxVisible}}"></view>
@@ -77,7 +76,7 @@
<cover-view class="map-side-column map-side-column--left map-side-column--left-group" wx:if="{{!showDebugPanel && !showGameInfoPanel && showLeftButtonGroup}}" style="top: {{topInsetHeight}}px;">
<cover-view class="map-side-button map-side-button--icon" bindtap="handleToggleMapRotateMode"><cover-image class="map-side-button__rotate-image {{orientationMode === 'heading-up' ? 'map-side-button__rotate-image--active' : ''}}" src="../../assets/btn_map_rotate_cropped.png"></cover-image></cover-view>
<cover-view class="map-side-button map-side-button--muted"><cover-view class="map-side-button__text">1</cover-view></cover-view>
<cover-view class="map-side-button"><cover-view class="map-side-button__text">2</cover-view></cover-view>
<cover-view class="{{sideButton2Class}}" bindtap="handleToggleGpsLock"><cover-view class="map-side-button__text">2</cover-view></cover-view>
<cover-view class="map-side-button map-side-button--active"><cover-view class="map-side-button__text">3</cover-view></cover-view>
<cover-view class="{{sideButton4Class}}" bindtap="handleForceExitGame"><cover-image class="map-side-button__action-image" src="../../assets/btn_exit.png"></cover-image></cover-view>
</cover-view>

View File

@@ -51,43 +51,6 @@
pointer-events: none;
}
.map-stage__crosshair {
position: absolute;
left: 50%;
top: 50%;
width: 44rpx;
height: 44rpx;
transform: translate(-50%, -50%);
border: 3rpx solid rgba(255, 255, 255, 0.95);
border-radius: 50%;
box-shadow: 0 0 0 4rpx rgba(22, 48, 32, 0.2);
pointer-events: none;
z-index: 3;
}
.map-stage__crosshair::before,
.map-stage__crosshair::after {
content: '';
position: absolute;
background: rgba(255, 255, 255, 0.95);
}
.map-stage__crosshair::before {
left: 50%;
top: -18rpx;
width: 2rpx;
height: 76rpx;
transform: translateX(-50%);
}
.map-stage__crosshair::after {
left: -18rpx;
top: 50%;
width: 76rpx;
height: 2rpx;
transform: translateY(-50%);
}
.map-stage__map-pulse {
position: absolute;
width: 44rpx;