/// <summary> /// Cette fonction s'occupe juste de voir si à une position, pour un objet, il y a une potentielle collision (un objet ou les limites du terrain) /// si c'est un objet, il retourne sa composante physique (et si y'a pas de composante physique il retourne null ( un objet sans compôsante physique est comme un fantome)) /// si c'est une limite du terrain, il crée un objet temporaire qui se comporte comme un mur /// </summary> /// <param name="p">L'objet qui veut vérifier si y'a pas de collision</param> /// <param name="destination">L'endroit ou il veut aller</param> /// <returns></returns> public virtual BasePhysics collisionCheck(BasePhysics p, Vect2D destination) { //On regarde si on est bien dans les boundaries du niveau if (destination.x < 0) { return(new BasePhysics(-1, destination.y, p.pos.layer)); } else if (destination.x > this.worldLength) { return(new BasePhysics(this.worldLength, destination.y, p.pos.layer)); } if (destination.y < 0) { return(new BasePhysics(destination.x, -1, p.pos.layer)); } else if (destination.y > this.worldHeight) { return(new BasePhysics(destination.x, this.worldHeight, p.pos.layer)); } WorldObject collided = getCollidedObject(p, destination); if (collided != null) { return(collided.physics); } return(null); // pas de collision ! }
public virtual Vect2D onCollide(BasePhysics obj, Vect2D hisTrajectory) //Représente la réaction de l'objet quand il subit une collision { Vect2D renvoi = (obj.pos.pos - this.pos.pos).normalize(); //Ici, repousse simplement l'objet à la case d'avant (comportement basique d'un mur) return(renvoi); //Il serait possible d'être plus fancy, en déplacant les deux objets impliqués par exemple (action, réaction) //On peut aussi appliquer une réaction inverse }
/// <summary> /// Quand il y a une collision, gere la communication entre les deux objets physics /// </summary> /// <param name="collided"></param> /// <param name="movement"></param> /// <returns></returns> public Vect2D resolveCollision(BasePhysics collided, Vect2D movement) { //verifie si il peut bouger Vect2D opposedMovement = collided.onCollide(this, movement); Vect2D newMovement = movement - opposedMovement; return(newMovement); }
public Vect2D checkTeleportation(Vect2D movement) { //Verifie si il peut se tp là. Si il y a quelque chose, la teleportation ne se fait pas Vect2D newMovement; newMovement = movement; BasePhysics collided = this.checkForCollision(this, movement); if (!collided.onTpCollide(this, movement)) //Est ce que je peux me téléporter dessus? { newMovement = new Vect2D(0, 0); } return(newMovement); }
public WorldObject getCollidedObject(BasePhysics p, Vect2D destination) { Vect2D normalizedDirection = destination.normalize(); Vect2D currentPosCursor = p.pos.pos.Copy(); for (int i = 0; i < Vect2D.getDistance(destination, new Vect2D(0, 0)); i++) { currentPosCursor += normalizedDirection; //Si oui on regarde si là ou on veut aller, il y a déjà un objet (détection de collision très basique) WorldObject collidedObject = getObjectAt(currentPosCursor.x, currentPosCursor.y); if (collidedObject != null && collidedObject.pos.layer == p.pos.layer) { return(collidedObject); } } return(null); }
public virtual bool onTpCollide(BasePhysics obj, Vect2D hisTrajectory) // Si un objet veut se téléporter à la position de celui ci { return(false); }