<!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>
En primer lugar, gracias por el informe de error detallado y el código de muestra, ¡ayuda mucho cuando recibimos tanta información!
Desafortunadamente, esto no es un error. Este problema se debe a que estableces la posición del sprite en la posición del mouse con cada movimiento del mouse (probablemente porque eso es lo que hace el ejemplo). Realmente, lo que debería suceder es que deberías actualizar tu sprite por el delta del movimiento del mouse. Prueba algo como esto:
/*
* 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;
}
}
Los bits importantes están en mousedown
Guardo la ubicación del mouse, luego en mousemove
actualizo la posición de mi sprite por cuánto se ha _movido_ el mouse (no lo configuro en la nueva posición), luego Actualizo la posición almacenada del mouse para la próxima vez. ¡Espero que esto ayude!
Hola,
Esto resuelve mi problema y es mucho más claro de entender, gracias. Y sí, mi código se basa en cómo funciona el ejemplo, por lo que sería bueno si el ejemplo pudiera actualizarse. Recuerdo que tuve problemas para entender cómo funcionaba, supongo que no funcionó por completo. :PAGS
Una pregunta relacionada, ¿es estrictamente necesario establecer los datos de interacción en nulos al colocar el mouse hacia arriba?
Tampoco tengo claro cuándo se requiere getLocalPosition, frente a solo la posición actual.
PD. no se preocupe con respecto a: detalle del informe de error, al menos puedo hacer. Gracias por proporcionar la biblioteca. :)
La razón de getLocalPosition
es transformar las coordenadas absolutas del evento del mouse, en las coordenadas relativas locales que usan DisplayObjects. La posición de cada DisplayObject es relativa a su padre, por lo que tomamos las coordenadas absolutas del mouse y las transformamos para que sean relativas al padre con this.data.getLocalPosition(this.parent)
.
No es particularmente necesario configurar this.data = null
en mouseup. Realmente debería poder usar el data
para cada función, y no usar this.data
en absoluto.
De nuevo, gracias por tu ayuda; bastante nuevo en las librerías de gráficos, así que acepta varias opciones de implementación. Agradezco a los desarrolladores de pixi que se hayan tomado el tiempo de responder a mis preguntas de manera oportuna.
Este hilo se ha bloqueado automáticamente ya que no ha habido ninguna actividad reciente después de que se cerró. Abra un nuevo problema para errores relacionados.
Comentario más útil
En primer lugar, gracias por el informe de error detallado y el código de muestra, ¡ayuda mucho cuando recibimos tanta información!
Desafortunadamente, esto no es un error. Este problema se debe a que estableces la posición del sprite en la posición del mouse con cada movimiento del mouse (probablemente porque eso es lo que hace el ejemplo). Realmente, lo que debería suceder es que deberías actualizar tu sprite por el delta del movimiento del mouse. Prueba algo como esto:
Los bits importantes están en
mousedown
Guardo la ubicación del mouse, luego enmousemove
actualizo la posición de mi sprite por cuánto se ha _movido_ el mouse (no lo configuro en la nueva posición), luego Actualizo la posición almacenada del mouse para la próxima vez. ¡Espero que esto ayude!