Started implementing cameras rotating point.

This commit is contained in:
Andrey Parhomenko 2023-02-18 17:38:28 +05:00
parent e3e84b4f23
commit 02a6cc3e88
5 changed files with 37 additions and 9 deletions

View file

@ -26,9 +26,8 @@ func NewPlayer() *Player {
Sprite: &gx.Sprite{ Sprite: &gx.Sprite{
Object: &gx.Object{ Object: &gx.Object{
T: gx.Transform { T: gx.Transform {
P: gx.Vector{100, 150},
S: gx.Vector{5, 5}, S: gx.Vector{5, 5},
RA: gx.Vector{200, 200}, RA: gx.Vector{320, 240},
}, },
}, },
Image: playerImg, Image: playerImg,
@ -38,6 +37,9 @@ func NewPlayer() *Player {
} }
} }
func (p *Player) Start(e *gx.Engine) {
}
func (p *Player) Update(e *gx.Engine) error { func (p *Player) Update(e *gx.Engine) error {
dt := e.DT() dt := e.DT()
c := e.Camera() c := e.Camera()
@ -76,6 +78,18 @@ func (p *Player) Update(e *gx.Engine) error {
} else { } else {
c.Object.T.S.Y += gx.Pi * p.ScaleSpeed * dt c.Object.T.S.Y += gx.Pi * p.ScaleSpeed * dt
} }
case ebiten.KeyZ :
if e.KeyIsPressed(ebiten.KeyShift) {
c.Object.T.RA.X -= gx.Pi * p.MoveSpeed * dt
} else {
c.Object.T.RA.X += gx.Pi * p.MoveSpeed * dt
}
case ebiten.KeyX :
if e.KeyIsPressed(ebiten.KeyShift) {
c.Object.T.RA.Y -= gx.Pi * p.MoveSpeed * dt
} else {
c.Object.T.RA.Y += gx.Pi * p.MoveSpeed * dt
}
}} }}
return nil return nil

View file

@ -18,7 +18,10 @@ const (
// position, scale and rotation to apply // position, scale and rotation to apply
// it to the objects to get the real // it to the objects to get the real
// transform to display on the screen. // transform to display on the screen.
func (c *Camera)Matrix(scale bool) Matrix { func (c *Camera)RealMatrix(
e *Engine,
scale bool,
) Matrix {
g := &Matrix{} g := &Matrix{}
// For rotating around. // For rotating around.
@ -27,12 +30,16 @@ func (c *Camera)Matrix(scale bool) Matrix {
c.Object.T.RA.Y, c.Object.T.RA.Y,
) )
g.Rotate(c.Object.T.R)
g.Translate( g.Translate(
-c.Object.T.P.X, -c.Object.T.P.X,
c.Object.T.P.Y, c.Object.T.P.Y,
) )
g.Rotate(-c.Object.T.R)
g.Translate(
c.Object.T.RA.X,
-c.Object.T.RA.Y,
)
if scale { if scale {
g.Scale( g.Scale(

View file

@ -33,6 +33,10 @@ func (e *Engine) Camera() *Camera {
return e.camera return e.camera
} }
func (e *Engine) SetCamera(c *Camera) {
e.camera = c
}
func (e *Engine) Keys() []Key { func (e *Engine) Keys() []Key {
return e.keys return e.keys
} }
@ -50,7 +54,6 @@ func New(
Object: &Object{ Object: &Object{
T: Transform{ T: Transform{
S: Vector{1, 1}, S: Vector{1, 1},
RA: Vector{480, 320},
}, },
}, },
}, },
@ -121,6 +124,7 @@ func (e *engine) Layout(ow, oh int) (int, int) {
if e.wcfg.FixedSize { if e.wcfg.FixedSize {
return e.wcfg.Width, e.wcfg.Height return e.wcfg.Width, e.wcfg.Height
} }
return ow, oh return ow, oh
} }

View file

@ -15,10 +15,13 @@ func (s *Sprite) Draw(
i *Image, i *Image,
) { ) {
op := &ebiten.DrawImageOptions{} op := &ebiten.DrawImageOptions{}
m := s.Object.T.Matrix() m := s.Object.T.Matrix(e)
if e.camera != nil { if e.camera != nil {
m.Concat(e.camera.Matrix(true)) m.Concat(e.camera.RealMatrix(
e,
true,
))
} }
op.GeoM = m op.GeoM = m

View file

@ -25,7 +25,7 @@ func T() Transform {
// Returns the GeoM with corresponding // Returns the GeoM with corresponding
// to the transfrom transformation // to the transfrom transformation
func (t Transform)Matrix() Matrix { func (t Transform)Matrix(e *Engine) Matrix {
g := &Matrix{} g := &Matrix{}
g.Scale(t.S.X, t.S.Y) g.Scale(t.S.X, t.S.Y)