soltar varias bolas ao mesmo tempo

This commit is contained in:
silva guimaraes 2023-08-15 10:24:12 -03:00
parent af3a0e92b4
commit de94235fb9
3 changed files with 69 additions and 46 deletions

5
go.mod Normal file
View file

@ -0,0 +1,5 @@
module app
go 1.20
require github.com/gen2brain/raylib-go/raylib v0.0.0-20230719211022-1083eace2049

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
github.com/gen2brain/raylib-go/raylib v0.0.0-20230719211022-1083eace2049 h1:fJeDPYJDyT+KeWKsIMbRlNcSgsQ2nZ4bJLwBraVA/xU=
github.com/gen2brain/raylib-go/raylib v0.0.0-20230719211022-1083eace2049/go.mod h1:AwtGA3aTtYdezNxEVbfchaLw/z+CuRDh2Mlxy0FbBro=

108
main.go
View file

@ -29,6 +29,39 @@ type ball struct {
speed rl.Vector2
}
func (ball *ball) update(magnets []magnet) (bool, rl.Color) {
magnetsPull := rl.Vector2{}
const ballMass float32 = 1
const gravConst float32 = 8
for _, magnet := range magnets {
direction := rl.Vector2Normalize(
rl.Vector2Subtract(ball.pos, magnet.pos),
)
distance := rl.Vector2Distance(magnet.pos, ball.pos)
force := gravConst * (ballMass * magnet.force) / distance
acceleration := rl.Vector2Scale(direction, -force)
magnetsPull = rl.Vector2Add(magnetsPull, acceleration)
}
// fmt.Println(magnetsPull)
ball.speed = rl.Vector2Add(ball.speed, magnetsPull)
ball.pos = rl.Vector2Add(ball.speed, ball.pos)
for _, magnet := range magnets {
distance := rl.Vector2Distance(ball.pos, magnet.pos)
if distance < magnet.radius + ball.radius {
return true, magnet.color
}
}
return false, rl.NewColor(0, 0, 0, 0)
}
func main() {
state := state{
@ -99,8 +132,7 @@ func main() {
Y: float32(state.windowHeight / int32(horizontalGrids)),
}
var fallingBall *ball
fallingBall = nil
var fallingBall []*ball
var fallingBallOrder []rl.Vector2
for y := range grid {
@ -116,6 +148,17 @@ func main() {
fallingBallOrder[j], fallingBallOrder[i]
})
for _, randomGrid := range fallingBallOrder {
x := randomGrid.X * gridSize.X + gridSize.X/2
y := randomGrid.Y * gridSize.Y + gridSize.Y/2
fallingBall = append(fallingBall, &ball{
pos: rl.Vector2{X: x, Y: y},
speed: rl.Vector2{},
radius: RADIUS/2,
originGrid: randomGrid,
})
}
for !rl.WindowShouldClose() {
rl.BeginDrawing()
rl.ClearBackground(rl.Black)
@ -134,59 +177,32 @@ func main() {
rl.DrawCircleV(magnets[i].pos, RADIUS, magnets[i].color)
}
if len(fallingBallOrder) == 0 {
if len(fallingBall) == 0 {
rl.EndDrawing()
continue
}
if fallingBall == nil {
next := fallingBallOrder[0]
fallingBallOrder = fallingBallOrder[1:]
x := next.X * gridSize.X + gridSize.X/2
y := next.Y * gridSize.Y + gridSize.Y/2
fallingBall = &ball{
pos: rl.Vector2{X: x, Y: y},
originGrid: next,
radius: RADIUS/2,
}
}
magnetsPull := rl.Vector2{}
var ballMass float32 = 1
var gravConst float32 = 8
for i := 0; i < len(fallingBall); i++ {
ball := fallingBall[i]
for _, magnet := range magnets {
direction := rl.Vector2Normalize(
rl.Vector2Subtract(fallingBall.pos, magnet.pos),
rl.DrawCircleV(
ball.pos, ball.radius/2+1, rl.Black,
)
distance := rl.Vector2Distance(magnet.pos, fallingBall.pos)
force := gravConst * (ballMass * magnet.force) / distance
acceleration := rl.Vector2Scale(direction, -force)
magnetsPull = rl.Vector2Add(magnetsPull, acceleration)
}
// fmt.Println(magnetsPull)
fallingBall.speed = rl.Vector2Add(fallingBall.speed, magnetsPull)
fallingBall.pos = rl.Vector2Add(fallingBall.speed, fallingBall.pos)
rl.DrawCircleV(
fallingBall.pos, fallingBall.radius+1, rl.Black,
)
rl.DrawCircleV(
fallingBall.pos, fallingBall.radius,
rl.NewColor(100, 100, 100, 255),
)
for _, magnet := range magnets {
distance := rl.Vector2Distance(fallingBall.pos, magnet.pos)
if distance < magnet.radius + fallingBall.radius {
x := fallingBall.originGrid.X
y := fallingBall.originGrid.Y
grid[int(y)][int(x)] = magnet.color
fallingBall = nil
break
rl.DrawCircleV(
ball.pos, ball.radius/2,
rl.NewColor(100, 100, 100, 255),
)
if hit, color := ball.update(magnets); hit {
x := ball.originGrid.X
y := ball.originGrid.Y
grid[int(y)][int(x)] = color
// remover bola
fallingBall[i] = fallingBall[len(fallingBall)-1]
fallingBall = fallingBall[:len(fallingBall)-1]
}
}
// fmt.Println("foo")
rl.EndDrawing()
}