summaryrefslogtreecommitdiff
path: root/assets/javascripts/rectangles
diff options
context:
space:
mode:
Diffstat (limited to 'assets/javascripts/rectangles')
-rw-r--r--assets/javascripts/rectangles/_env.js2
-rw-r--r--assets/javascripts/rectangles/engine/mover.js5
-rw-r--r--assets/javascripts/rectangles/models/rect.js2
-rw-r--r--assets/javascripts/rectangles/models/room.js37
4 files changed, 43 insertions, 3 deletions
diff --git a/assets/javascripts/rectangles/_env.js b/assets/javascripts/rectangles/_env.js
index d41d490..9bdad6a 100644
--- a/assets/javascripts/rectangles/_env.js
+++ b/assets/javascripts/rectangles/_env.js
@@ -10,7 +10,7 @@ environment.init = function(){
"rotationY": PI/2, // PI
})
- scene.camera.radius = 25
+ scene.camera.radius = 20
}
map.center.a = scene.camera.x
diff --git a/assets/javascripts/rectangles/engine/mover.js b/assets/javascripts/rectangles/engine/mover.js
index 66c1813..71656ef 100644
--- a/assets/javascripts/rectangles/engine/mover.js
+++ b/assets/javascripts/rectangles/engine/mover.js
@@ -28,12 +28,15 @@ var mover = new function(){
}
// check if we've breached one of the walls.. clamp position if so
- var collision = base.room.collides(pos.x, pos.z, radius)
+ var collision = base.room.collidesDisc(pos.x, pos.z, radius)
if (collision) {
if (! (collision & LEFT_RIGHT)) {
cam.x = base.room.rect.x.clampDisc(pos.x, radius)
}
+ else {
+ // cam.x = base.room.rect.x.clampDisc(pos.x, radius)
+ }
if (! (collision & FRONT_BACK)) {
cam.z = base.room.rect.y.clampDisc(pos.z, radius)
}
diff --git a/assets/javascripts/rectangles/models/rect.js b/assets/javascripts/rectangles/models/rect.js
index 51162c0..0664693 100644
--- a/assets/javascripts/rectangles/models/rect.js
+++ b/assets/javascripts/rectangles/models/rect.js
@@ -59,7 +59,7 @@ window.rect = (function(){
return this.x.contains(x) && this.y.contains(y)
}
rect.prototype.containsDisc = function(x,y,r){
- return this.x.contains(x,r) && this.y.contains(y,r)
+ return this.x.containsDisc(x,r) && this.y.containsDisc(y,r)
}
rect.prototype.intersects = function(r){
return this.x.intersects(r.x) && this.y.intersects(r.y)
diff --git a/assets/javascripts/rectangles/models/room.js b/assets/javascripts/rectangles/models/room.js
index f0ebc76..b66d868 100644
--- a/assets/javascripts/rectangles/models/room.js
+++ b/assets/javascripts/rectangles/models/room.js
@@ -94,6 +94,43 @@ window.room = (function(){
return collision
}
+ room.prototype.collidesDisc = function(x,y,radius){
+ var collision = 0, wall_collision, contains_x, contains_y
+ this.regions.forEach(function(r){
+ if (! r.sides) return
+
+ wall_collision = 0
+
+ if ((r.sides & FRONT) && y-radius < r.y.a) {
+ wall_collision |= FRONT
+ }
+ if ((r.sides & BACK) && r.y.b < y+radius) {
+ wall_collision |= BACK
+ }
+ if ((r.sides & LEFT) && x-radius < r.x.a) {
+ wall_collision |= LEFT
+ }
+ if ((r.sides & RIGHT) && r.x.b < x+radius) {
+ wall_collision |= RIGHT
+ }
+ if (! wall_collision) return
+
+ contains_x = r.x.contains(x, radius)
+ contains_y = r.y.contains(y, radius)
+
+ if (contains_x) {
+ collision |= wall_collision & FRONT_BACK
+ }
+ else if (contains_y) {
+ collision |= wall_collision & LEFT_RIGHT
+ }
+ else if (bitcount(wall_collision) > 1) {
+ collision |= wall_collision
+ }
+ })
+ return collision
+ }
+
return room
})()