diff options
| author | Jules Laplace <jules@okfoc.us> | 2014-05-05 15:56:07 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2014-05-05 15:56:07 -0400 |
| commit | 9f4204d35f1dbd861417cd8a04bb26c46299f55a (patch) | |
| tree | 79a6f43198f38dba10de55d47c3995b83a29d263 /assets/javascripts/rectangles/engine/scenery/image.js | |
| parent | 79b0e1b0a127260978c69165466953ae86f6d6b2 (diff) | |
happy with refactor
Diffstat (limited to 'assets/javascripts/rectangles/engine/scenery/image.js')
| -rw-r--r-- | assets/javascripts/rectangles/engine/scenery/image.js | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/assets/javascripts/rectangles/engine/scenery/image.js b/assets/javascripts/rectangles/engine/scenery/image.js new file mode 100644 index 0000000..6434603 --- /dev/null +++ b/assets/javascripts/rectangles/engine/scenery/image.js @@ -0,0 +1,115 @@ +Scenery.image = function (wall, img) { + + var base = this + var center + var x = 0, y = 0, z = 0, bounds + var dragging = false + + // should be proportional to distance from wall + var cursor_amp = 1.5 + + base.init = function(){ + base.build() + base.bind() + } + + base.build = function(){ + center = wall.center_for(img) + base.mx_img = new MX.Image({ + src: img.src, + x: center.a, + y: Rooms.list[wall.room].height/2 - img.height/2 - 20, + z: center.b, + scale: 300/img.naturalWidth, + rotationY: wall_rotation[ wall.side ], + backface: false, + }) + scene.add( base.mx_img ) + } + + base.bind = function(){ + Scenery.mouse.bind_el(base.mx_img.el) + Scenery.mouse.on("down", down) + Scenery.mouse.on("enter", switch_wall) + Scenery.mouse.on("drag", drag) + Scenery.mouse.on("up", up) + } + + function down (e, cursor){ + if (e.target != base.mx_img.el) return; + dragging = true + x = base.mx_img.x + y = base.mx_img.y + z = base.mx_img.z + bounds = wall.bounds_for(img) + document.body.classList.add("dragging") + } + + function switch_wall (e, new_wall, cursor){ + if (! dragging) return + if (new_wall.uid == wall.uid) return + if (! new_wall.fits(img)) return + + bounds = new_wall.bounds_for(img) + center = new_wall.center_for(img) + + x = center.a + z = center.b + + var wall_group = wall.side | new_wall.side + + if (wall.side !== new_wall.side && wall_group !== FRONT_BACK && wall_group !== LEFT_RIGHT) { + switch (wall.side) { + case FRONT: + z = bounds.x.a + break + case BACK: + z = bounds.x.b + break + case LEFT: + x = bounds.x.a + break + case RIGHT: + x = bounds.x.b + break + } + } + + cursor.x.a = cursor.x.b + + base.mx_img.move({ + x: x, + z: z, + rotationY: wall_rotation[ new_wall.side ] + }) + + wall = new_wall + } + + function drag (e, cursor){ + if (! dragging) return + + base.mx_img.y = bounds.y.clamp( y - cursor.y.magnitude()*cursor_amp ) + switch (wall.side) { + case FRONT: + base.mx_img.x = bounds.x.clamp( x - cursor.x.magnitude()*cursor_amp ) + break + case BACK: + base.mx_img.x = bounds.x.clamp( x + cursor.x.magnitude()*cursor_amp ) + break + case LEFT: + base.mx_img.z = bounds.x.clamp( z + cursor.x.magnitude()*cursor_amp ) + break + case RIGHT: + base.mx_img.z = bounds.x.clamp( z - cursor.x.magnitude()*cursor_amp ) + break + } + } + + function up (e, cursor){ + dragging = false + document.body.classList.remove("dragging") + } + + return base +} |
