Skip to main content
deleted 842 characters in body
Source Link
    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...

    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...

    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;
            }
        }
```
added 1 character in body
Source Link
    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; } }
    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; } }
    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; } }
edited body
Source Link
    private float accelDistance = 20f;
    private float decelDistance = 60f;
    public float VelocityMaximumvelocityMaximum = 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; } }
    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; } }
    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; } }
added 1 character in body
Source Link
Loading
added 126 characters in body
Source Link
Loading
added 22 characters in body
Source Link
Loading
added 15 characters in body
Source Link
Loading
added 568 characters in body
Source Link
Loading
added 20 characters in body
Source Link
Loading
added 50 characters in body
Source Link
Loading
Source Link
Loading