private bool intersects(float speed, string dir, List<Segment> seg)
{
//this object has no collision
if (!col)
{
return false;
}
//bool ret = false;
float width;
if (dir.Equals("r") || dir.Equals("l"))
{
width = maxX - minX;
}
else
{
width = maxY - minY;
}
//for (float i = speed; (int)i > 0; i -= width)
//iterates through collidable objects in parallel
foreach (GameObject o in collision)
{
if (this != o)
{
//indicates movement in upwards direction
if (dir.Equals("u"))
{
//checks if objects intersect on two axis, else doesn't bother to check intersections
if (((maxX < o.getMaxX() && maxX > o.minX) || (minX > o.getMinX() && minX < o.maxX))
&& ((maxY < o.getMaxY() && maxY > o.minY) || (minY > o.getMinY() && minY < o.maxY)))
{
foreach (Segment s in seg)
{
//modifies segment
s.move(speed, "u");
//compares with each collidable objects segments
foreach (Segment l in o.getSegments())
{
//chacks if intersect
if (s.intersect(l))
{
//reverts segment
s.move(speed, "d");
return true;
}
}
//reverts segment
s.move(speed, "d");
}
//indicates segments in temp have already been updated
}
}
//indicates movement in downward direction (see above comments)
else if (dir.Equals("d"))
{
if (((maxX < o.getMaxX() && maxX > o.minX) || (minX > o.getMinX() && minX < o.maxX))
&& ((maxY < o.getMaxY() && maxY > o.minY) || (minY > o.getMinY() && minY < o.maxY)))
{
foreach (Segment s in seg)
{
s.move(speed, "d");
foreach (Segment l in o.getSegments())
{
if (s.intersect(l))
{
s.move(speed, "u");
return true;
}
}
s.move(speed, "u");
}
}
}
//indicates movement in left direction (see above comments)
else if (dir.Equals("l"))
{
if (((maxX < o.getMaxX() && maxX > o.minX) || (minX > o.getMinX() && minX < o.maxX))
&& ((maxY < o.getMaxY() && maxY > o.minY) || (minY > o.getMinY() && minY < o.maxY)))
{
foreach (Segment s in seg)
{
s.move(speed, "l");
foreach (Segment l in o.getSegments())
{
if (s.intersect(l))
{
s.move(speed, "r");
return true;
}
}
s.move(speed, "r");
}
}
}
//indicates movement in right direction (see above comments)
else if (dir.Equals("r"))
{
if (((maxX < o.getMaxX() && maxX > o.minX) || (minX > o.getMinX() && minX < o.maxX))
&& ((maxY < o.getMaxY() && maxY > o.minY) || (minY > o.getMinY() && minY < o.maxY)))
{
foreach (Segment s in seg)
{
s.move(speed, "r");
foreach (Segment l in o.getSegments())
{
if (s.intersect(l))
{
s.move(speed, "l");
return true;
}
}
s.move(speed, "l");
}
}
}
else
{
throw new ArgumentException("invalid direction");
}
}
}
//returns false if no collision detected, else true
return false;
}