summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/javascripts/mx/extensions/mx.movements.js14
-rw-r--r--assets/javascripts/rectangles/engine/builder.js24
-rw-r--r--assets/javascripts/rectangles/engine/mover.js32
-rw-r--r--assets/javascripts/rectangles/models/room.js28
-rw-r--r--assets/javascripts/rectangles/util/keys.js2
-rw-r--r--rectangles.html7
6 files changed, 87 insertions, 20 deletions
diff --git a/assets/javascripts/mx/extensions/mx.movements.js b/assets/javascripts/mx/extensions/mx.movements.js
index 6837637..cb6af14 100644
--- a/assets/javascripts/mx/extensions/mx.movements.js
+++ b/assets/javascripts/mx/extensions/mx.movements.js
@@ -24,6 +24,8 @@ MX.Movements = function (cam, viewHeight) {
creepFactor = 0.3
var DEFAULT_SCALE = scale = 1.0
+
+ var pos = { x: 0, y: 0, z: 0, rotationX: 0, rotationY: 0 }
return {
@@ -193,6 +195,10 @@ MX.Movements = function (cam, viewHeight) {
var ry = cam.rotationY
var s = creeping ? scale * creepFactor : scale
var vrrrr = creeping ? vr * creepFactor * 5 : vr
+
+ pos.x = cam.x
+ pos.y = cam.y
+ pos.z = cam.z
if (moveForward || moveBackward || moveRight || moveLeft || moveUp || moveDown || turnLeft || turnRight || turnUp || turnDown) {
@@ -234,12 +240,12 @@ MX.Movements = function (cam, viewHeight) {
cam.rotationY -= vrrrr
}
- cam.x += vx
- cam.y += vy
- cam.z += vz
+ pos.x += vx
+ pos.y += vy
+ pos.z += vz
if (vx || vz) {
- app.tube("move", cam)
+ app.tube("move", pos)
}
}
diff --git a/assets/javascripts/rectangles/engine/builder.js b/assets/javascripts/rectangles/engine/builder.js
index c48e8e4..42ef76b 100644
--- a/assets/javascripts/rectangles/engine/builder.js
+++ b/assets/javascripts/rectangles/engine/builder.js
@@ -113,7 +113,8 @@ var builder = new function(){
for (var i = 0; i < already_constructed.length; i++) {
if (already_constructed[i].rect.contains(r)) {
intersected = true
- r.sides = 0xf
+ // r.sides = 0xf
+ // half_sides
}
else if (already_constructed[i].rect.intersects(r)) {
intersected = true
@@ -156,7 +157,7 @@ var builder = new function(){
var depth = r.y.length()
var height = hi.height - lo.height
- if (! (r.sides & LEFT) && r.x.a == hi.rect.x.a) {
+ if (! (r.half_sides & LEFT) && r.x.a == hi.rect.x.a) {
el = make_wall('.left')
el.rotationY = HALF_PI
el.height = height
@@ -165,11 +166,11 @@ var builder = new function(){
el.y = lo.height + height/2
el.z = r.y.a + depth/2
list.push(el)
- r.sides |= LEFT
- console.log(hi.height, lo.height)
+ hi.$walls.push(el.el)
+ r.half_sides |= LEFT
}
- if (! (r.sides & RIGHT) && r.x.b == hi.rect.x.b) {
+ if (! (r.half_sides & RIGHT) && r.x.b == hi.rect.x.b) {
el = make_wall('.right')
el.rotationY = -HALF_PI
el.height = height
@@ -178,10 +179,11 @@ var builder = new function(){
el.y = lo.height + height/2
el.z = r.y.b - depth/2
list.push(el)
- r.sides |= RIGHT
+ hi.$walls.push(el.el)
+ r.half_sides |= RIGHT
}
- if (! (r.sides & FRONT) && r.y.a == hi.rect.y.a) {
+ if (! (r.half_sides & FRONT) && r.y.a == hi.rect.y.a) {
el = make_wall('.front')
el.width = width
el.height = height
@@ -190,10 +192,11 @@ var builder = new function(){
el.y = lo.height + height/2
el.z = r.y.a
list.push(el)
- r.sides |= FRONT
+ hi.$walls.push(el.el)
+ r.half_sides |= FRONT
}
- if (! (r.sides & BACK) && r.y.b == hi.rect.y.b) {
+ if (! (r.half_sides & BACK) && r.y.b == hi.rect.y.b) {
el = make_wall('.back')
el.width = width
el.height = height
@@ -202,7 +205,8 @@ var builder = new function(){
el.y = lo.height + height/2
el.z = r.y.b
list.push(el)
- r.sides |= BACK
+ hi.$walls.push(el.el)
+ r.half_sides |= BACK
}
return list
}
diff --git a/assets/javascripts/rectangles/engine/mover.js b/assets/javascripts/rectangles/engine/mover.js
index 90cabdd..5a1f7d9 100644
--- a/assets/javascripts/rectangles/engine/mover.js
+++ b/assets/javascripts/rectangles/engine/mover.js
@@ -13,13 +13,32 @@ var mover = new function(){
}
base.update = function(pos){
- if (base.room && base.room.rect.contains(pos.x, pos.z)) return;
+ cam.y = pos.y
- var intersects = []
- clipper.rooms.forEach(function(r){
- if (r.rect.contains(pos.x, pos.z)) {
- intersects.push(r)
+ // if we were in a room
+ if (base.room) {
+ // check if we're still in the room
+ if (base.room.rect.contains(pos.x, pos.z)) {
+ cam.x = pos.x
+ cam.z = pos.z
+ return
}
+ // check if we've crossed one of the walls.. clamp position if so
+ var collision = base.room.collides(pos.x, pos.z)
+ if (collision) {
+ if (! (collision & LEFT || collision & RIGHT)) {
+ cam.x = pos.x
+ }
+ if (! (collision & FRONT || collision & BACK)) {
+ cam.z = pos.z
+ }
+ return
+ }
+ }
+
+ // otherwise we've either entered into a new room, or broken free
+ var intersects = clipper.rooms.filter(function(r){
+ return r.rect.contains(pos.x, pos.z)
})
$(".face.active").removeClass("active")
@@ -32,6 +51,9 @@ var mover = new function(){
else {
base.room = null
}
+
+ cam.x = pos.x
+ cam.z = pos.z
}
}
diff --git a/assets/javascripts/rectangles/models/room.js b/assets/javascripts/rectangles/models/room.js
index 3ccf1fb..c760174 100644
--- a/assets/javascripts/rectangles/models/room.js
+++ b/assets/javascripts/rectangles/models/room.js
@@ -40,7 +40,35 @@ window.room = (function(){
}
this.regions = regions
}
+
+ room.prototype.collides = function(x,y){
+ var collision = 0
+ this.regions.forEach(function(r){
+ if (! r.sides) return
+
+ if ((r.sides & FRONT) && y < r.y.a && r.x.contains(x)) {
+ collision |= FRONT
+ }
+ if ((r.sides & BACK) && r.y.b < y && r.x.contains(x)) {
+ collision |= BACK
+ }
+ if ((r.sides & LEFT) && x < r.x.a && r.y.contains(y)) {
+ collision |= LEFT
+ }
+ if ((r.sides & RIGHT) && r.x.b < x && r.y.contains(y)) {
+ collision |= RIGHT
+ }
+ })
+ return collision
+ }
return room
})()
+
+function bitcount(v) {
+ v = v - ((v >>> 1) & 0x55555555);
+ v = (v & 0x33333333) + ((v >>> 2) & 0x33333333);
+ return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24;
+}
+
diff --git a/assets/javascripts/rectangles/util/keys.js b/assets/javascripts/rectangles/util/keys.js
index 03abe50..e0ab045 100644
--- a/assets/javascripts/rectangles/util/keys.js
+++ b/assets/javascripts/rectangles/util/keys.js
@@ -17,7 +17,7 @@ var keys = (function(){
case undefined:
break;
default:
- console.log(key)
+ // console.log(key)
break;
}
})
diff --git a/rectangles.html b/rectangles.html
index 9713561..d2b1330 100644
--- a/rectangles.html
+++ b/rectangles.html
@@ -25,6 +25,7 @@ body > div {
.floor { background-color: #00f; }
.ceiling { background-color: #f00; }
+
.active.front { background-color: #ddf; }
.active.back { background-color: #bbe; }
.active.left { background-color: #aad; }
@@ -32,6 +33,12 @@ body > div {
.active.floor { background-color: #0ff; }
.active.ceiling { background-color: #ff0; }
+/*
+.face {
+ background-image: url(http://i.asdf.us/im/6f/bgdither_1398274442_jules.gif);
+ background-color: transparent;
+}
+ */
#map canvas {
border-bottom: 2px solid #ddd;