Parallax Background

parallax.go
  1package main
  2
  3import (
  4 "embed"
  5 "log"
  6
  7 "github.com/TheBitDrifter/bappa/blueprint"
  8 "github.com/TheBitDrifter/bappa/coldbrew"
  9 "github.com/TheBitDrifter/bappa/coldbrew/coldbrew_clientsystems"
 10 "github.com/TheBitDrifter/bappa/coldbrew/coldbrew_rendersystems"
 11
 12 "github.com/TheBitDrifter/bappa/warehouse"
 13)
 14
 15//go:embed assets/*
 16var assets embed.FS
 17
 18func main() {
 19 client := coldbrew.NewClient(
 20  640,
 21  360,
 22  10,
 23  10,
 24  10,
 25  assets,
 26 )
 27
 28 client.SetTitle("Rendering Parallax Background")
 29
 30 err := client.RegisterScene(
 31  "Example Scene",
 32  640,
 33  360,
 34  exampleScenePlan,
 35  []coldbrew.RenderSystem{},
 36  []coldbrew.ClientSystem{
 37   &coldbrew_clientsystems.BackgroundScrollSystem{},
 38   &cameraMovementSystem{},
 39  },
 40  []blueprint.CoreSystem{},
 41 )
 42 if err != nil {
 43  log.Fatal(err)
 44 }
 45
 46 client.RegisterGlobalRenderSystem(coldbrew_rendersystems.GlobalRenderer{})
 47
 48 client.ActivateCamera()
 49
 50 if err := client.Start(); err != nil {
 51  log.Fatal(err)
 52 }
 53}
 54
 55func exampleScenePlan(height, width int, sto warehouse.Storage) error {
 56 // Use 0.0 and a single layer if you want a still background
 57 err := blueprint.NewParallaxBackgroundBuilder(sto).
 58  AddLayer("sky.png", 0.1, 0.1).
 59  AddLayer("far.png", 0.3, 0.3).
 60  AddLayer("mid.png", 0.4, 0.4).
 61  AddLayer("near.png", 0.8, 0.8).
 62  Build()
 63 if err != nil {
 64  return err
 65 }
 66 return nil
 67}
 68
 69type cameraMovementSystem struct {
 70 flipX bool
 71 flipY bool
 72}
 73
 74func (sys *cameraMovementSystem) Run(cli coldbrew.LocalClient, scene coldbrew.Scene) error {
 75 cam := cli.ActiveCamerasFor(scene)[0]
 76 _, cameraPositionInScene := cam.Positions()
 77
 78 if cameraPositionInScene.X > 640 {
 79  sys.flipX = true
 80 } else if cameraPositionInScene.X < 0 {
 81  sys.flipX = false
 82 }
 83
 84 if cameraPositionInScene.Y > 100 {
 85  sys.flipY = true
 86 } else if cameraPositionInScene.Y < 0 {
 87  sys.flipY = false
 88 }
 89
 90 if !sys.flipX {
 91  cameraPositionInScene.X += 2
 92 } else {
 93  cameraPositionInScene.X -= 2
 94 }
 95
 96 if !sys.flipY {
 97  cameraPositionInScene.Y += 2
 98 } else {
 99  cameraPositionInScene.Y -= 2
100 }
101
102 return nil
103}