package components import ( coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" rl "github.com/gen2brain/raylib-go/raylib" ) // The scene implimetation that represents one playable scene type World struct { Manager coreobjects.SceneManager Name string Floor []FloorTile StaticObjects []coreobjects.GameObject Player *Player Camera *rl.Camera2D layersStatic layering // ========== Cache ========== // the collection of the colliders that belong to static objects - world, buildings, etc staticColliders []*coreobjects.Collider } func (base *World) Create(manager coreobjects.SceneManager) { base.Manager = manager base.Player.Init(manager) for _, v := range base.StaticObjects { v.Init(manager) } base.layersStatic = layering{} base.generateStaticLayers() } func (base *World) Destroy() { base.Player.Destroy() } func (base *World) Update() { for _, v := range base.StaticObjects { v.Update() } base.Player.Update() base.Player.SnapCamera(base.Camera) base.handleZoom() } func (base *World) handleZoom() { var zoomSpeed = 50 * rl.GetFrameTime() base.Camera.Zoom += zoomSpeed * rl.GetMouseWheelMove() } func (base *World) collectStaticColliders() { base.staticColliders = make([]*coreobjects.Collider, 0) for _, obj := range base.StaticObjects { for _, v := range obj.GetColliders() { base.staticColliders = append(base.staticColliders, &v) } } } func (base *World) GetStaticColliders() []*coreobjects.Collider { if base.staticColliders == nil { base.collectStaticColliders() } return base.staticColliders } func (base *World) Draw() { rl.BeginMode2D(*base.Camera) defer rl.EndMode2D() for _, v := range base.Floor { v.Draw() } base.drawObjects() } func (base *World) drawObjects() { var playerDrawn = false var layer = base.layersStatic.firstLayer var i = 0 for { if layer == nil { break } if !playerDrawn && base.Player.Position.Y < layer.Index { playerDrawn = true base.Player.Draw() } for _, v := range layer.Objects { v.Draw() } layer = layer.Next() i++ } // Ensure that the player was drawn if !playerDrawn { base.Player.Draw() } } func (base *World) generateStaticLayers() { for _, v := range base.StaticObjects { base.layersStatic.Insert(v) } } func (base *World) GetMousePosition() rl.Vector2 { return rl.GetScreenToWorld2D(rl.GetMousePosition(), *base.Camera) } // The single texture drawn at level 0 of the world type FloorTile struct { Position rl.Vector2 Texture *rl.Texture2D } func (base *FloorTile) Draw() { rl.DrawTexture( *base.Texture, int32(base.Position.X), int32(base.Position.Y), rl.White, ) }