mirror of
https://github.com/charmbracelet/harmonica.git
synced 2026-07-19 10:09:33 -06:00
Add 2D pixel-based demo
This commit is contained in:
parent
4034cbe42c
commit
4db1ed716b
88
examples/canvas/main.go
Normal file
88
examples/canvas/main.go
Normal file
@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/charmbracelet/harmonica"
|
||||
"github.com/h8gi/canvas"
|
||||
)
|
||||
|
||||
const (
|
||||
width = 1024
|
||||
height = 768
|
||||
fps = 60
|
||||
bgColor = "#111111"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var (
|
||||
circ = newCircle()
|
||||
clickedYet bool
|
||||
)
|
||||
|
||||
c := canvas.NewCanvas(&canvas.CanvasConfig{
|
||||
Width: width,
|
||||
Height: height,
|
||||
FrameRate: fps,
|
||||
Title: "Harmonica",
|
||||
})
|
||||
|
||||
c.Draw(func(ctx *canvas.Context) {
|
||||
ctx.SetHexColor(bgColor)
|
||||
ctx.Clear()
|
||||
|
||||
if ctx.IsMouseDragged {
|
||||
if !clickedYet {
|
||||
// Set starting positions.
|
||||
circ.x = ctx.Mouse.X
|
||||
circ.y = ctx.Mouse.Y
|
||||
|
||||
circ.Radius = 100
|
||||
clickedYet = true
|
||||
}
|
||||
circ.X = ctx.Mouse.X
|
||||
circ.Y = ctx.Mouse.Y
|
||||
}
|
||||
|
||||
if clickedYet {
|
||||
circ.draw(ctx)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
type circle struct {
|
||||
// Target values. This is what the spring will seek.
|
||||
X, Y, Radius float64
|
||||
|
||||
// Managed values. These are the initial
|
||||
x, xVel float64
|
||||
y, yVel float64
|
||||
rad, radVel float64
|
||||
|
||||
spring harmonica.Spring
|
||||
}
|
||||
|
||||
func newCircle() circle {
|
||||
const (
|
||||
frequency = 0.8
|
||||
damping = 0.99
|
||||
)
|
||||
|
||||
return circle{
|
||||
spring: harmonica.NewSpring(harmonica.TimeDelta(time.Second/fps), frequency, damping),
|
||||
}
|
||||
}
|
||||
|
||||
func (c *circle) draw(ctx *canvas.Context) {
|
||||
// Update
|
||||
c.spring.Update(&c.x, &c.xVel, c.X)
|
||||
c.spring.Update(&c.y, &c.yVel, c.Y)
|
||||
c.spring.Update(&c.rad, &c.radVel, c.Radius)
|
||||
|
||||
const color = "#f1f1f1"
|
||||
|
||||
ctx.Push()
|
||||
ctx.DrawCircle(c.x, c.y, c.rad)
|
||||
ctx.SetHexColor(color)
|
||||
ctx.Fill()
|
||||
}
|
||||
11
examples/go.mod
Normal file
11
examples/go.mod
Normal file
@ -0,0 +1,11 @@
|
||||
module examples
|
||||
|
||||
go 1.16
|
||||
|
||||
replace github.com/charmbracelet/harmonica => ../
|
||||
|
||||
require (
|
||||
github.com/charmbracelet/harmonica v0.0.0-20210709144143-16876a63b30d // indirect
|
||||
github.com/h8gi/canvas v0.0.0-20200710004640-a6361a06ab49
|
||||
golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff
|
||||
)
|
||||
24
examples/go.sum
Normal file
24
examples/go.sum
Normal file
@ -0,0 +1,24 @@
|
||||
github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380 h1:FvZ0mIGh6b3kOITxUnxS3tLZMh7yEoHo75v3/AgUqg0=
|
||||
github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380/go.mod h1:zqnPFFIuYFFxl7uH2gYByJwIVKG7fRqlqQCbzAnHs9g=
|
||||
github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 h1:baVdMKlASEHrj19iqjARrPbaRisD7EuZEVJj6ZMLl1Q=
|
||||
github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3/go.mod h1:VEPNJUlxl5KdWjDvz6Q1l+rJlxF2i6xqDeGuGAxa87M=
|
||||
github.com/faiface/pixel v0.8.0 h1:phOHW6ixfMAKRamjnvhI6FFI2VRyPEq7+LmmkDGXB/4=
|
||||
github.com/faiface/pixel v0.8.0/go.mod h1:CEUU/s9E82Kqp01Boj1O67KnBskqiLghANqvUJGgDAM=
|
||||
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
|
||||
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
|
||||
github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
|
||||
github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7 h1:THttjeRn1iiz69E875U6gAik8KTWk/JYAHoSVpUxBBI=
|
||||
github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/h8gi/canvas v0.0.0-20200710004640-a6361a06ab49 h1:svddC2dRqy+Y1zGH4+AvvCFZLKuPhAfEvlgYSNP4lcg=
|
||||
github.com/h8gi/canvas v0.0.0-20200710004640-a6361a06ab49/go.mod h1:7iSUKfOcA+GiWc+LpxXggMogUFIo8pm1FZcYTUmL3YY=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff h1:+2zgJKVDVAz/BWSsuniCmU1kLCjL88Z8/kv39xCI9NQ=
|
||||
golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
Loading…
x
Reference in New Issue
Block a user