SpaceRace: Full-width TV field, death line scrolling, camera following leader, jump fix, path never fully blocked, player color on controller
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
import { App } from '../main.js';
|
||||
|
||||
export class JoinScreen {
|
||||
private app: App;
|
||||
|
||||
constructor(app: App) {
|
||||
this.app = app;
|
||||
this.init();
|
||||
}
|
||||
|
||||
private init(): void {
|
||||
const joinBtn = document.getElementById('join-btn')!;
|
||||
const roomInput = document.getElementById('room-input') as HTMLInputElement;
|
||||
const nameInput = document.getElementById('name-input') as HTMLInputElement;
|
||||
const errorEl = document.getElementById('join-error')!;
|
||||
|
||||
// Pre-fill room code from URL if present
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const roomParam = params.get('room');
|
||||
if (roomParam) {
|
||||
roomInput.value = roomParam.toUpperCase();
|
||||
}
|
||||
|
||||
joinBtn.addEventListener('click', () => {
|
||||
const roomCode = roomInput.value.trim().toUpperCase();
|
||||
const playerName = nameInput.value.trim();
|
||||
|
||||
if (!roomCode || roomCode.length !== 4) {
|
||||
errorEl.textContent = 'Enter a 4-character room code';
|
||||
return;
|
||||
}
|
||||
if (!playerName) {
|
||||
errorEl.textContent = 'Enter your name';
|
||||
return;
|
||||
}
|
||||
|
||||
errorEl.textContent = '';
|
||||
joinBtn.textContent = 'Joining...';
|
||||
joinBtn.disabled = true;
|
||||
|
||||
this.app.socket.emit('mobile:joinRoom', { roomCode, playerName }, (res) => {
|
||||
joinBtn.textContent = 'Join Race';
|
||||
joinBtn.disabled = false;
|
||||
if (!res.ok) {
|
||||
errorEl.textContent = res.error || 'Failed to join';
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user