<!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
أقوم بتحديث موضع الكائن الخاص بي عن طريق مقدار _Move_M الفأر (لم يتم تعيينه على الموضع الجديد) ، ثم أقوم بتحديث موضع الماوس المخزن للمرة القادمة. آمل أن يساعد هذا!
مرحبا،
هذا يحل مشكلتي ، وهو أوضح بكثير لفهمه ، شكرًا. ونعم ، يعتمد الكود الخاص بي على كيفية عمل المثال ، لذا سيكون جيدًا إذا أمكن تحديث المثال - أذكر أنني واجهت مشكلة في فهم كيفية عمله ، أعتقد أنه لم يعمل بشكل كامل. : ص
سؤال ذو صلة ، هل هناك حاجة صارمة لتعيين بيانات التفاعل إلى قيمة خالية عند النقر بالماوس؟
ما زلت غير واضح أيضًا متى يكون getLocalPosition مطلوبًا ، مقابل الوظيفة الحالية فقط.
ملاحظة. لا تقلق بشأن: تفاصيل تقرير الشوائب ، أقل ما يمكنني فعله. شكرا لتوفير المكتبة. :)
سبب getLocalPosition
هو تحويل الأوتار المطلقة لحدث الماوس ، إلى روابط نسبية محلية تستخدمها DisplayObjects. يكون موضع كل كائن DisplayObject نسبيًا إلى أصله ، لذلك نأخذ أسلاك الماوس المطلقة ونحولها لتكون ذات صلة بالأصل الذي يحتوي على this.data.getLocalPosition(this.parent)
.
ليس من الضروري تحديد this.data = null
عند تمرير الماوس. حقًا ، يجب أن تكون قادرًا فقط على استخدام المعلمة data
لكل وظيفة ، وعدم استخدام this.data
على الإطلاق.
شكرا مرة أخرى لمساعدتكم؛ جديد تمامًا على libs الرسومات ، لذا فهم خيارات التنفيذ المختلفة. نقدر مطوري pixi الذين يأخذون الوقت الكافي للإجابة على أسئلتي في الوقت المناسب.
تم قفل سلسلة الرسائل هذه تلقائيًا نظرًا لعدم وجود أي نشاط حديث بعد إغلاقه. الرجاء فتح قضية جديدة للأخطاء ذات الصلة.
التعليق الأكثر فائدة
بادئ ذي بدء ، شكرًا لك على تقرير الخطأ التفصيلي ونموذج الكود ، فهو يساعد كثيرًا عندما يتم تزويدنا بالكثير من المعلومات!
لسوء الحظ ، هذا ليس خطأ. تحدث هذه المشكلة بسبب قيامك بتعيين موضع الكائن على موضع الماوس في كل حركة ماوس (على الأرجح لأن هذا هو ما يفعله المثال). حقًا ، ما يجب أن يحدث هو أنه يجب عليك تحديث كائنك بواسطة دلتا حركة الماوس. جرب شيئًا كهذا:
البتات المهمة موجودة على
mousedown
أقوم بتخزين موقع الماوس ، ثم فيmousemove
أقوم بتحديث موضع الكائن الخاص بي عن طريق مقدار _Move_M الفأر (لم يتم تعيينه على الموضع الجديد) ، ثم أقوم بتحديث موضع الماوس المخزن للمرة القادمة. آمل أن يساعد هذا!