Verbesserung der Fahrzeug-Logik und Kollisionserkennung im Taxi-Spiel

Änderungen:
- Hinzufügen einer ursprünglichen Geschwindigkeit für Autos zur Wiederherstellung nach Kollisionen.
- Anpassung der Logik zur Entfernung von Autos mit Geschwindigkeit 0, um gestoppte Autos nach Kollisionen zu berücksichtigen.
- Implementierung einer neuen Methode zur Handhabung von Kollisionen zwischen Taxi und Autos, die das Verhalten bei Kollisionen mit stehenden Taxis optimiert.
- Erweiterung der Debugging-Ausgaben zur besseren Nachverfolgbarkeit von Fahrzeugbewegungen und Kollisionen.

Diese Anpassungen verbessern die Interaktion der Fahrzeuge und optimieren die Kollisionserkennung im Spiel.
This commit is contained in:
Torsten Schulz (local)
2025-10-20 18:30:00 +02:00
parent 18105af123
commit 17d5f33e8d

View File

@@ -1489,6 +1489,7 @@ export default {
y: spawnPosition.y, y: spawnPosition.y,
angle: spawnPosition.angle, angle: spawnPosition.angle,
speed: 0.3 + Math.random() * 0.7, // Langsamere Geschwindigkeit zwischen 0.3-1.0 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 width: 60, // Etwas breiter als Taxi
height: 50, // Gleiche Höhe wie Taxi height: 50, // Gleiche Höhe wie Taxi
createdAt: now, createdAt: now,
@@ -1939,8 +1940,8 @@ export default {
// Bewege das Auto // Bewege das Auto
this.updateCarMovement(car); this.updateCarMovement(car);
// Entferne Autos mit speed=0 (off-road) // Entferne Autos mit speed=0 (off-road), aber nicht gestoppte Autos nach Kollision
if (car.speed === 0) { if (car.speed === 0 && !car.isStopped) {
return false; return false;
} }
@@ -1970,6 +1971,24 @@ export default {
// Aktualisiere die Bewegung eines einzelnen Autos (vereinfachte Taxi-Logik) // Aktualisiere die Bewegung eines einzelnen Autos (vereinfachte Taxi-Logik)
updateCarMovement(car) { 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) // 0) Prüfe ob das Auto abbiegen sollte (neue Turn-Logik)
if (car.willTurn && !car.hasTurnedAtIntersection) { if (car.willTurn && !car.hasTurnedAtIntersection) {
@@ -2736,7 +2755,7 @@ export default {
// Prüfe Autos-Kollisionen // Prüfe Autos-Kollisionen
this.cars.forEach(car => { this.cars.forEach(car => {
if (this.checkCollision(this.taxi, car, true)) { if (this.checkCollision(this.taxi, car, true)) {
this.handleCrash('auto'); this.handleCarTaxiCollision(car);
} }
}); });
} }
@@ -2989,6 +3008,33 @@ export default {
this.fuel = 100; 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() { handleCrash() {
// Verhindere mehrfache Crashes in kurzer Zeit // Verhindere mehrfache Crashes in kurzer Zeit
if (this.isPaused) { if (this.isPaused) {
@@ -3588,18 +3634,9 @@ export default {
let w = rect.width; let w = rect.width;
let h = rect.height; let h = rect.height;
if (rect === this.taxi) { 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) 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) h = Math.max(0, rect.height * 0.80); // Breite ~80% (größer für bessere Kollision)
} else if (rect.isCar) { } 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) 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 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 c = Math.cos(ang);
const s = Math.sin(ang); const s = Math.sin(ang);
// lokale Ecken
const local = [ const local = [
{ x: -hw, y: -hh }, { x: -hw, y: -hh },
{ x: hw, y: -hh }, { x: hw, y: -hh },
{ 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 })); const corners = local.map(p => ({ x: cx + p.x * c - p.y * s, y: cy + p.x * s + p.y * c }));
return { corners }; return { corners };
}, },