diff --git a/frontend/src/views/minigames/TaxiGame.vue b/frontend/src/views/minigames/TaxiGame.vue index b2a4991..47a6998 100644 --- a/frontend/src/views/minigames/TaxiGame.vue +++ b/frontend/src/views/minigames/TaxiGame.vue @@ -2689,10 +2689,10 @@ export default { }, pickupPassenger() { - // Finde nächsten Passagier in der Nähe + // Finde nächsten Passagier in der Nähe mit erweitertem Bereich for (let i = 0; i < this.passengers.length; i++) { const passenger = this.passengers[i]; - if (!passenger.pickedUp && this.checkCollision(this.taxi, passenger)) { + if (!passenger.pickedUp && this.checkExtendedCollision(this.taxi, passenger)) { passenger.pickedUp = true; this.score += 10; break; @@ -2701,10 +2701,10 @@ export default { }, dropoffPassenger() { - // Finde nächstes Ziel in der Nähe + // Finde nächstes Ziel in der Nähe mit erweitertem Bereich for (let i = 0; i < this.destinations.length; i++) { const destination = this.destinations[i]; - if (!destination.completed && this.checkCollision(this.taxi, destination)) { + if (!destination.completed && this.checkExtendedCollision(this.taxi, destination)) { destination.completed = true; this.passengersDelivered++; this.score += 50; @@ -2716,6 +2716,19 @@ export default { } }, + // Erweiterte Kollisionsprüfung für Passagiere und Ziele (größerer Bereich) + checkExtendedCollision(taxi, target) { + // Erweitere den Kollisionsbereich um 30px in alle Richtungen + const extendedTaxi = { + x: taxi.x - 30, + y: taxi.y - 30, + width: taxi.width + 60, + height: taxi.height + 60 + }; + + return this.checkCollision(extendedTaxi, target); + }, + refuel() { // Prüfe ob Tankstellen verfügbar sind if (!this.gasStations || this.gasStations.length === 0) { @@ -3042,10 +3055,10 @@ export default { this.motorSound.stop(); } - // Taxi mittig im aktuellen Tile platzieren + // Taxi stoppen, aber Position beibehalten this.taxi.speed = 0; this.taxi.angle = 0; - this.centerTaxiInCurrentTile(); + // NICHT centerTaxiInCurrentTile() - Taxi bleibt wo es ist // Dialog über globale MessageDialog öffnen this.$nextTick(() => { @@ -3054,10 +3067,6 @@ export default { const crashTitle = 'Unfall!'; this.$root?.$refs?.messageDialog?.open?.(crashMessage, crashTitle, {}, this.handleCrashDialogClose); - // Test: Direkter Aufruf nach 3 Sekunden (falls Dialog-Callback nicht funktioniert) - this.crashDialogTimeout = setTimeout(() => { - this.handleCrashDialogClose(); - }, 3000); console.log('Crash-Dialog wird angezeigt:', { crashes: this.crashes, isPaused: this.isPaused, @@ -3069,7 +3078,6 @@ export default { }, handleCrashDialogClose() { - // (Log entfernt) this.isPaused = false; this.showPauseOverlay = false; @@ -3087,7 +3095,7 @@ export default { if (this.rafId) { cancelAnimationFrame(this.rafId); this.rafId = null; } this.rafId = requestAnimationFrame(this.update); - // Taxi bleibt auf dem aktuellen Tile, mittig platzieren + // Taxi mittig im aktuellen Tile platzieren this.taxi.speed = 0; this.taxi.angle = 0; this.centerTaxiInCurrentTile(); @@ -3131,33 +3139,31 @@ export default { async saveHighscore() { try { const playTime = this.getPlayTime(); + console.log('Store user:', this.$store?.state?.user); + console.log('User ID:', this.$store?.state?.user?.id); + console.log('User nickname:', this.$store?.state?.user?.nickname); + console.log('User name:', this.$store?.state?.user?.name); + console.log('User username:', this.$store?.state?.user?.username); + const highscoreData = { + userId: this.$store?.state?.user?.id || localStorage.getItem('userid') || 'guest', + nickname: this.$store?.state?.user?.nickname || this.$store?.state?.user?.name || this.$store?.state?.user?.username || 'Gast', passengersDelivered: this.passengersDelivered, playtime: playTime, points: this.score, - mapId: this.currentMap ? this.currentMap.id : null + mapId: this.currentMap ? this.currentMap.id : null, + mapName: this.currentMap ? this.currentMap.name : 'Unbekannt' }; - console.log('Highscore-Daten:', highscoreData); - console.log('Current Map:', this.currentMap); - console.log('Passengers Delivered:', this.passengersDelivered); - console.log('Playtime:', playTime); - console.log('Points:', this.score); - - const response = await apiClient.post('/api/taxi/highscore', highscoreData); + const response = await apiClient.post('/api/taxi/highscores', highscoreData); if (response.data.success) { - console.log('Highscore erfolgreich gespeichert:', response.data.data); return response.data.data; } else { - console.error('Fehler beim Speichern des Highscores:', response.data.message); return null; } } catch (error) { - console.error('Fehler beim Speichern des Highscores:', error); if (error.response) { - console.error('Backend-Fehler:', error.response.data); - console.error('Status:', error.response.status); } return null; } @@ -4133,12 +4139,14 @@ export default { async handleKeyDown(event) { // Browser-Shortcuts (F-Tasten, Strg/Meta+R) passieren lassen const key = event.key; - event.preventDefault(); const isFunctionKey = /^F\d{1,2}$/.test(key); const isReloadShortcut = (event.ctrlKey || event.metaKey) && (key === 'r' || key === 'R'); if (isFunctionKey || isReloadShortcut) { return; // nicht abfangen, Browser soll handeln } + + // Nur für Spiel-Tasten preventDefault aufrufen + event.preventDefault(); // Keydown-Repeat und Mehrfach-Setzen unterdrücken if (event.repeat) return; if (this.keys[key]) return; @@ -4217,20 +4225,39 @@ export default { }, restartLevel() { + console.log('🔄 Level wird neu gestartet...'); + + // Spiel stoppen + this.isPaused = true; + this.gameRunning = false; + if (this.rafId) { + cancelAnimationFrame(this.rafId); + this.rafId = null; + } + + // Alle Autos entfernen + this.cars = []; + + // Spiel-Status zurücksetzen this.score = 0; this.money = 0; this.passengersDelivered = 0; + this.crashes = 0; + this.redLightViolations = 0; + this.redLightSincePenalty = 0; this.waitingPassengersList = []; this.loadedPassengersList = []; this.occupiedHouses.clear(); this.fuel = 100; - this.taxi.x = 250; - this.taxi.y = 250; + + // Taxi zurücksetzen + this.taxi.x = 250 - this.taxi.width/2; + this.taxi.y = 250 - this.taxi.height/2; this.taxi.angle = 0; this.taxi.speed = 0; // Reset Spielzeit - this.gameStartTime = null; + this.gameStartTime = Date.now(); // Cleanup bestehender Timeouts if (this.passengerGenerationTimeout) { @@ -4242,8 +4269,16 @@ export default { this.crashDialogTimeout = null; } + // Level neu generieren this.generateLevel(); this.initializePassengerGeneration(); + + // Spiel neu starten + this.isPaused = false; + this.gameRunning = true; + this.startGame(); + + console.log('✅ Level neu gestartet!'); },