Fixing reversing and wall collisions

This commit is contained in:
Fraser Graham 2014-04-26 23:05:33 -06:00 committed by Stephen McQuay
parent 06ce7eefc8
commit af418f1e6f

View File

@ -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 {