package uix import ( "git.kirsle.net/apps/doodle/lib/render" "git.kirsle.net/apps/doodle/pkg/doodads" "git.kirsle.net/apps/doodle/pkg/level" uuid "github.com/satori/go.uuid" ) // Actor is an object that marries together the three things that make a // Doodad instance "tick" while inside a Canvas: // // - uix.Actor is a doodads.Drawing so it fulfills doodads.Actor to be a // dynamic object during gameplay. // - It has a pointer to the level.Actor indicating its static level data // as defined in the map: its spawn coordinate and configuration. // - A uix.Canvas that can present the actor's graphics to the screen. type Actor struct { doodads.Drawing Actor *level.Actor Canvas *Canvas } // NewActor sets up a uix.Actor. // If the id is blank, a new UUIDv4 is generated. func NewActor(id string, levelActor *level.Actor, doodad *doodads.Doodad) *Actor { if id == "" { id = uuid.Must(uuid.NewV4()).String() } size := int32(doodad.Layers[0].Chunker.Size) can := NewCanvas(int(size), false) can.Name = id // TODO: if the Background is render.Invisible it gets defaulted to // White somewhere and the Doodad masks the level drawing behind it. can.SetBackground(render.RGBA(0, 0, 1, 0)) can.LoadDoodad(doodad) can.Resize(render.NewRect(size, size)) actor := &Actor{ Drawing: doodads.NewDrawing(id, doodad), Actor: levelActor, Canvas: can, } // Give the Canvas a pointer to its (parent) Actor so it can draw its debug // label and show the World Position of the actor within the world. can.actor = actor return actor }