Basic Transfer Example

Instructions

  • Click on demo to allow inputs
  • Use 1 key to toggle scenes (with player transfer)
scene_transfer.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 "github.com/TheBitDrifter/bappa/tteokbokki/spatial"
 12
 13 "github.com/TheBitDrifter/bappa/warehouse"
 14 "github.com/hajimehoshi/ebiten/v2"
 15 "github.com/hajimehoshi/ebiten/v2/inpututil"
 16
 17 "github.com/TheBitDrifter/bappa/blueprint/client"
 18 "github.com/TheBitDrifter/bappa/blueprint/input"
 19)
 20
 21//go:embed assets/*
 22var assets embed.FS
 23
 24const (
 25 sceneOneName = "s1"
 26 sceneTwoName = "s2"
 27)
 28
 29func main() {
 30 client := coldbrew.NewClient(
 31  640,
 32  360,
 33  10,
 34  10,
 35  10,
 36  assets,
 37 )
 38
 39 client.SetTitle("Scene Change Example")
 40 client.SetMinimumLoadTime(20)
 41
 42 err := client.RegisterScene(
 43  sceneOneName,
 44  640,
 45  360,
 46  sceneOnePlan,
 47  []coldbrew.RenderSystem{},
 48  []coldbrew.ClientSystem{},
 49  []blueprint.CoreSystem{},
 50 )
 51 if err != nil {
 52  log.Fatal(err)
 53 }
 54 err = client.RegisterScene(
 55  sceneTwoName,
 56  640,
 57  360,
 58  sceneTwoPlan,
 59  []coldbrew.RenderSystem{},
 60  []coldbrew.ClientSystem{},
 61  []blueprint.CoreSystem{},
 62 )
 63 if err != nil {
 64  log.Fatal(err)
 65 }
 66
 67 client.RegisterGlobalRenderSystem(coldbrew_rendersystems.GlobalRenderer{})
 68 client.RegisterGlobalClientSystem(basicTransferSystem{}, &coldbrew_clientsystems.CameraSceneAssignerSystem{})
 69
 70 client.ActivateCamera()
 71
 72 if err := client.Start(); err != nil {
 73  log.Fatal(err)
 74 }
 75}
 76
 77func sceneOnePlan(height, width int, sto warehouse.Storage) error {
 78 spriteArchetype, err := sto.NewOrExistingArchetype(
 79  spatial.Components.Position,
 80  client.Components.SpriteBundle,
 81  client.Components.CameraIndex,
 82 )
 83 if err != nil {
 84  return err
 85 }
 86
 87 err = spriteArchetype.Generate(1,
 88  input.Components.InputBuffer,
 89
 90  spatial.NewPosition(255, 20),
 91  client.NewSpriteBundle().
 92   AddSprite("sprite.png", true),
 93
 94  client.CameraIndex(0),
 95 )
 96 err = blueprint.NewParallaxBackgroundBuilder(sto).
 97  AddLayer("sky.png", 0.1, 0.1).
 98  AddLayer("far.png", 0.3, 0.3).
 99  AddLayer("mid.png", 0.4, 0.4).
100  AddLayer("near.png", 0.8, 0.8).
101  Build()
102 if err != nil {
103  return err
104 }
105 return nil
106}
107
108func sceneTwoPlan(height, width int, sto warehouse.Storage) error {
109 err := blueprint.NewParallaxBackgroundBuilder(sto).
110  AddLayer("sky.png", 0.1, 0.1).
111  Build()
112 if err != nil {
113  return err
114 }
115 return nil
116}
117
118type transfer struct {
119 targetSceneName string
120 playerEntity    warehouse.Entity
121}
122
123type basicTransferSystem struct{}
124
125func (basicTransferSystem) Run(cli coldbrew.Client) error {
126 var pending []transfer
127
128 for activeScene := range cli.ActiveScenes() {
129  if !activeScene.Ready() {
130   continue
131  }
132  cursor := activeScene.NewCursor(blueprint.Queries.CameraIndex)
133  for range cursor.Next() {
134   if inpututil.IsKeyJustPressed(ebiten.Key1) {
135
136    currentPlayerEntity, err := cursor.CurrentEntity()
137    if err != nil {
138     return err
139    }
140
141    // --- Determine target scene ---
142    // Simple toggle between scenes
143    var sceneTargetName string
144    if activeScene.Name() == sceneOneName {
145     sceneTargetName = sceneTwoName
146    } else {
147     sceneTargetName = sceneOneName
148    }
149
150    transfer := transfer{
151     targetSceneName: sceneTargetName,
152     playerEntity:    currentPlayerEntity,
153    }
154    pending = append(pending, transfer)
155   }
156  }
157 }
158
159 for _, transfer := range pending {
160  cli.ChangeSceneByName(transfer.targetSceneName, transfer.playerEntity)
161  // Note:
162  // Use cli.ActivateSceneByName() if doing multi scene setups!
163 }
164
165 return nil
166}