diff --git a/frontend/src/views/minigames/TaxiGame.vue b/frontend/src/views/minigames/TaxiGame.vue index b1ae889..8f04c28 100644 --- a/frontend/src/views/minigames/TaxiGame.vue +++ b/frontend/src/views/minigames/TaxiGame.vue @@ -1489,6 +1489,7 @@ export default { y: spawnPosition.y, angle: spawnPosition.angle, speed: 0.3 + Math.random() * 0.7, // Langsamere Geschwindigkeit zwischen 0.3-1.0 + originalSpeed: 0.3 + Math.random() * 0.7, // Ursprüngliche Geschwindigkeit für Wiederherstellung width: 60, // Etwas breiter als Taxi height: 50, // Gleiche Höhe wie Taxi createdAt: now, @@ -1939,8 +1940,8 @@ export default { // Bewege das Auto this.updateCarMovement(car); - // Entferne Autos mit speed=0 (off-road) - if (car.speed === 0) { + // Entferne Autos mit speed=0 (off-road), aber nicht gestoppte Autos nach Kollision + if (car.speed === 0 && !car.isStopped) { return false; } @@ -1970,6 +1971,24 @@ export default { // Aktualisiere die Bewegung eines einzelnen Autos (vereinfachte Taxi-Logik) updateCarMovement(car) { + // Wenn das Auto gestoppt ist (nach Kollision mit stehendem Taxi), prüfe ob Taxi weg ist + if (car.isStopped) { + // Prüfe ob das Taxi noch in der Nähe ist (Kollisionsabstand + 50px Puffer) + const distance = Math.sqrt( + Math.pow(car.x - this.taxi.x, 2) + Math.pow(car.y - this.taxi.y, 2) + ); + const collisionDistance = 80; // Etwa die Größe der Kollisionsboxen + + console.log(`Auto ${car.id} gestoppt - Distanz zum Taxi: ${distance.toFixed(1)}px`); + + if (distance > 30) { + // Taxi ist weg - Auto kann wieder fahren + car.isStopped = false; + car.speed = car.originalSpeed || 0.5; // Ursprüngliche Geschwindigkeit wiederherstellen + console.log(`Auto ${car.id} kann wieder fahren - Taxi ist weg (Distanz: ${distance.toFixed(1)}px)`); + } + return; + } // 0) Prüfe ob das Auto abbiegen sollte (neue Turn-Logik) if (car.willTurn && !car.hasTurnedAtIntersection) { @@ -2736,7 +2755,7 @@ export default { // Prüfe Autos-Kollisionen this.cars.forEach(car => { if (this.checkCollision(this.taxi, car, true)) { - this.handleCrash('auto'); + this.handleCarTaxiCollision(car); } }); } @@ -2988,7 +3007,34 @@ export default { this.fuel = 100; }, - + + handleCarTaxiCollision(car) { + // Wenn das Taxi steht (speed = 0), soll das Auto zurückfahren und stehen bleiben + if (Math.abs(this.taxi.speed) < 0.1) { + // Auto 10 Pixel zurückfahren in entgegengesetzter Richtung + const backDistance = 10; + + if (car.direction === 'up') { + car.y += backDistance; + } else if (car.direction === 'down') { + car.y -= backDistance; + } else if (car.direction === 'left') { + car.x += backDistance; + } else if (car.direction === 'right') { + car.x -= backDistance; + } + + // Auto zum Stehen bringen + car.speed = 0; + car.isStopped = true; + + console.log(`Auto ${car.id} ist mit stehendem Taxi kollidiert und steht jetzt`); + } else { + // Wenn das Taxi fährt, normalen Crash behandeln + this.handleCrash('auto'); + } + }, + handleCrash() { // Verhindere mehrfache Crashes in kurzer Zeit if (this.isPaused) { @@ -3588,18 +3634,9 @@ export default { let w = rect.width; let h = rect.height; if (rect === this.taxi) { - // Taxi: Realistische Kollisionsbox basierend auf SVG (297x506 in 512x512 frame) - // Das Taxi ist etwa 1.7:1 (Länge:Breite) - also länger und breiter als normale Autos - // rect.width und rect.height variieren je nach Rotation w = Math.max(0, rect.width * 0.95); // Länge ~95% (größer für bessere Kollision) h = Math.max(0, rect.height * 0.80); // Breite ~80% (größer für bessere Kollision) } else if (rect.isCar) { - // Autos: Realistische Kollisionsbox basierend auf SVG (219x512 in 512x512 frame) - // Das reale Auto ist sehr lang und schmal (etwa 2.3:1 Verhältnis) - // rect.width=60, rect.height=50 - // Die längere Dimension (60) entspricht der Fahrzeuglänge - // Die kürzere Dimension (50) entspricht der Fahrzeugbreite - // Kollisionsbox sollte die schmale Breite berücksichtigen w = Math.max(0, rect.width * 0.90); // Länge ~90% (54px von 60px) h = Math.max(0, rect.height * 0.50); // Breite nur ~50% (25px von 50px) wegen schmalem SVG } @@ -3609,14 +3646,12 @@ export default { const c = Math.cos(ang); const s = Math.sin(ang); - // lokale Ecken const local = [ { x: -hw, y: -hh }, { x: hw, y: -hh }, { x: hw, y: hh }, { x: -hw, y: hh } ]; - // rotiere + verschiebe const corners = local.map(p => ({ x: cx + p.x * c - p.y * s, y: cy + p.x * s + p.y * c })); return { corners }; },