diff options
| author | Physcik <mynameisgennadiy@vk.com> | 2026-01-23 01:15:37 +0500 |
|---|---|---|
| committer | Physcik <mynameisgennadiy@vk.com> | 2026-01-23 01:15:37 +0500 |
| commit | 7a0c4891275c913c23469d42bb1c3e0e9ca35cf8 (patch) | |
| tree | 7e5e4db1966532722a2eeb656e0f7b7fdf7c6a82 /engine/Components | |
| parent | 2cf8b5cad01cb67b71d51834ca8d048cfddd69e6 (diff) | |
Colliders
Diffstat (limited to 'engine/Components')
| -rw-r--r-- | engine/Components/Player.go | 62 | ||||
| -rw-r--r-- | engine/Components/World.go | 18 |
2 files changed, 69 insertions, 11 deletions
diff --git a/engine/Components/Player.go b/engine/Components/Player.go index 38a4636..cb8d459 100644 --- a/engine/Components/Player.go +++ b/engine/Components/Player.go @@ -1,50 +1,90 @@ package components import ( + "fmt" + coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" + settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" rl "github.com/gen2brain/raylib-go/raylib" ) type Player struct { + ParentScene *World Position rl.Vector2 + FaceDirection coreobjects.Direction Texture rl.Texture2D + + Collider coreobjects.Collider +} + +func (base *Player) Init(manager coreobjects.SceneManager) { + if err := base.setParentScene(manager); err != nil { + panic(err.Error()) + } + base.Collider = (&coreobjects.BoxCollider{}).Init( + base.Position.X, + base.Position.Y, + 32, 32) // TODO: Change this to player description } -func (base *Player) Create(_ coreobjects.SceneManager) { +// Tries to set a parent scene as a world and returns an error if failed +func (base *Player) setParentScene(manager coreobjects.SceneManager) error { + var baseScene, ok = manager.SelectedScene.(*World) + if !ok { + return fmt.Errorf( "Failed to create a player instance: the base scene is not a playable world (assertion failed)") + } + base.ParentScene = baseScene + return nil } func (base *Player) Destroy() { } +func (base *Player) Move(delta rl.Vector2) { + var newLocation = rl.Vector2Add(base.Position, delta) + if !base.Collider.CanMove(base.ParentScene.GetStaticColliders(), + newLocation.X, newLocation.Y) { + return + } + base.Collider.MoveTo(newLocation.X, newLocation.Y) + base.Position = newLocation +} + func (base *Player) Update() { var speed = 150 * rl.GetFrameTime() + var delta = rl.Vector2{} if rl.IsKeyDown(rl.KeyW) { - base.Position.Y -= speed + delta.Y -= speed } if rl.IsKeyDown(rl.KeyS) { - base.Position.Y += speed + delta.Y += speed } if rl.IsKeyDown(rl.KeyA) { - base.Position.X -= speed + delta.X -= speed } if rl.IsKeyDown(rl.KeyD) { - base.Position.X += speed + delta.X += speed } + base.Move(delta) } func (base *Player) Draw() { rl.DrawTexture(base.Texture, - int32(base.Position.X), - int32(base.Position.Y), - rl.White) + int32(base.Position.X), + int32(base.Position.Y), + rl.White) + if settings.State.DrawColliders { + base.Collider.Draw() + } } -func (base Player) SnapCamera (camera *rl.Camera2D) { +// Centers the camera center to the player +func (base Player) SnapCamera(camera *rl.Camera2D) { var offset = rl.Vector2 { X: float32(base.Texture.Width) / 2, Y: float32(base.Texture.Height) / 2, } camera.Target = rl.Vector2Add(base.Position, offset) - camera.Offset.X = float32(rl.GetScreenWidth()) / 2 - camera.Offset.Y = float32(rl.GetScreenHeight()) / 2 + camera.Offset.X = float32(int32(rl.GetScreenWidth() / 2)) + camera.Offset.Y = float32(int32(rl.GetScreenHeight() / 2)) } diff --git a/engine/Components/World.go b/engine/Components/World.go index 7e6e8e3..2b7954a 100644 --- a/engine/Components/World.go +++ b/engine/Components/World.go @@ -14,13 +14,20 @@ type World struct { Player *Player Camera *rl.Camera2D + + // ========== 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) } func (base *World) Destroy() { + base.Player.Destroy() } func (base *World) Update() { @@ -34,6 +41,17 @@ func (base *World) handleZoom() { base.Camera.Zoom += zoomSpeed * rl.GetMouseWheelMove() } +func (base *World) collectStaticColliders() { + base.staticColliders = make([]*coreobjects.Collider, 0) +} + +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() |
