diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d4f01fc --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module app + +go 1.20 + +require github.com/gen2brain/raylib-go/raylib v0.0.0-20230719211022-1083eace2049 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..5f40ca5 --- /dev/null +++ b/go.sum @@ -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= diff --git a/main.go b/main.go index 2232298..de98607 100644 --- a/main.go +++ b/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() }