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
|
||||
}
|
||||
|
||||
|
||||
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()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue