<!DOCTYPE HTML>
<html>
<head>
<!-- Shamelessly adapted from pixi.js Example 8 - Dragging -->
<title>Sprite to Mouse Snapping issue</title>
<script src="pixi.js"></script>
</head>
<body>
<script>
var stage = new PIXI.Stage(0x97c56e, true);
var renderer = PIXI.autoDetectRenderer(window.innerWidth, window.innerHeight, null);
// add the renderer view element to the DOM
document.body.appendChild(renderer.view);
renderer.view.style.position = "absolute";
renderer.view.style.top = "0px";
renderer.view.style.left = "0px";
requestAnimFrame( animate );
// create a texture from an image path
var texture = PIXI.Texture.fromImage("aboriginal-bunny.png");
createAboriginalBunny(100, 100);
function createAboriginalBunny(x, y)
{
var bunny = new PIXI.Sprite(texture);
bunny.setInteractive(true);
// leaving anchor point at 10% to illustrate the problem clearer
bunny.anchor.x = 0.1;
bunny.anchor.y = 0.1;
/*
* Set-up dragging
*/
bunny.mousedown = bunny.touchstart = function(data)
{
this.data = data;
this.alpha = 0.5;
this.dragging = true;
};
bunny.mouseup = bunny.mouseupoutside = bunny.touchend = bunny.touchendoutside = function(data)
{
this.alpha = 1
this.dragging = false;
// set the interaction data to null
this.data = null;
};
bunny.mousemove = bunny.touchmove = function(data)
{
if(this.dragging)
{
// need to get parent coords..
var newPosition = this.data.getLocalPosition(this.parent);
this.position.x = newPosition.x;
this.position.y = newPosition.y;
}
}
// move the sprite to initial pos
bunny.position.x = x;
bunny.position.y = y;
stage.addChild(bunny);
}
function animate() {
requestAnimFrame( animate );
renderer.render(stage);
}
</script>
</body>
</html>
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рд╕реНрддреГрдд рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрдм рд╣рдореЗрдВ рдЗрддрдиреА рдЬрд╛рдирдХрд╛рд░реА рджреА рдЬрд╛рддреА рд╣реИ рддреЛ рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓рддреА рд╣реИ!
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдПрдХ рдмрдЧ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдорд╛рдЙрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдпрд╣реА рдХрд░рддрд╛ рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдорд╛рдЙрд╕ рдЖрдВрджреЛрд▓рди рдХреЗ рдбреЗрд▓реНрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
/*
* Set-up dragging
*/
bunny.mousedown = bunny.touchstart = function(data)
{
this.data = data;
this.alpha = 0.5;
this.dragging = this.data.getLocalPosition(this.parent);;
};
bunny.mouseup = bunny.mouseupoutside = bunny.touchend = bunny.touchendoutside = function(data)
{
this.alpha = 1
this.dragging = false;
// set the interaction data to null
this.data = null;
};
bunny.mousemove = bunny.touchmove = function(data)
{
if(this.dragging)
{
// need to get parent coords..
var newPosition = this.data.getLocalPosition(this.parent);
this.position.x += (newPosition.x - this.dragging.x);
this.position.y += (newPosition.y - this.dragging.y);
this.dragging = newPosition;
}
}
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ mousedown
рдореИрдВ рдорд╛рдЙрд╕ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ, рдлрд┐рд░ mousemove
рдореИрдВ рдЕрдкрдиреА рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдЙрд╕ рдиреЗ _moved_ (рдЗрд╕реЗ рдирдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ), рдлрд┐рд░ рдореИрдВ рдЕрдЧрд▓реА рдмрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рд╣реВрдБ рдХреА рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА!
рдирдорд╕реНрддреЗ,
рдпрд╣ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред рдФрд░ рд╣рд╛рдВ, рдореЗрд░рд╛ рдХреЛрдб рдЗрд╕ рдмрд╛рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ, рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдВ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред :рдкреА
рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢реНрди, рдХреНрдпрд╛ рдорд╛рдЙрд╕рдЕрдк рдкрд░ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдбреЗрдЯрд╛ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рдЦреНрддреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдореИрдВ рдЕрднреА рднреА рдЕрд╕реНрдкрд╖реНрдЯ рд╣реВрдВ рдЬрдм getLocalPosition рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрдирд╛рдо рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ред
рдкреБрдирд╢реНрдЪ. рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдкреБрди: рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рд╡рд┐рд╡рд░рдг, рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред :)
getLocalPosition
рдХрд╛ рдХрд╛рд░рдг рдорд╛рдЙрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рдирд┐рд░рдкреЗрдХреНрд╖ рдХреЛрд░реНрдбреНрд╕ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╕рд╛рдкреЗрдХреНрд╖ рдХреЙрд░реНрдб рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ рдЬреЛ DisplayObjects рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╕реНрдкреНрд▓реЗрдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреВрд░реНрдг рдорд╛рдЙрд╕ рдХреЙрд░реНрдб рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ this.data.getLocalPosition(this.parent)
рд╕рд╛рде рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред
рдорд╛рдЙрд╕рдЕрдк рдкрд░ this.data = null
рд╕реЗрдЯ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ data
рдкрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ this.data
рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж; рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд▓рдореЗрд▓ рдмрд┐рдард╛рдирд╛ред рдореЗрд░реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдордп рдкрд░ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдкрд┐рдХреНрд╕реА рджреЗрд╡реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВред
рдЗрд╕ рдереНрд░реЗрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдХреГрдкрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рд╕реНрддреГрдд рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрдм рд╣рдореЗрдВ рдЗрддрдиреА рдЬрд╛рдирдХрд╛рд░реА рджреА рдЬрд╛рддреА рд╣реИ рддреЛ рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓рддреА рд╣реИ!
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдПрдХ рдмрдЧ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдорд╛рдЙрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдпрд╣реА рдХрд░рддрд╛ рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдорд╛рдЙрд╕ рдЖрдВрджреЛрд▓рди рдХреЗ рдбреЗрд▓реНрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕
mousedown
рдореИрдВ рдорд╛рдЙрд╕ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ, рдлрд┐рд░mousemove
рдореИрдВ рдЕрдкрдиреА рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдЙрд╕ рдиреЗ _moved_ (рдЗрд╕реЗ рдирдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ), рдлрд┐рд░ рдореИрдВ рдЕрдЧрд▓реА рдмрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рд╣реВрдБ рдХреА рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА!