This commit is contained in:
@@ -84,6 +84,18 @@ func (a *Animation) updateMarioPosition() {
|
|||||||
minCenterY := halfH
|
minCenterY := halfH
|
||||||
maxCenterY := a.ctx.Height() - 1 - halfH
|
maxCenterY := a.ctx.Height() - 1 - halfH
|
||||||
|
|
||||||
|
// If the sprite is larger than the panel in a dimension, collapse
|
||||||
|
// the allowed center range to the panel center so we don't get
|
||||||
|
// immediate collisions every frame which makes Mario flash.
|
||||||
|
if maxCenterX < minCenterX {
|
||||||
|
minCenterX = centerX
|
||||||
|
maxCenterX = centerX
|
||||||
|
}
|
||||||
|
if maxCenterY < minCenterY {
|
||||||
|
minCenterY = centerY
|
||||||
|
maxCenterY = centerY
|
||||||
|
}
|
||||||
|
|
||||||
// parametric angle before any reflection
|
// parametric angle before any reflection
|
||||||
t := a.mario.angle
|
t := a.mario.angle
|
||||||
|
|
||||||
@@ -95,6 +107,16 @@ func (a *Animation) updateMarioPosition() {
|
|||||||
collidedX := marioX < minCenterX || marioX > maxCenterX
|
collidedX := marioX < minCenterX || marioX > maxCenterX
|
||||||
collidedY := marioY < minCenterY || marioY > maxCenterY
|
collidedY := marioY < minCenterY || marioY > maxCenterY
|
||||||
|
|
||||||
|
// If allowed range collapsed to the center, don't reflect on that axis
|
||||||
|
// because reflection would keep flipping every frame. Treat that as
|
||||||
|
// non-colliding for reflection purposes (we'll clamp position later).
|
||||||
|
if minCenterX == maxCenterX {
|
||||||
|
collidedX = false
|
||||||
|
}
|
||||||
|
if minCenterY == maxCenterY {
|
||||||
|
collidedY = false
|
||||||
|
}
|
||||||
|
|
||||||
// Reflect the parametric angle correctly:
|
// Reflect the parametric angle correctly:
|
||||||
// - For horizontal collision we want cos(t_new) = -cos(t) => t_new = Pi - t
|
// - For horizontal collision we want cos(t_new) = -cos(t) => t_new = Pi - t
|
||||||
// - For vertical collision we want sin(t_new) = -sin(t) => t_new = -t
|
// - For vertical collision we want sin(t_new) = -sin(t) => t_new = -t
|
||||||
|
|||||||
Reference in New Issue
Block a user