summaryrefslogtreecommitdiff
path: root/engine/Components
diff options
context:
space:
mode:
Diffstat (limited to 'engine/Components')
-rw-r--r--engine/Components/Player.go62
-rw-r--r--engine/Components/World.go18
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()