Änderung: Erweiterung der Passagier-Logik im Taxi-Spiel

Änderungen:
- Hinzufügung der Funktionalität zum Laden und Verwalten von Passagierbildern.
- Implementierung der Logik zur Zeichnung von Passagieren vor den Häusern.
- Anpassung der Passagiergenerierung zur Berücksichtigung spezifischer Haus- und Straßendaten.

Diese Anpassungen verbessern die visuelle Darstellung und Interaktivität des Spiels, indem sie eine realistischere Passagierdarstellung ermöglichen.
This commit is contained in:
Torsten Schulz (local)
2025-09-19 20:43:18 +02:00
parent 71f25596e9
commit 54c7e134d1
2 changed files with 76 additions and 51 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 122 KiB

View File

@@ -237,6 +237,7 @@ export default {
images: {} images: {}
}, },
houseImage: null, houseImage: null,
passengerImages: {}, // Speichert geladene Passagier-Bilder
trafficLightStates: {}, trafficLightStates: {},
lastTrafficLightTick: 0, lastTrafficLightTick: 0,
redLightViolations: 0, redLightViolations: 0,
@@ -308,6 +309,7 @@ export default {
this.loadTiles(); this.loadTiles();
this.loadTaxiImage(); this.loadTaxiImage();
this.loadHouseImage(); this.loadHouseImage();
this.loadPassengerImages();
this.loadMaps(); this.loadMaps();
this.setupEventListeners(); this.setupEventListeners();
await this.initializeMotorSound(); await this.initializeMotorSound();
@@ -688,11 +690,7 @@ export default {
this.passengerGenerationInterval = Math.floor(Math.random() * 25000) + 10000; // 10-35 Sekunden this.passengerGenerationInterval = Math.floor(Math.random() * 25000) + 10000; // 10-35 Sekunden
this.lastPassengerGeneration = Date.now(); this.lastPassengerGeneration = Date.now();
this.occupiedHouses.clear(); this.occupiedHouses.clear();
console.log('Passagier-Generierung initialisiert:', { // Passagier-Generierung initialisiert
interval: this.passengerGenerationInterval,
currentMap: !!this.currentMap,
tileHouses: this.currentMap?.tileHouses?.length || 0
});
}, },
generateWaitingPassenger() { generateWaitingPassenger() {
@@ -717,50 +715,37 @@ export default {
// Wenn keine freien Häuser verfügbar, generiere keinen Passagier // Wenn keine freien Häuser verfügbar, generiere keinen Passagier
if (availableHouses.length === 0) { if (availableHouses.length === 0) {
console.log('Keine freien Häuser verfügbar für Passagier-Generierung');
return; return;
} }
// Wähle zufälliges Haus // Wähle zufälliges Haus
const selectedHouse = availableHouses[Math.floor(Math.random() * availableHouses.length)]; const selectedHouse = availableHouses[Math.floor(Math.random() * availableHouses.length)];
// Finde verfügbare Straßennamen aus der Map // Finde die Straße für dieses spezifische Haus
const availableStreets = []; let streetName = "Unbekannte Straße";
if (this.currentMap.tileStreets) { let houseNumber = 1;
this.currentMap.tileStreets.forEach(ts => {
if (ts.streetNameH && ts.streetNameH.name) { // Suche nach Straßennamen für das gewählte Haus-Tile
availableStreets.push(ts.streetNameH.name); const houseTile = this.currentMap.tileStreets?.find(ts => ts.x === selectedHouse.x && ts.y === selectedHouse.y);
if (houseTile) {
// Bestimme die Straße basierend auf der Haus-Ecke
const corner = selectedHouse.house.corner;
if (corner === 'lo' || corner === 'ro') {
// Horizontale Straße
if (houseTile.streetNameH && houseTile.streetNameH.name) {
streetName = houseTile.streetNameH.name;
} }
if (ts.streetNameV && ts.streetNameV.name) { } else if (corner === 'lu' || corner === 'ru') {
availableStreets.push(ts.streetNameV.name); // Vertikale Straße
if (houseTile.streetNameV && houseTile.streetNameV.name) {
streetName = houseTile.streetNameV.name;
} }
}); }
} }
// Wenn keine Straßen in der Map vorhanden, verwende Fallback // Finde die Hausnummer für dieses spezifische Haus
let streetName, houseNumber; const houseKey = `${selectedHouse.x},${selectedHouse.y},${selectedHouse.house.corner}`;
if (availableStreets.length > 0) { houseNumber = this.houseNumbers[houseKey] || 1;
// Wähle zufällige Straße aus der Map
streetName = availableStreets[Math.floor(Math.random() * availableStreets.length)];
// Finde alle Hausnummern für diese Straße
const houseNumbersForStreet = this.getHouseNumbersForStreet(streetName);
if (houseNumbersForStreet.length > 0) {
// Wähle zufällige Hausnummer aus den existierenden
houseNumber = houseNumbersForStreet[Math.floor(Math.random() * houseNumbersForStreet.length)];
} else {
// Fallback falls keine Hausnummern für diese Straße gefunden
houseNumber = Math.floor(Math.random() * 200) + 1;
}
console.log('Verfügbare Straßen:', availableStreets);
console.log('Gewählte Straße:', streetName);
console.log('Hausnummern für Straße:', houseNumbersForStreet);
console.log('Gewählte Hausnummer:', houseNumber);
} else {
// Fallback falls keine Straßen in der Map
streetName = "Unbekannte Straße";
houseNumber = Math.floor(Math.random() * 200) + 1;
console.log('Keine Straßen in der Map gefunden, verwende Fallback');
}
// Erstelle Passagier // Erstelle Passagier
const passenger = { const passenger = {
@@ -771,14 +756,14 @@ export default {
tileX: selectedHouse.x, tileX: selectedHouse.x,
tileY: selectedHouse.y, tileY: selectedHouse.y,
houseIndex: selectedHouse.houseIndex, houseIndex: selectedHouse.houseIndex,
houseCorner: selectedHouse.house.corner, // Speichere auch die Ecke
imageIndex: this.generatePassengerImageIndex(), // Zufälliger Bildindex 1-6
createdAt: Date.now() // Zeitstempel der Erstellung createdAt: Date.now() // Zeitstempel der Erstellung
}; };
// Füge Passagier zur Liste hinzu und markiere Haus als belegt // Füge Passagier zur Liste hinzu und markiere Haus als belegt
this.waitingPassengersList.push(passenger); this.waitingPassengersList.push(passenger);
this.occupiedHouses.add(selectedHouse.houseId); this.occupiedHouses.add(selectedHouse.houseId);
console.log('Neuer Passagier generiert:', passenger);
}, },
generatePassengerName() { generatePassengerName() {
@@ -796,22 +781,20 @@ export default {
return `${firstName} ${lastName}`; return `${firstName} ${lastName}`;
}, },
generatePassengerImageIndex() {
// Zufälliger Bildindex 1-6 (1-3 männlich, 4-6 weiblich)
return Math.floor(Math.random() * 6) + 1;
},
updatePassengerGeneration() { updatePassengerGeneration() {
const now = Date.now(); const now = Date.now();
const timeSinceLastGeneration = now - this.lastPassengerGeneration; const timeSinceLastGeneration = now - this.lastPassengerGeneration;
if (timeSinceLastGeneration >= this.passengerGenerationInterval) { if (timeSinceLastGeneration >= this.passengerGenerationInterval) {
console.log('Generiere neuen Passagier...', {
timeSinceLastGeneration,
interval: this.passengerGenerationInterval,
currentMap: !!this.currentMap,
tileHouses: this.currentMap?.tileHouses?.length || 0
});
this.generateWaitingPassenger(); this.generateWaitingPassenger();
this.lastPassengerGeneration = now; this.lastPassengerGeneration = now;
// Setze nächstes Intervall (10-35 Sekunden) // Setze nächstes Intervall (10-35 Sekunden)
this.passengerGenerationInterval = Math.floor(Math.random() * 25000) + 10000; this.passengerGenerationInterval = Math.floor(Math.random() * 25000) + 10000;
console.log('Nächstes Intervall:', this.passengerGenerationInterval);
} }
}, },
@@ -845,9 +828,7 @@ export default {
return true; // Behalte in der Liste return true; // Behalte in der Liste
}); });
if (expiredPassengers.length > 0) { // Passagiere wurden entfernt (abgelaufen)
console.log(`${expiredPassengers.length} Passagiere entfernt (abgelaufen):`, expiredPassengers);
}
}, },
getPassengerTimeLeft(passenger) { getPassengerTimeLeft(passenger) {
@@ -1851,9 +1832,39 @@ export default {
ctx.fillStyle = '#000'; ctx.fillStyle = '#000';
ctx.fillText(String(num), 0, 0); ctx.fillText(String(num), 0, 0);
} }
// Passagier zeichnen (falls vorhanden)
this.drawPassengerOnHouse(ctx, h, col, row);
ctx.restore(); ctx.restore();
} }
}, },
drawPassengerOnHouse(ctx, house, col, row) {
// Finde Passagier für dieses Haus
const passenger = this.waitingPassengersList.find(p =>
p.tileX === col && p.tileY === row && (p.houseIndex === house.corner || p.houseCorner === house.corner)
);
if (!passenger || !this.passengerImages[passenger.imageIndex]) {
return; // Kein Passagier oder Bild nicht geladen
}
const passengerImg = this.passengerImages[passenger.imageIndex];
const PASSENGER_SIZE = 40; // Größe des Passagiers
const HOUSE_H = 150; // Haushöhe (muss mit drawHousesOnMainCanvas übereinstimmen)
// Zeichne Passagier auf dem Boden vor dem Haus (stehend)
// Der untere Rand der Figur soll mit dem unteren Rand des Hauses ausgerichtet sein
ctx.drawImage(
passengerImg,
-PASSENGER_SIZE/2,
HOUSE_H/2 - PASSENGER_SIZE, // Unterer Rand der Figur am unteren Rand des Hauses
PASSENGER_SIZE,
PASSENGER_SIZE
);
},
// Haltelinien: 120px vom Rand, 5px dick, 40px breit, an allen vier Zufahrten // Haltelinien: 120px vom Rand, 5px dick, 40px breit, an allen vier Zufahrten
drawStopLinesOnMainCanvas(ctx, size, approaches = { top:true, right:true, bottom:true, left:true }) { drawStopLinesOnMainCanvas(ctx, size, approaches = { top:true, right:true, bottom:true, left:true }) {
const margin = 120; // Basis-Abstand vom Rand const margin = 120; // Basis-Abstand vom Rand
@@ -2114,6 +2125,20 @@ export default {
img.src = '/images/taxi/house_small.png'; img.src = '/images/taxi/house_small.png';
}, },
loadPassengerImages() {
// Lade alle 6 Passagier-Bilder (1-3 männlich, 4-6 weiblich)
for (let i = 1; i <= 6; i++) {
const img = new Image();
img.onload = () => {
this.passengerImages[i] = img;
};
img.onerror = () => {
console.warn(`Fehler beim Laden von passenger${i}.png`);
};
img.src = `/images/taxi/passenger${i}.png`;
}
},
async loadMaps() { async loadMaps() {
try { try {
const response = await apiClient.get('/api/taxi-maps/maps'); const response = await apiClient.get('/api/taxi-maps/maps');