simple physics refactor

This commit is contained in:
Maas Lalani 2021-08-06 22:00:08 -04:00
parent 1d4070136b
commit 15dbe41db2
No known key found for this signature in database
GPG Key ID: F53774FA051C052A
3 changed files with 63 additions and 28 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# ConfeTTY
Terminal Confetti.

View File

@ -2,11 +2,12 @@ package confetty
import ( import (
"fmt" "fmt"
"math"
"math/rand" "math/rand"
"strings" "strings"
"time" "time"
"github.com/maaslalani/confetty/pkg/physics"
"github.com/charmbracelet/bubbles/viewport" "github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea" tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss"
@ -47,27 +48,10 @@ type model struct {
type Particle struct { type Particle struct {
char string char string
acc Acceleration physics *physics.Physics
vel Velocity
pos Position
color lipgloss.Color color lipgloss.Color
} }
type Position struct {
x float64
y float64
}
type Velocity struct {
x float64
y float64
}
type Acceleration struct {
x float64
y float64
}
var characters = []string{"▄", "▀", "█"} // "▓", "▒", "░"} var characters = []string{"▄", "▀", "█"} // "▓", "▒", "░"}
func InitialModel() model { func InitialModel() model {
@ -84,9 +68,12 @@ func InitialModel() model {
p := &Particle{ p := &Particle{
char: lipgloss.NewStyle().Foreground(colors[rand.Intn(len(colors))]).Render(characters[rand.Intn(len(characters))]), char: lipgloss.NewStyle().Foreground(colors[rand.Intn(len(colors))]).Render(characters[rand.Intn(len(characters))]),
pos: Position{x: x, y: y}, physics: physics.New(
vel: Velocity{x: (rand.Float64() - 0.5) * 100, y: (rand.Float64() - 0.5) * 100}, physics.Vector{X: x, Y: y},
acc: Acceleration{x: 0, y: 9.8}, physics.Vector{X: (rand.Float64() - 0.5) * 100, Y: (rand.Float64() - 0.5) * 100},
physics.Vector(physics.Gravity),
fps,
),
} }
particles = append(particles, p) particles = append(particles, p)
} }
@ -104,8 +91,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, tea.Quit return m, tea.Quit
case frameMsg: case frameMsg:
for _, p := range m.particles { for _, p := range m.particles {
p.pos.y, p.vel.y = p.pos.y+p.vel.y/fps, p.vel.y+p.acc.y/fps p.physics.Update()
p.pos.x, p.vel.x = p.pos.x+p.vel.x/fps, p.vel.x+p.acc.x/fps
} }
return m, animate() return m, animate()
case tea.WindowSizeMsg: case tea.WindowSizeMsg:
@ -127,8 +113,8 @@ func (m model) View() string {
grid[i] = make([]string, m.viewport.Width) grid[i] = make([]string, m.viewport.Width)
} }
for _, p := range m.particles { for _, p := range m.particles {
y := int(math.Round(p.pos.y)) y := p.physics.PosY()
x := int(math.Round(p.pos.x)) x := p.physics.PosX()
if y < 0 || x < 0 || x >= m.viewport.Width-1 || y >= m.viewport.Height-1 { if y < 0 || x < 0 || x >= m.viewport.Width-1 || y >= m.viewport.Height-1 {
continue continue
} }

46
pkg/physics/physics.go Normal file
View File

@ -0,0 +1,46 @@
package physics
import "math"
type Position Vector
type Velocity Vector
type Acceleration Vector
var Gravity = Acceleration{
X: 0,
Y: 9.81,
}
type Physics struct {
pos Position
vel Velocity
acc Acceleration
fps float64
}
type Vector struct {
X float64
Y float64
}
func New(pos, vel, acc Vector, fps float64) *Physics {
return &Physics{
pos: Position(pos),
vel: Velocity(vel),
acc: Acceleration(acc),
fps: fps,
}
}
func (p *Physics) Update() {
p.pos.Y, p.vel.Y = p.pos.Y+p.vel.Y/p.fps, p.vel.Y+p.acc.Y/p.fps
p.pos.X, p.vel.X = p.pos.X+p.vel.X/p.fps, p.vel.X+p.acc.X/p.fps
}
func (p Physics) PosX() int {
return int(math.Round(p.pos.X))
}
func (p Physics) PosY() int {
return int(math.Round(p.pos.Y))
}