goonscape/main.go
2024-10-31 01:06:39 +01:00

151 lines
3.5 KiB
Go

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)
}