215 lines
5.2 KiB
Vue
215 lines
5.2 KiB
Vue
<template>
|
||
<div class="home">
|
||
<div class="gamepad-container">
|
||
<div class="gamepad-info">
|
||
<div class="data-card axes-card">
|
||
<h3>遥感数据</h3>
|
||
<div class="data-display">
|
||
<span class="axis-label">X 轴:</span>
|
||
<span class="axis-value">{{ directionAxis0_1 }}</span>
|
||
</div>
|
||
<div class="data-display">
|
||
<span class="axis-label">Y 轴:</span>
|
||
<span class="axis-value">{{ directionAxis0_1 }}</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="data-card buttons-card">
|
||
<h3>按键状态</h3>
|
||
<div class="button-group">
|
||
<div
|
||
v-for="(button, index) in buttons"
|
||
:key="index"
|
||
class="button-item"
|
||
:class="{ 'pressed': button.pressed }"
|
||
>
|
||
{{ button.name }}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="data-card axis9-card">
|
||
<h3>按钮数据(Axis9)</h3>
|
||
<div class="data-display">
|
||
<span class="axis-label">方向:</span>
|
||
<span class="axis-value">{{ directionAxis9 }}</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
export default {
|
||
name: "Home",
|
||
data() {
|
||
return {
|
||
interval: null,
|
||
gamepad: null,
|
||
buttons: [
|
||
{ name: "Left2", pressed: false },
|
||
{ name: "Back", pressed: false },
|
||
{ name: "Right Joystick Press", pressed: false }
|
||
],
|
||
directionAxis0_1: "",
|
||
directionAxis9: ""
|
||
};
|
||
},
|
||
created() {
|
||
window.addEventListener("gamepadconnected", this.onGamepadConnected);
|
||
window.addEventListener("gamepaddisconnected", this.onGamepadDisconnected);
|
||
},
|
||
beforeDestroy() {
|
||
window.removeEventListener("gamepadconnected", this.onGamepadConnected);
|
||
window.removeEventListener("gamepaddisconnected", this.onGamepadDisconnected);
|
||
},
|
||
methods: {
|
||
onGamepadConnected(e) {
|
||
console.log("Gamepad connected:", e.gamepad);
|
||
this.gamepad = navigator.getGamepads()[e.gamepad.index];
|
||
this.startGamepad();
|
||
},
|
||
onGamepadDisconnected() {
|
||
clearInterval(this.interval);
|
||
this.gamepad = null;
|
||
},
|
||
startGamepad() {
|
||
this.interval = setInterval(() => {
|
||
const gamepad = navigator.getGamepads()[0];
|
||
if (gamepad) {
|
||
this.updateDirection(gamepad.axes);
|
||
this.updateDirectionAxis9(gamepad.axes);
|
||
this.pressKey(gamepad.buttons);
|
||
}
|
||
}, 50);
|
||
},
|
||
updateDirection(axes) {
|
||
const axis0 = axes[0];
|
||
const axis1 = axes[1];
|
||
if (axis0 >= -0.3 && axis0 <= 0.3 && axis1 <= -0.5) {
|
||
this.directionAxis0_1 = "上";
|
||
} else if (axis0 >= -0.3 && axis0 <= 0.3 && axis1 >= 0.5) {
|
||
this.directionAxis0_1 = "下";
|
||
} else if (axis1 >= -0.3 && axis1 <= 0.3 && axis0 <= -0.3) {
|
||
this.directionAxis0_1 = "左";
|
||
} else if (axis1 >= -0.3 && axis1 <= 0.3 && axis0 >= 0.3) {
|
||
this.directionAxis0_1 = "右";
|
||
} else {
|
||
this.directionAxis0_1 = "未定义";
|
||
}
|
||
},
|
||
updateDirectionAxis9(axes) {
|
||
const axis9 = axes[9];
|
||
const roundedAxis9 = Math.round(axis9 * 100) / 100;
|
||
if (roundedAxis9 <= -0.9) {
|
||
this.directionAxis9 = "上";
|
||
} else if (roundedAxis9 >= 0.0 && roundedAxis9 <= 0.2) {
|
||
this.directionAxis9 = "下";
|
||
} else if (roundedAxis9 >= 0.6 && roundedAxis9 <= 0.8) {
|
||
this.directionAxis9 = "左";
|
||
} else if (roundedAxis9 >= -0.5 && roundedAxis9 <= -0.4) {
|
||
this.directionAxis9 = "右";
|
||
} else {
|
||
this.directionAxis9 = "未定义";
|
||
}
|
||
},
|
||
pressKey(buttons) {
|
||
this.buttons = [
|
||
{ name: "Left2", pressed: buttons[6].value === 1 },
|
||
{ name: "Back", pressed: buttons[8].value === 1 },
|
||
{ name: "Right Joystick Press", pressed: buttons[11].value === 1 }
|
||
];
|
||
}
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style scoped>
|
||
.home {
|
||
position: fixed;
|
||
width: 100%;
|
||
height: 100%;
|
||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
|
||
.gamepad-container {
|
||
width: 450px;
|
||
padding: 2rem;
|
||
border-radius: 15px;
|
||
background: rgba(255, 255, 255, 0.9);
|
||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.gamepad-info {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 2rem;
|
||
}
|
||
|
||
.data-card {
|
||
padding: 1.5rem;
|
||
border-radius: 12px;
|
||
background: rgba(255, 255, 255, 0.8);
|
||
}
|
||
|
||
h3 {
|
||
font-size: 1.4rem;
|
||
color: #2c3e50;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.data-display {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
margin-bottom: 0.8rem;
|
||
}
|
||
|
||
.axis-label {
|
||
color: #666;
|
||
font-size: 1rem;
|
||
}
|
||
|
||
.axis-value {
|
||
color: #34495e;
|
||
font-size: 1.1rem;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.buttons-card {
|
||
padding: 1rem;
|
||
}
|
||
|
||
.button-group {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 0.8rem;
|
||
}
|
||
|
||
.button-item {
|
||
padding: 0.8rem;
|
||
border-radius: 8px;
|
||
background: rgba(255, 255, 255, 0.9);
|
||
color: #666;
|
||
font-size: 1rem;
|
||
cursor: pointer;
|
||
transition: all 0.2s ease;
|
||
}
|
||
|
||
.button-item:hover {
|
||
background: rgba(46, 204, 113, 0.1);
|
||
}
|
||
|
||
.pressed {
|
||
background: #2ecc71;
|
||
color: white !important;
|
||
}
|
||
|
||
.pressed:hover {
|
||
background: #27ae60;
|
||
}
|
||
</style> |