Rooms.mover = new function(){ var base = this base.room = null base.noclip = false base.init = function(){ base.bind() base.update(scene.camera) } base.bind = function(){ app.on("move", base.update) keys.on("backslash", function(){ base.noclip = ! base.noclip base.room = null app.movements.gravity( ! base.noclip ) }) } base.update = function(pos){ var radius = scene.camera.radius if (base.noclip) { cam.x = pos.x cam.y = pos.y cam.z = pos.z return } cam.y = pos.y // if we were in a room already.. if (base.room) { // check if we're still in the room if (base.room.rect.containsDisc(pos.x, pos.z, radius)) { cam.x = pos.x cam.z = pos.z return } // check if we've breached one of the walls.. clamp position if so var collision = base.room.collidesDisc(pos.x, pos.z, radius) if (collision) { cam.x = (collision & LEFT_RIGHT) ? base.room.rect.x.clampDisc(pos.x, radius) : pos.x cam.z = (collision & FRONT_BACK) ? base.room.rect.y.clampDisc(pos.z, radius) : pos.z return } // in this case, we appear to have left the room.. $(".face.active").removeClass("active") base.room = null } // collision test failed, so update position cam.x = pos.x cam.z = pos.z // determine what room we are in now var intersects = Rooms.filter(function(r){ return r.rect.contains(pos.x, pos.z) }) // did we actually enter a room? if (intersects.length) { base.room = intersects[0] base.room.mx_floor.forEach(function(w){ $(w.el).addClass("active") }) base.room.mx_ceiling.forEach(function(w){ $(w.el).addClass("active") }) base.room.mx_walls.forEach(function(w){ $(w.el).addClass("active") }) } } }