Feat/room matchmaking logic#47
Conversation
bnszky
left a comment
There was a problem hiding this comment.
Kilka uwag wrzuciłem. Dołączanie działa i nie znalazłem błędów na tym etapie.
Gdy wpisuję w url /lobby, otrzymuję wielki napis „Ładowanie”. Zamiast tego domyślnie powinien przekierowywać na stronę startową. Można dopisać defaultRoute="/start"
Dotyczy to wszystkich ścieżek. Aktualnie można wejść /abc i nie mamy not found page, więc lepiej przekierowywać na /start
Jeśli chodzi o tryb singleplayer, to tak, można to dodać. Przy tworzeniu roomu możemy wtedy pominąć poczekalnię i przenieść się natychmiastowo do gry. Wystarczy dodać jeden input do tego w start (więc to może dodać do tej PR)
Docelowo będziemy wybierać bohatera na starcie, ale to zostawimy już na następny task
| if (mode === "create") { | ||
| joinedRoom = await client.create("game_room", { | ||
| name: playerName, | ||
| isPrivate, | ||
| }); | ||
| } else if ( |
There was a problem hiding this comment.
Aktualnie gdy próbujemy odświeżać przeglądarkę lub gracza rozłączy na ułamek sekundy, to połączenie nie zostanie odnowione i wyrzuci go z pokoju. Z tego co pamiętam, to działa to na podstawie tokenu w localStorage, który jest wyciągany, by wrócić do pokoju w określonym czasie:
localStorage.setItem("reconnection", JSON.stringify({
token: joinedRoom.reconnectionToken,
playerName,
}));
| this.maxClients = room.maxClients ?? this.maxClients; | ||
| this.state.loadRoomFromJson(room); | ||
|
|
||
| if (options.private) { |
There was a problem hiding this comment.
czy tu nie powinno być isPrivate?
| player.ready = !player.ready; | ||
| } | ||
|
|
||
| if (this.clients.length === 2) { |
There was a problem hiding this comment.
lepiej zamiast 2 użyć zmiennej maxClients
| useEffect(() => { | ||
| if (!room) return; | ||
|
|
||
| const handleStateChange = (state: any) => { |
There was a problem hiding this comment.
| const handleStateChange = (state: any) => { | |
| const handleStateChange = (state: RoomState) => { |
| setJoinError(false); | ||
| let joinedRoom: Room; | ||
|
|
||
| console.warn({ playerName, mode, roomCode, isPrivate }); |
There was a problem hiding this comment.
przed mergem
| console.warn({ playerName, mode, roomCode, isPrivate }); | |
| //console.warn({ playerName, mode, roomCode, isPrivate }); |
|
|
||
| export interface ConnectOptions { | ||
| playerName: string; | ||
| mode: "join" | "create" | "random"; |
There was a problem hiding this comment.
Dla czytelności wyrzućmy random i zostawmy tylko create jako domyślny tryb, gdyby nie został wybrany.
| }); | ||
| await navigate("/game"); | ||
| } catch { | ||
| setErrorMessage("Nie udało się dołaczyć do gry. Spróbuj ponownie."); |
There was a problem hiding this comment.
| setErrorMessage("Nie udało się dołaczyć do gry. Spróbuj ponownie."); | |
| setErrorMessage("Nie udało się dołączyć do gry. Spróbuj ponownie."); |
Dodano ekran startowy (strona /start) gdzie można wybrać albo stworzenie gry publicznej/prywatnej albo dołączyć do gry publicznej (stworzy lobby jeśli taka nie istnieje). Albo dołączyć do gry za pomocą kodu - działa na lobby prywatnym jak i publicznym.
Lobby działa na zasadzie takiej że gra nie wystartuje dopóki dwóch graczy nie jest w nim oraz oboje nie dadzą gotowości (zamiast przycisku play). Teraz jest system z indexem. Gracz z indexem 0 jest Solem, z indexem 1 jest Vronem
Gra inicjalizuje się (ładowanie mapy, przypisanie pozycji) dopiero, gdy w pokoju znajduje się dwóch graczy i obaj oznaczą się jako gotowi.
Modyfikacja testów, bo ze względu na zmiany z lobby (mechanika gotowości) przestały przechodzić.
Pytania: