เกมแดร็กเกอร์

ตัวลากคือออบเจ็กต์ตัวควบคุมที่ประสานการลากรายการที่ลากได้เพื่อตอบสนองต่อการโต้ตอบของผู้ใช้

มีบางกรณีที่คุณอาจต้องการใช้เครื่องมือลากที่กำหนดเอง เนื่องจากมีเพียงไม่กี่สิ่งที่คุณอาจต้องการปรับแต่งเกี่ยวกับการประสานการลาก ปลั๊กอิน scroll-options ใช้เครื่องมือลากที่กำหนดเองเนื่องจากต้องการเพิ่มการเลื่อนที่ขอบของพื้นที่ทํางาน ซึ่งจะเปลี่ยนวิธีแปลงพิกัดพิกเซลเป็นพิกัดพื้นที่ทํางาน

หน้าที่รับผิดชอบ

ผู้ลากมีหน้าที่รับผิดชอบหลายอย่างเมื่อดำเนินการการลาก:

  • การเรียกใช้เมธอดการลากในรายการที่ลากได้
  • การคำนวณตำแหน่งที่รายการที่ลากได้ควรย้ายไปในรูปแบบพิกัดของพื้นที่ทำงาน
  • การเรียกใช้เมธอดเป้าหมายการลากบนเป้าหมายการลากเมื่อวางเมาส์เหนือเป้าหมาย

การใช้งาน

หากต้องการสร้างตัวลากที่กำหนดเอง คุณต้องติดตั้งใช้งานอินเทอร์เฟซ IDragger

class MyDragger implements IDragger {
 
// Takes in the draggable being dragged and the workspace the drag
 
// is occurring in.
  constructor
(draggable, workspace);
}

นอกจากนี้ คุณยังสร้างคลาสย่อยของ Blockly.dragging.Dragger ในตัวซึ่งจัดการหน้าที่พื้นฐานอยู่แล้วได้ด้วย

เริ่มการลาก

เมธอด onDragStart จะเริ่มต้นการลาก มันควรจัดเก็บข้อมูลที่จำเป็นในการ เรียกใช้การลาก นอกจากนี้ ควรเรียก startDrag ในรายการที่ลากได้ซึ่งกำลังลาก

onDragStart(e) {
 
this.startLoc = this.draggable.getRelativeToSurfaceXY();

 
this.draggable.startDrag(e);
}

ลาก

เมธอด onDrag จะทำการลาก ระบบควรคำนวณตำแหน่งพื้นที่ทำงานใหม่สำหรับการลากได้โดยอิงตาม totalDelta ซึ่งระบุไว้ในพิกัดพิกเซล

และควรอัปเดตเป้าหมายการลากที่วางอยู่เหนือตำแหน่งนั้นด้วย

  • คุณควรเรียกใช้ wouldDelete ก่อนเรียกใช้ฮุกอื่นๆ บนเป้าหมายการลากเสมอ
  • คุณควรเรียกใช้ onDragExit กับเป้าหมายการลากเดิมเสมอก่อนที่จะเรียกใช้ onDragEnter กับเป้าหมายการลากใหม่
  • onDragOver ควรเรียกใช้หลังจาก onDragEnter ครั้งแรกที่วางเมาส์เหนือเป้าหมายการลาก และในการเรียกใช้ onDrag แต่ละครั้งเพิ่มเติมเมื่อยังคงวางเมาส์เหนือเป้าหมายการลาก
onDrag(e, totalDelta) {
 
// Update the draggable location.
 
const delta = this.pixelsToWorkspaceUnits(totalDelta);
 
const newLoc = Coordinate.sum(this.startLoc, delta);
 
this.draggable.drag(newLoc, e);

 
// Call wouldDeleteDraggable.
 
if (isDeletable(this.draggable)) {
   
this.draggable.setDeleteStyle(
     
// Checks that the drag target is an `IDeleteArea` and calls `wouldDelete`
     
// on it.
     
this.wouldDeleteDraggable(e, this.draggable),
   
);
 
}

 
const newDragTarget = this.workspace.getDragTarget(e);
 
if (this.dragTarget !== newDragTarget) {
   
// Call `onDragExit` then `onDragEnter`.
   
this.dragTarget?.onDragExit(this.draggable);
    newDragTarget
?.onDragEnter(this.draggable);
 
}
 
// Always call `onDragOver`
  newDragTarget
?.onDragOver(this.draggable);
 
this.dragTarget = newDragTarget;
}

สิ้นสุดการลาก

เมธอด onEndDrag จะสิ้นสุดการลาก ระบบควรแจ้งให้คนที่ลากได้ทราบว่าการลากนั้นสิ้นสุดแล้ว และเป้าหมายการลากที่วางไว้ชี้ว่าได้วางเนื้อหาที่ลากได้ไปแล้ว และควรกำจัดรายการที่ลากได้หากเป้าหมายการลากเป็นพื้นที่ลบ

  • onDrop ควรเรียกใช้ก่อนเมธอดอื่นๆ เสมอ
  • ควรเรียก revertDrag หากเป้าหมายการลากป้องกันการลาก
  • ควรเรียกใช้ endDrag หลังจากเปลี่ยนกลับการลาก แต่ก่อนที่จะกำจัด
  • ควรเรียก dispose หากเป้าหมายการลากเป็นพื้นที่ที่มีการลบ
onDragEnd(e) {
 
// Call `onDrop` first.
 
const dragTarget = this.workspace.getDragTarget(e);
 
if (dragTarget) {
   
this.dragTarget?.onDrop(this.draggable);
 
}

 
// Then revert the drag (if applicable).
 
if (this.shouldReturnToStart(e, this.draggable)) {
   
this.draggable.revertDrag();
 
}

 
// Then end the drag.
 
this.draggable.endDrag(e);

 
// Then delete the draggable (if applicable).
 
if (
    isDeletable
(this.draggable) &&
   
this.wouldDeleteDraggable(e, this.draggable)
 
) {
   
this.draggable.dispose();
 
}
}

การลงทะเบียน

คุณต้องลงทะเบียนคลาสตัวลากเพื่อให้ระบบสร้างคลาสได้เมื่อตรวจพบการลาก

// Note that the type is BLOCK_DRAGGER even though draggers drag more than
// blocks. The name is for backwards compatibility.
Blockly.registry.register(registry.Type.BLOCK_DRAGGER, 'MY_DRAGGER', MyDragger);

การใช้งาน

หลังจากติดตั้งใช้งานเครื่องมือลากที่กำหนดเองแล้ว คุณจะใช้เครื่องมือดังกล่าวได้โดยส่งไปยังโครงสร้างการกำหนดค่าการแทรก

const myWorkspace = Blockly.inject('blocklyDiv', {
  plugins
: {
   
// Note that we pass this to blockDragger even though draggers drag more
   
// than blocks. The name is for backwards compatibility.
    blockDragger
: MyDragger,
 
},
});