Noah Petherbridge
0044b72943
Add the ability to drag and drop Doodads onto the level. The Doodad buttons on the palette now trigger a Drag/Drop behavior when clicked, and a "blueprint colored" version of the Doodad follows your cursor, centered on it. Actors are assigned a random UUID ID when they are placed into a level. The Canvas gained a MaskColor property that forces all pixels in the drawing to render as the same color. This is a visual-only effect, and is used when dragging Doodads in so they render as "blueprints" instead of their actual colors until they are dropped. Fix the chunk bitmap cache system so it saves in the $XDG_CACHE_FOLDER instead of /tmp and has better names. They go into `~/.config/doodle/chunks/` and have UUID file names -- but they disappear quickly! As soon as they are cached into SDL2 they are removed from disk. Other changes: - UI: Add Hovering() method that returns the widgets that are beneath a point (your cursor) and those that are not, for easy querying for event propagation. - UI: Add ability to return an ErrStopPropagation to tell the master Scene (outside the UI) not to continue sending events to other parts of the code, so that you don't draw pixels during a drag event.
65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
package doodads
|
|
|
|
import (
|
|
"git.kirsle.net/apps/doodle/balance"
|
|
"git.kirsle.net/apps/doodle/level"
|
|
"git.kirsle.net/apps/doodle/render"
|
|
)
|
|
|
|
// Doodad is a reusable component for Levels that have scripts and graphics.
|
|
type Doodad struct {
|
|
level.Base
|
|
Filename string `json:"-"` // used internally, not saved in json
|
|
Palette *level.Palette `json:"palette"`
|
|
Script string `json:"script"`
|
|
Layers []Layer `json:"layers"`
|
|
}
|
|
|
|
// Layer holds a layer of drawing data for a Doodad.
|
|
type Layer struct {
|
|
Name string `json:"name"`
|
|
Chunker *level.Chunker `json:"chunks"`
|
|
}
|
|
|
|
// New creates a new Doodad.
|
|
func New(size int) *Doodad {
|
|
if size == 0 {
|
|
size = balance.DoodadSize
|
|
}
|
|
|
|
return &Doodad{
|
|
Base: level.Base{
|
|
Version: 1,
|
|
},
|
|
Palette: level.DefaultPalette(),
|
|
Layers: []Layer{
|
|
{
|
|
Name: "main",
|
|
Chunker: level.NewChunker(size),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
// ChunkSize returns the chunk size of the Doodad's first layer.
|
|
func (d *Doodad) ChunkSize() int {
|
|
return d.Layers[0].Chunker.Size
|
|
}
|
|
|
|
// Rect returns a rect of the ChunkSize for scaling a Canvas widget.
|
|
func (d *Doodad) Rect() render.Rect {
|
|
var size = d.ChunkSize()
|
|
return render.Rect{
|
|
W: int32(size),
|
|
H: int32(size),
|
|
}
|
|
}
|
|
|
|
// Inflate attaches the pixels to their swatches after loading from disk.
|
|
func (d *Doodad) Inflate() {
|
|
d.Palette.Inflate()
|
|
for _, layer := range d.Layers {
|
|
layer.Chunker.Inflate(d.Palette)
|
|
}
|
|
}
|