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
|
2024-10-11 22:47:47 +02:00
|
|
|
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)
|
2024-10-11 22:47:47 +02:00
|
|
|
player.ID = playerID
|
2024-10-11 14:47:52 +02:00
|
|
|
defer conn.Close()
|
|
|
|
|
2024-10-11 22:47:47 +02:00
|
|
|
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
|
2024-10-11 22:47:47 +02:00
|
|
|
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 {
|
2024-10-11 22:47:47 +02:00
|
|
|
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)
|
2024-10-11 22:47:47 +02:00
|
|
|
DrawMap()
|
2025-01-13 10:00:23 +01:00
|
|
|
DrawPlayer(&player, player.Model)
|
2024-10-03 10:05:37 +02:00
|
|
|
|
2024-10-11 22:47:47 +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-11 22:47:47 +02:00
|
|
|
}
|
2024-10-02 14:46:36 +02:00
|
|
|
|
2024-09-30 15:34:16 +02:00
|
|
|
rl.EndMode3D()
|
2024-10-11 22:47:47 +02:00
|
|
|
rl.DrawFPS(10, 10)
|
2024-09-30 15:34:16 +02:00
|
|
|
rl.EndDrawing()
|
|
|
|
}
|
|
|
|
}
|
2024-10-11 22:47:47 +02:00
|
|
|
|
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-11 22:47:47 +02:00
|
|
|
|
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
|
|
|
}
|