diff --git a/frontend/src/views/minigames/TaxiGame.vue b/frontend/src/views/minigames/TaxiGame.vue index e18b2eb..ce6bd28 100644 --- a/frontend/src/views/minigames/TaxiGame.vue +++ b/frontend/src/views/minigames/TaxiGame.vue @@ -34,27 +34,12 @@ ← A Links lenken -
- S - Passagier aufnehmen -
-
- Q - Passagier absetzen -
-
- Enter - Tanken -

Ziele

@@ -207,6 +192,8 @@ export default { gameLoop: null, lastSpeedChange: 0, speedChangeInterval: 100, // 200ms = 0.2 Sekunden + lastSteerChange: 0, + steeringBaseInterval: 300, // Basisintervall in ms bei sehr niedriger Geschwindigkeit canvas: null, ctx: null, minimapCanvas: null, @@ -470,21 +457,36 @@ export default { } } - // Lenkung - abhängig von der Geschwindigkeit - const baseSteeringSpeed = 0.07; // Basis-Lenkgeschwindigkeit für 20 km/h (Stufe 4) - const currentSpeedLevel = this.taxi.speed; // 0-24 (entspricht 0-120 km/h) - const steeringSpeed = baseSteeringSpeed * (currentSpeedLevel / 4); // Skaliert auf Stufe 4 - - if (this.keys['ArrowLeft'] || this.keys['a'] || this.keys['A']) { - this.taxi.angle -= steeringSpeed; - } - if (this.keys['ArrowRight'] || this.keys['d'] || this.keys['D']) { - this.taxi.angle += steeringSpeed; + // Lenkung in diskreten 11,25°-Schritten mit geschwindigkeitsabhängiger Verzögerung + const steeringAngle = Math.PI / 16; // 11,25° + const speedLevel = this.taxi.speed; // 0..24 (5 km/h je Stufe) + // Nicht-lineare Beschleunigung der Eingabe: schneller bei hoher Geschwindigkeit + const minInterval = 4; // schnellste Annahme (ms) - erneut halbiert + const maxInterval = 60; // langsamste Annahme (ms) - erneut halbiert + const factor = Math.pow(speedLevel / this.taxi.maxSpeed, 1.5); // 0..1, gewichtet + const steeringInterval = Math.max(minInterval, maxInterval - (maxInterval - minInterval) * factor); + + // Richtung bestimmen (-1 links, +1 rechts) + let steerDir = 0; + if (this.keys['ArrowLeft'] || this.keys['a'] || this.keys['A']) steerDir = -1; + if (this.keys['ArrowRight'] || this.keys['d'] || this.keys['D']) steerDir = steerDir === -1 ? 0 : 1; // beide gedrückt -> neutral + + if (steerDir !== 0) { + const elapsed = currentTime - this.lastSteerChange; + const steps = Math.floor(elapsed / steeringInterval); + if (steps > 0) { + this.taxi.angle += steerDir * steeringAngle * steps; + // Restzeit beibehalten, damit Timing gleichmäßig bleibt + this.lastSteerChange = currentTime - (elapsed % steeringInterval); + } + } else { + // Keine Lenkung gedrückt: Timer resetten, um Burst bei erstem Druck zu vermeiden + this.lastSteerChange = currentTime; } // Aktualisiere Position (1/4 der ursprünglichen Bewegung) - this.taxi.x += Math.cos(this.taxi.angle) * this.taxi.speed * 0.25; - this.taxi.y += Math.sin(this.taxi.angle) * this.taxi.speed * 0.25; + this.taxi.x += Math.cos(this.taxi.angle) * this.taxi.speed * 0.1; + this.taxi.y += Math.sin(this.taxi.angle) * this.taxi.speed * 0.1; // Aktualisiere aktuelle Tile-Position this.updateCurrentTile(); @@ -1162,25 +1164,6 @@ export default { offsetY = (canvas.height - 8 * tileSize) / 2; } - // Passagiere (grün) - ctx.fillStyle = '#4CAF50'; - this.passengers.forEach(passenger => { - if (!passenger.pickedUp) { - ctx.beginPath(); - ctx.arc(offsetX + passenger.x * scaleX, offsetY + passenger.y * scaleY, 2, 0, 2 * Math.PI); - ctx.fill(); - } - }); - - // Ziele (rot) - ctx.fillStyle = '#F44336'; - this.destinations.forEach(dest => { - if (!dest.completed) { - ctx.beginPath(); - ctx.arc(offsetX + dest.x * scaleX, offsetY + dest.y * scaleY, 2, 0, 2 * Math.PI); - ctx.fill(); - } - }); // Taxi (blau) - Position basierend auf aktueller Tile-Position @@ -1606,20 +1589,6 @@ export default { border: 1px solid #7E471B; } -.objective-green { - color: #4CAF50; - font-weight: bold; -} - -.objective-red { - color: #F44336; - font-weight: bold; -} - -.objective-yellow { - color: #FF9800; - font-weight: bold; -} /* Responsive Design */ @media (max-width: 1024px) {