110 lines
2.5 KiB
Go
110 lines
2.5 KiB
Go
|
|
package gameelement
|
||
|
|
|
||
|
|
import (
|
||
|
|
"math"
|
||
|
|
"math/rand/v2"
|
||
|
|
"mover/elements"
|
||
|
|
"mover/gamedata"
|
||
|
|
|
||
|
|
"github.com/hajimehoshi/ebiten/v2"
|
||
|
|
)
|
||
|
|
|
||
|
|
type CloudLayer struct {
|
||
|
|
Sprite *ebiten.Image
|
||
|
|
clouds []*elements.Cloud
|
||
|
|
dimensions gamedata.Area
|
||
|
|
cycle int
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewCloudLayer(a gamedata.Area) *CloudLayer {
|
||
|
|
c := &CloudLayer{
|
||
|
|
Sprite: ebiten.NewImage(a.Width, a.Height),
|
||
|
|
cycle: 0,
|
||
|
|
dimensions: a,
|
||
|
|
}
|
||
|
|
return c
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CloudLayer) SetInputs(gamedata.GameInputs) {
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CloudLayer) Update() error {
|
||
|
|
c.cycle++
|
||
|
|
|
||
|
|
for _, cloud := range c.clouds {
|
||
|
|
cloud.Update()
|
||
|
|
|
||
|
|
cpos := cloud.GetPosition()
|
||
|
|
if cpos.X > float64(c.dimensions.Width)+float64(cloud.Sprite.Bounds().Dx()) {
|
||
|
|
dx := -float64(cloud.Sprite.Bounds().Dx())
|
||
|
|
cloud.SetPosition(gamedata.Coordinates{X: dx, Y: cloud.GetPosition().Y})
|
||
|
|
}
|
||
|
|
if cpos.X < -float64(cloud.Sprite.Bounds().Dx()) {
|
||
|
|
dx := float64(c.dimensions.Width + cloud.Sprite.Bounds().Dx())
|
||
|
|
cloud.SetPosition(gamedata.Coordinates{X: dx, Y: cloud.GetPosition().Y})
|
||
|
|
}
|
||
|
|
if cpos.Y > float64(c.dimensions.Height)+float64(cloud.Sprite.Bounds().Dy()) {
|
||
|
|
dy := -float64(cloud.Sprite.Bounds().Dy())
|
||
|
|
cloud.SetPosition(gamedata.Coordinates{X: cloud.GetPosition().X, Y: dy})
|
||
|
|
}
|
||
|
|
if cpos.Y < -float64(cloud.Sprite.Bounds().Dy()) {
|
||
|
|
dy := float64(c.dimensions.Height + cloud.Sprite.Bounds().Dy())
|
||
|
|
cloud.SetPosition(gamedata.Coordinates{X: cloud.GetPosition().X, Y: dy})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CloudLayer) Draw(drawimg *ebiten.Image) {
|
||
|
|
c.Sprite.Clear()
|
||
|
|
|
||
|
|
for _, cloud := range c.clouds {
|
||
|
|
cloud.Draw()
|
||
|
|
op := &ebiten.DrawImageOptions{}
|
||
|
|
op.GeoM.Translate(cloud.GetPosition().X, cloud.GetPosition().Y)
|
||
|
|
op.ColorScale.ScaleAlpha(float32(cloud.Alpha))
|
||
|
|
c.Sprite.DrawImage(cloud.Sprite, op)
|
||
|
|
}
|
||
|
|
|
||
|
|
drawimg.DrawImage(c.Sprite, nil)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CloudLayer) Initialize() {
|
||
|
|
|
||
|
|
//cull previous cloud layer
|
||
|
|
for i := 0; i < len(c.clouds); i++ {
|
||
|
|
c.clouds[i] = nil
|
||
|
|
}
|
||
|
|
c.clouds = c.clouds[:0]
|
||
|
|
|
||
|
|
numclouds := rand.IntN(20)
|
||
|
|
angle := rand.Float64() * math.Pi * 2
|
||
|
|
|
||
|
|
for i := 0; i < numclouds; i++ {
|
||
|
|
|
||
|
|
a := gamedata.Area{
|
||
|
|
Height: rand.IntN(c.dimensions.Width/2) + 1,
|
||
|
|
Width: rand.IntN(c.dimensions.Height/2) + 1,
|
||
|
|
}
|
||
|
|
|
||
|
|
velocity := rand.Float64() * 3
|
||
|
|
//velocity := 0.
|
||
|
|
|
||
|
|
newcloud := elements.NewCloud(a, angle, velocity)
|
||
|
|
|
||
|
|
newcloud.Alpha = rand.Float64() / 2
|
||
|
|
|
||
|
|
newcloud.SetPosition(gamedata.Coordinates{
|
||
|
|
X: rand.Float64() * float64(c.dimensions.Width),
|
||
|
|
Y: rand.Float64() * float64(c.dimensions.Height),
|
||
|
|
})
|
||
|
|
|
||
|
|
c.clouds = append(c.clouds, newcloud)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (c *CloudLayer) RegisterEvents(e gamedata.GameEvent, f func()) {
|
||
|
|
|
||
|
|
}
|