Split Screen

splitscreen.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 client.SetTitle("Split Screen Camera")
 28 err := client.RegisterScene(
 29  "Example Scene",
 30  640,
 31  360,
 32  exampleScenePlan,
 33  []coldbrew.RenderSystem{},
 34  []coldbrew.ClientSystem{
 35   &coldbrew_clientsystems.BackgroundScrollSystem{},
 36   &cameraMovementSystem{},
 37  },
 38  []blueprint.CoreSystem{},
 39 )
 40 if err != nil {
 41  log.Fatal(err)
 42 }
 43 client.RegisterGlobalRenderSystem(coldbrew_rendersystems.GlobalRenderer{})
 44
 45 client.SetCameraBorderSize(6)
 46
 47 quarterWidth := 640 / 2
 48 quarterHeight := 360 / 2
 49 cam1, err := client.ActivateCamera()
 50 if err != nil {
 51  log.Fatal(err)
 52 }
 53 cam2, err := client.ActivateCamera()
 54 if err != nil {
 55  log.Fatal(err)
 56 }
 57 cam3, err := client.ActivateCamera()
 58 if err != nil {
 59  log.Fatal(err)
 60 }
 61 cam4, err := client.ActivateCamera()
 62 if err != nil {
 63  log.Fatal(err)
 64 }
 65 cam1.SetDimensions(quarterWidth, quarterHeight)
 66 cam2.SetDimensions(quarterWidth, quarterHeight)
 67 cam3.SetDimensions(quarterWidth, quarterHeight)
 68 cam4.SetDimensions(quarterWidth, quarterHeight)
 69 cam1Pos, _ := cam1.Positions()
 70 cam1Pos.X = 0
 71 cam1Pos.Y = 0
 72 cam2Pos, cam2ScenePos := cam2.Positions()
 73 cam2Pos.X = float64(quarterWidth)
 74 cam2Pos.Y = 0
 75 cam2ScenePos.Y = 240
 76 cam3Pos, cam3ScenePos := cam3.Positions()
 77 cam3Pos.X = 0
 78 cam3Pos.Y = float64(quarterHeight)
 79 cam3ScenePos.Y = 160
 80 cam4Pos, cam4ScenePos := cam4.Positions()
 81 cam4Pos.X = float64(quarterWidth)
 82 cam4Pos.Y = float64(quarterHeight)
 83 cam4ScenePos.Y = 80
 84 if err := client.Start(); err != nil {
 85  log.Fatal(err)
 86 }
 87}
 88
 89func exampleScenePlan(height, width int, sto warehouse.Storage) error {
 90 err := blueprint.NewParallaxBackgroundBuilder(sto).
 91  AddLayer("sky.png", 0.1, 0.1).
 92  AddLayer("far.png", 0.3, 0.3).
 93  AddLayer("mid.png", 0.4, 0.4).
 94  AddLayer("near.png", 0.8, 0.8).
 95  Build()
 96 if err != nil {
 97  return err
 98 }
 99 return nil
100}
101
102type cameraMovementSystem struct {
103 flipX bool
104}
105
106func (sys *cameraMovementSystem) Run(cli coldbrew.LocalClient, scene coldbrew.Scene) error {
107 cameras := cli.ActiveCamerasFor(scene)
108 for _, cam := range cameras {
109  _, cameraPositionInScene := cam.Positions()
110  if cameraPositionInScene.X > 640 {
111   sys.flipX = true
112  } else if cameraPositionInScene.X < 0 {
113   sys.flipX = false
114  }
115
116  if !sys.flipX {
117   cameraPositionInScene.X += 1
118  } else {
119   cameraPositionInScene.X -= 1
120  }
121 }
122 return nil
123}