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