soltar varias bolas ao mesmo tempo
This commit is contained in:
parent
af3a0e92b4
commit
de94235fb9
3 changed files with 69 additions and 46 deletions
5
go.mod
Normal file
5
go.mod
Normal 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
2
go.sum
Normal 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
108
main.go
|
|
@ -29,6 +29,39 @@ type ball struct {
|
||||||
speed rl.Vector2
|
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() {
|
func main() {
|
||||||
|
|
||||||
state := state{
|
state := state{
|
||||||
|
|
@ -99,8 +132,7 @@ func main() {
|
||||||
Y: float32(state.windowHeight / int32(horizontalGrids)),
|
Y: float32(state.windowHeight / int32(horizontalGrids)),
|
||||||
}
|
}
|
||||||
|
|
||||||
var fallingBall *ball
|
var fallingBall []*ball
|
||||||
fallingBall = nil
|
|
||||||
|
|
||||||
var fallingBallOrder []rl.Vector2
|
var fallingBallOrder []rl.Vector2
|
||||||
for y := range grid {
|
for y := range grid {
|
||||||
|
|
@ -116,6 +148,17 @@ func main() {
|
||||||
fallingBallOrder[j], fallingBallOrder[i]
|
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() {
|
for !rl.WindowShouldClose() {
|
||||||
rl.BeginDrawing()
|
rl.BeginDrawing()
|
||||||
rl.ClearBackground(rl.Black)
|
rl.ClearBackground(rl.Black)
|
||||||
|
|
@ -134,59 +177,32 @@ func main() {
|
||||||
rl.DrawCircleV(magnets[i].pos, RADIUS, magnets[i].color)
|
rl.DrawCircleV(magnets[i].pos, RADIUS, magnets[i].color)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(fallingBallOrder) == 0 {
|
if len(fallingBall) == 0 {
|
||||||
rl.EndDrawing()
|
rl.EndDrawing()
|
||||||
continue
|
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{}
|
for i := 0; i < len(fallingBall); i++ {
|
||||||
var ballMass float32 = 1
|
ball := fallingBall[i]
|
||||||
var gravConst float32 = 8
|
|
||||||
|
|
||||||
for _, magnet := range magnets {
|
rl.DrawCircleV(
|
||||||
direction := rl.Vector2Normalize(
|
ball.pos, ball.radius/2+1, rl.Black,
|
||||||
rl.Vector2Subtract(fallingBall.pos, magnet.pos),
|
|
||||||
)
|
)
|
||||||
distance := rl.Vector2Distance(magnet.pos, fallingBall.pos)
|
rl.DrawCircleV(
|
||||||
force := gravConst * (ballMass * magnet.force) / distance
|
ball.pos, ball.radius/2,
|
||||||
|
rl.NewColor(100, 100, 100, 255),
|
||||||
acceleration := rl.Vector2Scale(direction, -force)
|
)
|
||||||
|
if hit, color := ball.update(magnets); hit {
|
||||||
magnetsPull = rl.Vector2Add(magnetsPull, acceleration)
|
x := ball.originGrid.X
|
||||||
}
|
y := ball.originGrid.Y
|
||||||
|
grid[int(y)][int(x)] = color
|
||||||
// fmt.Println(magnetsPull)
|
// remover bola
|
||||||
fallingBall.speed = rl.Vector2Add(fallingBall.speed, magnetsPull)
|
fallingBall[i] = fallingBall[len(fallingBall)-1]
|
||||||
fallingBall.pos = rl.Vector2Add(fallingBall.speed, fallingBall.pos)
|
fallingBall = fallingBall[:len(fallingBall)-1]
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// fmt.Println("foo")
|
||||||
|
|
||||||
rl.EndDrawing()
|
rl.EndDrawing()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue