package main import ( "fmt" "slices" "strings" rl "github.com/gen2brain/raylib-go/raylib" "github.com/gocolly/colly" ) func main() { c := colly.NewCollector() var links []string var texts []string c.OnHTML("a[href]", func(e *colly.HTMLElement) { link := e.Attr("href") fmt.Printf("Link found: %q -> %s\n", e.Text, link) if strings.Contains(link, "http") { links = append(links, link) } }) c.OnHTML("div", func(h *colly.HTMLElement) { if !slices.Contains(texts, h.Text) { //fmt.Printf(h.Text) texts = append(texts, h.Text) } }) c.OnRequest(func(r *colly.Request) { fmt.Println("Visiting", r.URL.String()) }) rl.InitWindow(800, 450, "raylib [core] example - 3d camera first person") camera := rl.Camera3D{} camera.Position = rl.NewVector3(4.0, 2.0, 4.0) camera.Target = rl.NewVector3(0.0, 0.5, 0.0) camera.Up = rl.NewVector3(0.0, 1.0, 0.0) camera.Fovy = 60.0 camera.Projection = rl.CameraPerspective cubeScreenPosition := rl.Vector2{} // Generates some random columns var total int var positions []rl.Vector3 var positions2D []rl.Vector2 var t_total int var t_positions []rl.Vector3 t_position2D := rl.NewVector2(0, 0) rl.SetTargetFPS(60) rl.DisableCursor() collision := "https://alfrescocavern.com/" t_collision := "" for !rl.WindowShouldClose() { if collision != "" { links = nil positions = nil positions2D = nil texts = nil t_positions = nil t_position2D = rl.NewVector2(0, 0) links = make([]string, 0) texts = make([]string, 0) c.Visit(collision) total = len(links) positions = make([]rl.Vector3, total) positions2D = make([]rl.Vector2, total) for i := 0; i < total; i++ { positions[i] = rl.NewVector3(float32(rl.GetRandomValue(-50, 50)), 0.5, float32(rl.GetRandomValue(-50, 50))) } t_total = len(texts) t_positions = make([]rl.Vector3, t_total) for i := 0; i < t_total; i++ { t_positions[i] = rl.NewVector3(float32(rl.GetRandomValue(-50, 50)), 0.5, float32(rl.GetRandomValue(-50, 50))) } collision = "" } rl.UpdateCamera(&camera, rl.CameraThirdPerson) // Update camera with first person mode rl.BeginDrawing() rl.ClearBackground(rl.RayWhite) rl.BeginMode3D(camera) cubeScreenPosition = rl.GetWorldToScreen(rl.NewVector3(camera.Target.X, camera.Target.Y+1.0, camera.Target.Z), camera) for i := 0; i < total; i++ { rl.DrawCube(positions[i], 1.0, 1.0, 1.0, rl.Maroon) pos := rl.NewVector3(positions[i].X, positions[i].Y+1.0, positions[i].Z) positions2D[i] = rl.GetWorldToScreen(pos, camera) // Check collisions player vs enemy-box if rl.CheckCollisionBoxes( rl.NewBoundingBox( rl.NewVector3(camera.Target.X-0.5, camera.Target.Y-0.5, camera.Target.Z-0.5), rl.NewVector3(camera.Target.X+0.5, camera.Target.Y+0.5, camera.Target.Z+0.5)), rl.NewBoundingBox( rl.NewVector3(positions[i].X-0.5, positions[i].Y-0.5, positions[i].Z-0.5), rl.NewVector3(positions[i].X+0.5, positions[i].Y+0.5, positions[i].Z+0.5)), ) { collision = links[i] } } for i := 0; i < t_total; i++ { rl.DrawCube(t_positions[i], 1.0, 1.0, 1.0, rl.Blue) if rl.CheckCollisionBoxes( rl.NewBoundingBox( rl.NewVector3(camera.Target.X-0.5, camera.Target.Y-0.5, camera.Target.Z-0.5), rl.NewVector3(camera.Target.X+0.5, camera.Target.Y+0.5, camera.Target.Z+0.5)), rl.NewBoundingBox( rl.NewVector3(t_positions[i].X-0.5, t_positions[i].Y-0.5, t_positions[i].Z-0.5), rl.NewVector3(t_positions[i].X+0.5, t_positions[i].Y+0.5, t_positions[i].Z+0.5)), ) { t_collision = texts[i] pos := rl.NewVector3(t_positions[i].X, t_positions[i].Y+1.0, t_positions[i].Z) t_position2D = rl.GetWorldToScreen(pos, camera) } } rl.DrawPlane(rl.NewVector3(0.0, 0.0, 0.0), rl.NewVector2(60.0, 60.0), rl.LightGray) // Draw ground rl.DrawCube(camera.Target, 1.0, 1.0, 1.0, rl.Green) rl.EndMode3D() rl.DrawText("User", int32(cubeScreenPosition.X)-rl.MeasureText("User", 20)/2, int32(cubeScreenPosition.Y), 20, rl.Black) for i := 0; i < len(links); i++ { rl.DrawText(links[i], int32(positions2D[i].X)-rl.MeasureText(links[i], 10)/2, int32(positions2D[i].Y), 10, rl.Maroon) } if t_collision != "" { rl.DrawText(t_collision, int32(t_position2D.X)-rl.MeasureText(t_collision, 10)/2, int32(t_position2D.Y+10), 10, rl.Blue) } rl.EndDrawing() } rl.EnableCursor() rl.CloseWindow() }