Skip to content

Instantly share code, notes, and snippets.

@JustinSDK
Last active August 29, 2015 14:06
Show Gist options
  • Save JustinSDK/0cb838a5b91a8aba9aea to your computer and use it in GitHub Desktop.
Save JustinSDK/0cb838a5b91a8aba9aea to your computer and use it in GitHub Desktop.
The answer of exercise 34 on http://reactive-extensions.github.io/learnrx/
function(sprite, spriteContainer) {
// All of the mouse event sequences look like this:
// seq([ {pageX: 22, pageY: 3423, offsetX: 14, offsetY: 22} ,,, ])
var spriteMouseDowns = Observable.fromEvent(sprite, "mousedown"),
spriteContainerMouseMoves = Observable.fromEvent(spriteContainer, "mousemove"),
spriteContainerMouseUps = Observable.fromEvent(spriteContainer, "mouseup"),
// Create a sequence that looks like this:
// seq([ {pageX: 22, pageY:4080 },,,{pageX: 24, pageY: 4082},,, ])
spriteMouseDrags =
// For every mouse down event on the sprite...
spriteMouseDowns.
flatMap(function(contactPoint) {
// ...retrieve all the mouse move events on the sprite container...
return spriteContainerMouseMoves.map(function(e) {
return {
pageX : e.pageX - contactPoint.offsetX,
pageY : e.pageY - contactPoint.offsetY
};
});
}).
takeUntil(spriteContainerMouseUps);
// For each mouse drag event, move the sprite to the absolute page position.
spriteMouseDrags.forEach(function(dragPoint) {
sprite.style.left = dragPoint.pageX + "px";
sprite.style.top = dragPoint.pageY + "px";
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment