Add platform-specific implementations for assets, audio, WebSocket, and rendering on Desktop and WebAssembly platforms. Introduce embedded assets for WebAssembly and native file handling for Desktop. Add platform-specific chunk loading and game state synchronization.
This commit is contained in:
119
cmd/client/wasm_bridge.go
Normal file
119
cmd/client/wasm_bridge.go
Normal file
@@ -0,0 +1,119 @@
|
||||
//go:build js && wasm
|
||||
// +build js,wasm
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"syscall/js"
|
||||
"time"
|
||||
)
|
||||
|
||||
// setupJavaScriptBridge registriert JavaScript-Funktionen für HTML-Menü Interaktion
|
||||
func (g *Game) setupJavaScriptBridge() {
|
||||
// startGame(mode, playerName, roomID, teamName, isHost)
|
||||
startGameFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||
if len(args) < 2 {
|
||||
log.Println("❌ startGame: Nicht genug Argumente")
|
||||
return nil
|
||||
}
|
||||
|
||||
mode := args[0].String() // "solo" oder "coop"
|
||||
playerName := args[1].String() // Spielername
|
||||
|
||||
// Spieler-Daten setzen
|
||||
g.playerName = playerName
|
||||
g.gameMode = mode
|
||||
g.savePlayerName(playerName)
|
||||
|
||||
if mode == "solo" {
|
||||
// Solo Mode - direkt ins Spiel
|
||||
g.roomID = fmt.Sprintf("solo_%d", time.Now().UnixNano())
|
||||
g.isHost = true
|
||||
g.appState = StateGame
|
||||
log.Printf("🎮 Solo-Spiel gestartet: %s", playerName)
|
||||
} else if mode == "coop" && len(args) >= 5 {
|
||||
// Co-op Mode - in die Lobby
|
||||
roomID := args[2].String()
|
||||
teamName := args[3].String()
|
||||
isHost := args[4].Bool()
|
||||
|
||||
g.roomID = roomID
|
||||
g.teamName = teamName
|
||||
g.isHost = isHost
|
||||
g.appState = StateLobby
|
||||
|
||||
log.Printf("🎮 Co-op-Lobby erstellt: %s (Room: %s, Team: %s, Host: %v)", playerName, roomID, teamName, isHost)
|
||||
}
|
||||
|
||||
// Verbindung starten
|
||||
go g.connectAndStart()
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
// requestLeaderboard()
|
||||
requestLeaderboardFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||
log.Println("📊 Leaderboard angefordert")
|
||||
go g.requestLeaderboard()
|
||||
return nil
|
||||
})
|
||||
|
||||
// setMusicVolume(volume)
|
||||
setMusicVolumeFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||
if len(args) > 0 {
|
||||
volume := args[0].Float()
|
||||
g.audio.SetMusicVolume(volume)
|
||||
log.Printf("🎵 Musik-Lautstärke: %.0f%%", volume*100)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
// setSFXVolume(volume)
|
||||
setSFXVolumeFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||
if len(args) > 0 {
|
||||
volume := args[0].Float()
|
||||
g.audio.SetSFXVolume(volume)
|
||||
log.Printf("🔊 SFX-Lautstärke: %.0f%%", volume*100)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
// Im globalen Scope registrieren
|
||||
js.Global().Set("startGame", startGameFunc)
|
||||
js.Global().Set("requestLeaderboard", requestLeaderboardFunc)
|
||||
js.Global().Set("setMusicVolume", setMusicVolumeFunc)
|
||||
js.Global().Set("setSFXVolume", setSFXVolumeFunc)
|
||||
|
||||
log.Println("✅ JavaScript Bridge registriert")
|
||||
}
|
||||
|
||||
// Leaderboard an JavaScript senden
|
||||
func (g *Game) sendLeaderboardToJS() {
|
||||
g.leaderboardMutex.Lock()
|
||||
entries := make([]interface{}, len(g.leaderboard))
|
||||
for i, entry := range g.leaderboard {
|
||||
entries[i] = map[string]interface{}{
|
||||
"player_name": entry.PlayerName,
|
||||
"score": entry.Score,
|
||||
"player_code": entry.PlayerCode,
|
||||
}
|
||||
}
|
||||
g.leaderboardMutex.Unlock()
|
||||
|
||||
// JavaScript-Funktion aufrufen
|
||||
if updateFunc := js.Global().Get("updateLeaderboard"); !updateFunc.IsUndefined() {
|
||||
jsEntries := js.ValueOf(entries)
|
||||
updateFunc.Invoke(jsEntries)
|
||||
log.Printf("📤 Leaderboard an JavaScript gesendet: %d Einträge", len(entries))
|
||||
}
|
||||
}
|
||||
|
||||
// Game Over Screen an JavaScript senden
|
||||
func (g *Game) sendGameOverToJS(score int) {
|
||||
if gameOverFunc := js.Global().Get("showGameOver"); !gameOverFunc.IsUndefined() {
|
||||
gameOverFunc.Invoke(score)
|
||||
log.Printf("💀 Game Over an JavaScript gesendet: Score=%d", score)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user