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:
@@ -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 };
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user