Collision: Fix walking up leftward slopes

* Actors can now walk up gentle inclines to the left as well as they can
  to the right. The bug was introduced as a hack to prevent clipping
  thru the left wall of a 90 degree corner, but that problem seems
  resolved now.
loading-screen
Noah 2021-06-02 21:49:29 -07:00
parent d14eaf7df2
commit d470f7e647
2 changed files with 15 additions and 5 deletions

View File

@ -73,9 +73,13 @@ func CollidesWithGrid(d Actor, grid *level.Chunker, target render.Point) (*Colli
)
// Adjust the actor's bounding rect by its stated Hitbox from its script.
S = SizePlusHitbox(S, hitbox)
// e.g.: Boy's Canvas size is 56x56 but he is a narrower character with a
// hitbox width smaller than its Canvas size.
S = SizePlusHitbox(GetBoundingRect(d), hitbox)
// Test all of the bounding boxes for a collision with level geometry.
// Test if we are ALREADY colliding with level geometry and try and wiggle
// free. ScanBoundingBox scans level pixels along the four edges of the
// actor's hitbox in world space.
if ok := result.ScanBoundingBox(GetBoundingRectHitbox(d, hitbox), grid); ok {
// We've already collided! Try to wiggle free.
if result.Bottom {
@ -108,7 +112,8 @@ func CollidesWithGrid(d Actor, grid *level.Chunker, target render.Point) (*Colli
// We're moving upward.
d.SetGrounded(false)
} else {
// Cap our downward motion to our current position.
// Cap our downward motion to our current position,
// fighting the force of gravity.
target.Y = P.Y
}
}
@ -117,7 +122,7 @@ func CollidesWithGrid(d Actor, grid *level.Chunker, target render.Point) (*Colli
if (result.Left && target.X < P.X) || (result.Right && target.X > P.X) {
// If the step is short enough, try and jump up.
height := P.Y + S.H
if result.Left && target.X < P.X {
if result.Left { // && target.X < P.X {
height -= result.LeftPoint.Y
} else {
height -= result.RightPoint.Y
@ -182,7 +187,7 @@ func CollidesWithGrid(d Actor, grid *level.Chunker, target render.Point) (*Colli
if result.Left && !hitLeft {
hitLeft = true
capLeft = result.LeftPoint.X + 1
capLeft = result.LeftPoint.X // + 1
// TODO: there was a clipping bug where the player could clip
// thru a left wall if they jumped slightly while pressing into

View File

@ -22,3 +22,8 @@ func NewDrawing(id string, doodad *doodads.Doodad) *Drawing {
func (d *Drawing) Size() render.Rect {
return d.Drawing.Size()
}
// MoveTo changes the drawing's position.
func (d *Drawing) MoveTo(to render.Point) {
d.Drawing.MoveTo(to)
}