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.5 KiB

package main
import (
"github.com/veandco/go-sdl2/sdl"
"math"
)
func (p *paddle) update(keyState []uint8, et float32) {
if keyState[sdl.SCANCODE_UP] != 0 && p.y - p.h / 2 > 0 {
p.y -= p.speed * et
}
if keyState[sdl.SCANCODE_DOWN] != 0 && p.y + p.h / 2 < float32(winHeight) {
p.y += p.speed * et
}
}
func (p *paddle) aiUpdate(ball *ball, et float32) {
if ball.y + p.h / 2 < float32(winHeight) && ball.y - p.h / 2 > 0 {
p.y = ball.y
}
}
func (b *ball) update(p1, p2 *paddle, et float32) {
if detectCollision(b, p1) {
if b.y < p1.y+p1.h/2 && b.y > p1.y-p1.h/2 && b.dx < 0{
b.dx = -b.dx
} else if b.x < p1.x + p1.w / 2 && b.x > p1.x - p1.w / 2 {
b.dy = -b.dy
} else {
testX, testY := closestCorner(b, p1)
vx, vy := testX - b.x, testY - b.y
vd := float32(math.Sqrt(float64(vx * vx + vy * vy)))
ux, uy := vx / vd, vy / vd
b.x, b.y = testX - b.radius * ux, testY - b.radius * uy
q := -(2 * (b.dx * (b.x - testX) + b.dy * (b.y - testY)) / (b.radius * b.radius))
b.dx = b.dx + q * (b.x - testX)
b.dy = b.dy + q * (b.y - testY)
}
}
b.x += b.dx * et
b.y += b.dy * et
if b.y - b.radius < 1 || b.y + b.radius > float32(winHeight) - 1 {
b.dy = -b.dy
}
if b.x - b.radius < 0 {
p2.score++
b.pos = getCenter()
state = pause
} else if b.x + b.radius > float32(winWidth) {
p1.score++
b.pos = getCenter()
state = pause
}
if b.x + b.radius >= p2.x - p2.w / 2 && b.dx > 0{
if b.y < p2.y+p2.h/2 && b.y > p2.y-p2.h/2 {
b.dx = -b.dx
}
}
}