goonscape/main.go

151 lines
3.5 KiB
Go
Raw Normal View History

2024-09-30 10:04:38 +02:00
package main
import (
2024-10-11 14:47:52 +02:00
"log"
2024-09-30 10:04:38 +02:00
rl "github.com/gen2brain/raylib-go/raylib"
2024-09-30 15:34:16 +02:00
)
var (
2024-10-01 11:56:42 +02:00
cameraDistance = float32(20.0)
cameraYaw = float32(145.0)
2024-10-01 21:38:39 +02:00
cameraPitch = float32(45.0) // Adjusted for a more overhead view
mapGrid = InitMap()
2024-09-30 15:34:16 +02:00
)
func main() {
2024-10-03 11:53:36 +02:00
rl.InitWindow(1024, 768, "GoonScape")
2024-09-30 15:34:16 +02:00
defer rl.CloseWindow()
2024-10-01 21:59:29 +02:00
rl.InitAudioDevice()
defer rl.CloseAudioDevice()
2024-09-30 15:34:16 +02:00
player := Player{
2024-10-01 21:38:39 +02:00
PosActual: rl.NewVector3(5*TileSize, 0, 5*TileSize),
PosTile: mapGrid[5][5],
Speed: 50.0,
TargetPath: []Tile{},
2024-09-30 15:34:16 +02:00
}
camera := rl.Camera3D{
2024-10-01 21:38:39 +02:00
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,
2024-09-30 15:34:16 +02:00
}
2024-10-11 14:47:52 +02:00
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
2024-10-11 14:47:52 +02:00
defer conn.Close()
otherPlayers := make(map[int32]*Player)
go HandleServerCommunication(conn, playerID, &player, otherPlayers)
2024-10-11 14:47:52 +02:00
2024-10-31 01:06:39 +01:00
models, err := LoadModels()
if err != nil {
log.Fatalf("Failed to load models: %v", err)
2024-10-11 15:58:09 +02:00
}
2024-10-31 01:06:39 +01:00
defer UnloadModels(models)
2024-10-11 15:58:09 +02:00
modelIndex := int(playerID) % len(models)
player.Model = models[modelIndex].Model
player.Texture = models[modelIndex].Texture
2024-10-31 01:06:39 +01:00
music, err := LoadMusic("resources/audio/GoonScape2.mp3")
if err != nil {
log.Fatalf("Failed to load music: %v", err)
}
defer UnloadMusic(music)
2024-10-01 21:59:29 +02:00
rl.PlayMusicStream(music)
rl.SetMusicVolume(music, 0.5)
2024-10-31 01:06:39 +01:00
rl.SetTargetFPS(60)
2024-10-01 21:59:29 +02:00
2024-09-30 15:34:16 +02:00
for !rl.WindowShouldClose() {
2024-10-11 14:47:52 +02:00
2024-10-01 21:59:29 +02:00
rl.UpdateMusicStream(music)
2024-10-01 21:38:39 +02:00
// Time management
2024-09-30 15:34:16 +02:00
deltaTime := rl.GetFrameTime()
2024-10-01 21:38:39 +02:00
// Handle input
HandleInput(&player, &camera)
2024-09-30 15:34:16 +02:00
2024-10-01 21:38:39 +02:00
// Update player
if len(player.TargetPath) > 0 {
player.MoveTowards(player.TargetPath[0], deltaTime)
2024-09-30 15:34:16 +02:00
}
2024-10-01 21:38:39 +02:00
// Update camera
UpdateCamera(&camera, player.PosActual, deltaTime)
2024-09-30 15:34:16 +02:00
2024-10-01 21:38:39 +02:00
// Rendering
2024-09-30 15:34:16 +02:00
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
rl.BeginMode3D(camera)
DrawMap()
2025-01-13 10:00:23 +01:00
DrawPlayer(&player, player.Model)
2024-10-03 10:05:37 +02:00
for id, other := range otherPlayers {
2024-10-31 01:06:39 +01:00
if len(other.TargetPath) > 0 {
other.MoveTowards(other.TargetPath[0], deltaTime)
}
2025-01-13 10:00:23 +01:00
DrawPlayer(other, models[int(id)%len(models)].Model)
}
2024-10-02 14:46:36 +02:00
2024-09-30 15:34:16 +02:00
rl.EndMode3D()
rl.DrawFPS(10, 10)
2024-09-30 15:34:16 +02:00
rl.EndDrawing()
}
}
2024-10-31 01:06:39 +01:00
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)
2024-10-11 14:47:52 +02:00
2024-10-31 01:06:39 +01:00
coomerModel := rl.LoadModel("resources/models/coomer.obj")
coomerTexture := rl.LoadTexture("resources/models/coomer.png")
rl.SetMaterialTexture(coomerModel.Materials, rl.MapDiffuse, coomerTexture)
2024-10-31 01:06:39 +01:00
shrekeModel := rl.LoadModel("resources/models/shreke.obj")
shrekeTexture := rl.LoadTexture("resources/models/shreke.png")
rl.SetMaterialTexture(shrekeModel.Materials, rl.MapDiffuse, shrekeTexture)
2024-10-11 14:47:52 +02:00
2024-10-31 01:06:39 +01:00
return []struct {
Model rl.Model
Texture rl.Texture2D
}{
{Model: goonerModel, Texture: goonerTexture},
{Model: coomerModel, Texture: coomerTexture},
{Model: shrekeModel, Texture: shrekeTexture},
}, nil
2024-09-30 10:04:38 +02:00
}
2024-10-31 01:06:39 +01:00
func UnloadModels(models []struct {
Model rl.Model
Texture rl.Texture2D
}) {
for _, model := range models {
rl.UnloadModel(model.Model)
rl.UnloadTexture(model.Texture)
2024-09-30 10:04:38 +02:00
}
}
2024-10-31 01:06:39 +01:00
func LoadMusic(filename string) (rl.Music, error) {
music := rl.LoadMusicStream(filename)
return music, nil
2024-09-30 10:04:38 +02:00
}
2024-10-31 01:06:39 +01:00
func UnloadMusic(music rl.Music) {
rl.UnloadMusicStream(music)
2024-09-30 10:04:38 +02:00
}