Noah Petherbridge
d14eaf7df2
* The F4 key to draw collision boxes works reliably again: it draws the player's hitbox in world-space using the canvas.DrawStrokes() function, rather than in screen-space so it follows the player reliably. * The F4 key also draws hitboxes for ALL other actors in the level: buttons, enemies, doors, etc. * The level geometry collision function is updated to respect a doodad's declared Hitbox from their script, which may result in a smaller box than their raw Canvas size. The result is tighter collision between doodads, and Boy's sprite is rather narrow for its square Canvas so collision on rightward geometry is tighter for the player character. * Collision checks between actors also respect the actor's declared hitboxes now, allowing for Boy to get even closer to a locked door before being blocked.
53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
package collision
|
|
|
|
import "git.kirsle.net/go/render"
|
|
|
|
// GetBoundingRect computes the full pairs of points for the bounding box of
|
|
// the actor.
|
|
//
|
|
// The X,Y coordinates are the position in the level of the actor,
|
|
// The W,H are the size of the actor's drawn box.
|
|
func GetBoundingRect(a Actor) render.Rect {
|
|
var (
|
|
P = a.Position()
|
|
S = a.Size()
|
|
)
|
|
return render.Rect{
|
|
X: P.X,
|
|
Y: P.Y,
|
|
W: S.W,
|
|
H: S.H,
|
|
}
|
|
}
|
|
|
|
// GetBoundingRectHitbox returns the bounding rect of the Actor taking into
|
|
// account their self-declared collision hitbox.
|
|
//
|
|
// The rect returned has the X,Y coordinate set to the actor's position, plus
|
|
// the X,Y of their hitbox, if any.
|
|
//
|
|
// The W,H of the rect is the W,H of their declared hitbox.
|
|
//
|
|
// If the actor has NOT declared its hitbox, this function returns exactly the
|
|
// same way as GetBoundingRect() does.
|
|
func GetBoundingRectHitbox(a Actor, hitbox render.Rect) render.Rect {
|
|
rect := GetBoundingRect(a)
|
|
if !hitbox.IsZero() {
|
|
rect.X += hitbox.X
|
|
rect.Y += hitbox.Y
|
|
rect.W = hitbox.W
|
|
rect.H = hitbox.H
|
|
}
|
|
return rect
|
|
}
|
|
|
|
// SizePlusHitbox adjusts an actor's canvas Size() to better fit the
|
|
// declared Hitbox by the actor's script.
|
|
func SizePlusHitbox(size render.Rect, hitbox render.Rect) render.Rect {
|
|
size.X += hitbox.X
|
|
size.Y += hitbox.Y
|
|
size.W -= size.W - hitbox.W
|
|
size.H -= size.H - hitbox.H
|
|
return size
|
|
}
|