You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.2 KiB
63 lines
1.2 KiB
package main
|
|
|
|
import (
|
|
"github.com/veandco/go-sdl2/sdl"
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
func closestCorner(b *ball, p *paddle) (float32, float32) {
|
|
testX := b.x
|
|
testY := b.y
|
|
if b.x < p.x - p.w / 2 {
|
|
testX = p.x - p.w / 2
|
|
} else if b.x > p.x + p.w / 2 {
|
|
testX = p.x + p.w / 2
|
|
}
|
|
if b.y < p.y - p.h / 2 {
|
|
testY = p.y - p.h / 2
|
|
} else if b.y > p.y + p.h / 2 {
|
|
testY = p.y + p.h / 2
|
|
}
|
|
return testX, testY
|
|
}
|
|
|
|
func detectCollision(b *ball, p *paddle) bool {
|
|
testX, testY := closestCorner(b, p)
|
|
|
|
sideX := b.x - testX
|
|
sideY := b.y - testY
|
|
return b.radius * b.radius >= sideX * sideX + sideY * sideY
|
|
}
|
|
|
|
func setPixel(x, y int, c sdl.Color, pixels []byte) {
|
|
index := (y*winWidth + x) * 4
|
|
if index < len(pixels) - 4 && index >= 0 {
|
|
pixels[index] = c.R
|
|
pixels[index+1] = c.G
|
|
pixels[index+2] = c.B
|
|
//pixels[index+3] = c.A
|
|
}
|
|
}
|
|
|
|
func clearScreen(pixels []byte) {
|
|
for i := range pixels {
|
|
pixels[i] = 0
|
|
}
|
|
}
|
|
|
|
func getCenter() pos {
|
|
return pos{float32(winWidth) / 2, float32(winHeight) / 2}
|
|
}
|
|
|
|
func lerp(a, b, pct float32) float32 {
|
|
return a + pct * (b - a)
|
|
}
|
|
|
|
func resetBall(b *ball) {
|
|
choices := []float32{-400, -200, 200, 400}
|
|
s := rand.NewSource(time.Now().Unix())
|
|
r := rand.New(s)
|
|
b.dy = choices[r.Intn(len(choices))]
|
|
b.dx = choices[r.Intn(len(choices))]
|
|
} |