Fixing reversing and wall collisions
This commit is contained in:
parent
06ce7eefc8
commit
af418f1e6f
58
robot.go
58
robot.go
@ -186,7 +186,6 @@ type Instruction struct {
|
||||
// collided, if this happened.
|
||||
func (r *Robot) checkCollisions(g *Game, probe v.Vector2d) (bool, *v.Point2d, *Robot) {
|
||||
finalCollision := false
|
||||
collision := false
|
||||
closest := math.Inf(1)
|
||||
var intersection *v.Point2d
|
||||
var finalRobot *Robot
|
||||
@ -195,19 +194,29 @@ func (r *Robot) checkCollisions(g *Game, probe v.Vector2d) (bool, *v.Point2d, *R
|
||||
botSize := 5.0
|
||||
botPolygon := v.OrientedSquare(r.Position, r.Heading, botSize)
|
||||
|
||||
// Check Walls
|
||||
r_walls := v.AABB2d{A: v.Point2d{X: botSize, Y: botSize}, B: v.Point2d{X: g.width - botSize, Y: g.height - botSize}}
|
||||
collision, _, wallIntersect := v.RectIntersection(r_walls, r.Position, probe)
|
||||
if collision && wallIntersect != nil {
|
||||
finalCollision = true
|
||||
if dist := r.Position.Sub(*wallIntersect).Mag(); dist < closest {
|
||||
intersection = wallIntersect
|
||||
closest = dist
|
||||
}
|
||||
bounds := []Obstacle{
|
||||
Obstacle{
|
||||
Bounds: v.AABB2d{A: v.Point2d{0, 0}, B: v.Point2d{0, g.width}},
|
||||
Hp: 0,
|
||||
},
|
||||
Obstacle{
|
||||
Bounds: v.AABB2d{A: v.Point2d{0, 0}, B: v.Point2d{0, g.height}},
|
||||
Hp: 0,
|
||||
},
|
||||
Obstacle{
|
||||
Bounds: v.AABB2d{A: v.Point2d{g.width, g.height}, B: v.Point2d{0, g.height}},
|
||||
Hp: 0,
|
||||
},
|
||||
Obstacle{
|
||||
Bounds: v.AABB2d{A: v.Point2d{g.width, g.height}, B: v.Point2d{g.width, 0}},
|
||||
Hp: 0,
|
||||
},
|
||||
}
|
||||
|
||||
obstacles := append(g.obstacles, bounds...)
|
||||
|
||||
// Check Obstacles
|
||||
for _, obj := range g.obstacles {
|
||||
for _, obj := range obstacles {
|
||||
// collision due to motion:
|
||||
collision, move_collision, translation := v.PolyPolyIntersection(
|
||||
botPolygon, probe, obj.Bounds.ToPolygon())
|
||||
@ -262,7 +271,7 @@ func (r *Robot) Tick(g *Game) {
|
||||
r.Hit = false
|
||||
r.scan(g)
|
||||
|
||||
// Adjust Speed
|
||||
// Cap Target Speed
|
||||
if r.TargetSpeed > r.Stats.Speed {
|
||||
r.TargetSpeed = r.Stats.Speed
|
||||
}
|
||||
@ -271,21 +280,32 @@ func (r *Robot) Tick(g *Game) {
|
||||
r.TargetSpeed = -1.0 * r.Stats.Speed
|
||||
}
|
||||
|
||||
if r.Speed < r.TargetSpeed {
|
||||
// Are we speeding up or slowing down?
|
||||
increase := true
|
||||
if float32(math.Abs(float64(r.Speed-r.TargetSpeed))) > v.Epsilon {
|
||||
increase = false
|
||||
}
|
||||
|
||||
if increase {
|
||||
r.Speed += (r.Stats.Acceleration * r.Delta)
|
||||
// Stop us from going too far
|
||||
if r.Speed > r.TargetSpeed {
|
||||
r.Speed = r.TargetSpeed
|
||||
}
|
||||
} else if float32(math.Abs(float64(r.Speed-r.TargetSpeed))) > v.Epsilon {
|
||||
r.Speed -= (r.Stats.Acceleration * r.Delta)
|
||||
// Cap reverse to 1/2 speed
|
||||
if r.Speed < (-0.5 * r.TargetSpeed) {
|
||||
r.Speed = (-0.5 * r.TargetSpeed)
|
||||
}
|
||||
} else {
|
||||
r.Speed -= (r.Stats.Acceleration * r.Delta)
|
||||
|
||||
// Dont go too far
|
||||
if r.Speed < r.TargetSpeed {
|
||||
r.Speed = r.TargetSpeed
|
||||
}
|
||||
|
||||
// Cap reverse at 1/4 top speed
|
||||
if r.Speed < (-0.25 * r.Stats.Speed) {
|
||||
r.Speed = (-0.25 * r.Stats.Speed)
|
||||
}
|
||||
}
|
||||
|
||||
// Adjust Heading
|
||||
current_heading := r.Heading
|
||||
if current_heading.Mag() == 0 && r.MoveTo != nil {
|
||||
|
Loading…
Reference in New Issue
Block a user