package main import ( "log" rl "github.com/gen2brain/raylib-go/raylib" ) var ( cameraDistance = float32(20.0) cameraYaw = float32(145.0) cameraPitch = float32(45.0) // Adjusted for a more overhead view mapGrid = InitMap() ) func main() { rl.InitWindow(1024, 768, "GoonScape") defer rl.CloseWindow() rl.InitAudioDevice() defer rl.CloseAudioDevice() player := Player{ PosActual: rl.NewVector3(5*TileSize, 0, 5*TileSize), PosTile: mapGrid[5][5], Speed: 50.0, TargetPath: []Tile{}, } camera := rl.Camera3D{ Position: rl.NewVector3(0, 10, 10), // Will be updated every frame Target: player.PosActual, Up: rl.NewVector3(0, 1, 0), // Y is up in 3D Fovy: 45.0, Projection: rl.CameraPerspective, } conn, playerID, err := ConnectToServer() if err != nil { log.Fatalf("Failed to connect to server: %v", err) } log.Printf("Player ID: %d", playerID) player.ID = playerID defer conn.Close() otherPlayers := make(map[int32]*Player) go HandleServerCommunication(conn, playerID, &player, otherPlayers) models, err := LoadModels() if err != nil { log.Fatalf("Failed to load models: %v", err) } defer UnloadModels(models) modelIndex := int(playerID) % len(models) player.Model = models[modelIndex].Model player.Texture = models[modelIndex].Texture music, err := LoadMusic("resources/audio/GoonScape2.mp3") if err != nil { log.Fatalf("Failed to load music: %v", err) } defer UnloadMusic(music) rl.PlayMusicStream(music) rl.SetMusicVolume(music, 0.5) rl.SetTargetFPS(60) for !rl.WindowShouldClose() { rl.UpdateMusicStream(music) // Time management deltaTime := rl.GetFrameTime() // Handle input HandleInput(&player, &camera) // Update player if len(player.TargetPath) > 0 { player.MoveTowards(player.TargetPath[0], deltaTime) } // Update camera UpdateCamera(&camera, player.PosActual, deltaTime) // Rendering rl.BeginDrawing() rl.ClearBackground(rl.RayWhite) rl.BeginMode3D(camera) DrawMap() DrawPlayer(&player, player.Model) for id, other := range otherPlayers { if len(other.TargetPath) > 0 { other.MoveTowards(other.TargetPath[0], deltaTime) } DrawPlayer(other, models[int(id)%len(models)].Model) } rl.EndMode3D() rl.DrawFPS(10, 10) rl.EndDrawing() } } func LoadModels() ([]struct { Model rl.Model Texture rl.Texture2D }, error) { goonerModel := rl.LoadModel("resources/models/goonion.obj") goonerTexture := rl.LoadTexture("resources/models/goonion.png") rl.SetMaterialTexture(goonerModel.Materials, rl.MapDiffuse, goonerTexture) coomerModel := rl.LoadModel("resources/models/coomer.obj") coomerTexture := rl.LoadTexture("resources/models/coomer.png") rl.SetMaterialTexture(coomerModel.Materials, rl.MapDiffuse, coomerTexture) shrekeModel := rl.LoadModel("resources/models/shreke.obj") shrekeTexture := rl.LoadTexture("resources/models/shreke.png") rl.SetMaterialTexture(shrekeModel.Materials, rl.MapDiffuse, shrekeTexture) return []struct { Model rl.Model Texture rl.Texture2D }{ {Model: goonerModel, Texture: goonerTexture}, {Model: coomerModel, Texture: coomerTexture}, {Model: shrekeModel, Texture: shrekeTexture}, }, nil } func UnloadModels(models []struct { Model rl.Model Texture rl.Texture2D }) { for _, model := range models { rl.UnloadModel(model.Model) rl.UnloadTexture(model.Texture) } } func LoadMusic(filename string) (rl.Music, error) { music := rl.LoadMusicStream(filename) return music, nil } func UnloadMusic(music rl.Music) { rl.UnloadMusicStream(music) }