protected bool SimpleCollisionCheck(List<GameObject> objects, out GameObject obj) {
Rectangle futureCollision = Collision;
if (Velocity.X != 0) {
if (Velocity.X > 0) { futureCollision.X += (int)VelocityMaximum; } else { futureCollision.X -= (int)VelocityMaximum; }
}
if (Velocity.Y != 0) {
if (Velocity.Y > 0) { futureCollision.Y += (int)VelocityMaximum; } else { futureCollision.Y -= (int)VelocityMaximum; }
}
foreach (GameObject o in objects) {
if (o != this && o.Active == true && o.CollisionEnabled == true && o.CollisionCheck(futureCollision) == true) {
obj = o;
return true;
}
}
obj = null;
return false;
}
private bool CollisionLeft(GameObject o) {
return ((Collision.Left - VelocityMaximum) < o.Collision.Right) &&
(Collision.Right >= o.Collision.Right) &&
(Collision.Top < o.Collision.Bottom) &&
(Collision.Bottom > o.Collision.Top);
}
private bool CollisionRight(GameObject o) {
return ((Collision.Right + VelocityMaximum) > o.Collision.Left) &&
(Collision.Left <= o.Collision.Left) &&
(Collision.Top < o.Collision.Bottom) &&
(Collision.Bottom > o.Collision.Top);
}
private bool CollisionUp(GameObject o) {
return ((Collision.Top - VelocityMaximum) < o.Collision.Bottom) &&
(Collision.Bottom >= o.Collision.Bottom) &&
(Collision.Left < o.Collision.Right) &&
(Collision.Right > o.Collision.Left);
}
private bool CollisionDown(GameObject o) {
return ((Collision.Bottom + VelocityMaximum) > o.Collision.Top) &&
(Collision.Top <= o.Collision.Top) &&
(Collision.Left < o.Collision.Right) &&
(Collision.Right > o.Collision.Left);
}
private void DirectionalCollisionCheck(GameObject o) {
if (velocity.X < 0.0f && CollisionLeft(o)) {
if (CollisionNudgeEnabled && o.CollisionNudgeEnabled) {
if ((PositionCentered.Y /*- CollisionThickness*/) < (o.Collision.Top - collisionNudgeOffset)) {
velocity.Y = velocity.X;
} else if ((PositionCentered.Y /*+ CollisionThickness*/) > (o.Collision.Bottom + collisionNudgeOffset)) {
velocity.Y = -velocity.X;
}
}
velocity.X = 0.0f;
} else if (velocity.X > 0.0f && CollisionRight(o)) {
if (CollisionNudgeEnabled && o.CollisionNudgeEnabled) {
if ((PositionCentered.Y /*- CollisionThickness*/) < (o.Collision.Top - collisionNudgeOffset)) {
velocity.Y = -velocity.X;
} else if ((PositionCentered.Y /*+ CollisionThickness*/) > (o.Collision.Bottom + collisionNudgeOffset)) {
velocity.Y = velocity.X;
}
}
velocity.X = 0.0f;
}
if (velocity.Y < 0.0f && CollisionUp(o)) {
if (CollisionNudgeEnabled && o.CollisionNudgeEnabled) {
if (PositionCentered.X < (o.Collision.Left - collisionNudgeOffset)) {
velocity.X = velocity.Y;
} else if (PositionCentered.X > (o.Collision.Right + collisionNudgeOffset)) {
velocity.X = -velocity.Y;
}
}
velocity.Y = 0.0f;
} else if (velocity.Y > 0.0f && CollisionDown(o)) {
if (CollisionNudgeEnabled && o.CollisionNudgeEnabled) {
if (PositionCentered.X < (o.Collision.Left - collisionNudgeOffset)) {
velocity.X = -velocity.Y;
} else if (PositionCentered.X > (o.Collision.Right + collisionNudgeOffset)) {
velocity.X = velocity.Y;
}
}
velocity.Y = 0.0f;
}
}
UPDATE:
So, I broke out some old physics formula books and had some sort of a revelation. I added updateTime = (float)gameTime.ElapsedGameTime.TotalSeconds; into the main update function of the character and changed the following code and now it seems to work (?):
private float accelDistance = 20f;
private float decelDistance = 60f;
public float velocityMaximum = 180f;
private float updateTime;
public float Acceleration { protected get { return accelDistance * updateTime; } set { accelDistance = value; } }
public float Deceleration { protected get { return decelDistance * updateTime; } set { decelDistance = value; } }
public float VelocityMaximum { protected get { return velocityMaximum * updateTime; } set { velocityMaximum = value; } }```
Now there is still the diagonal normalization to implement...