feat: dnd

This commit is contained in:
hypercross 2026-04-17 21:55:14 +08:00
parent 0ecef16a4a
commit 23575dd516
3 changed files with 75 additions and 0 deletions

View File

@ -2,6 +2,10 @@
export { DisposableBag } from './utils';
export type { IDisposable, DisposableItem } from './utils';
// Drag & drop utilities
export { dragDropEventEffect, DragDropEventType } from './utils';
export type { DragDropEvent } from './utils';
// Data-driven object spawning
export { spawnEffect } from './spawner';
export type { Spawner } from './spawner';

View File

@ -0,0 +1,70 @@
type PointerRecord = {
id: number;
x: number;
y: number;
}
export enum DragDropEventType {
DOWN,
UP,
MOVE,
}
export type DragDropEvent = {
type: DragDropEventType,
relativeX: number;
relativeY: number;
}
export function dragDropEventEffect(
gameObject: Phaser.GameObjects.GameObject,
) {
let down: PointerRecord | null;
let up: PointerRecord | null;
function onPointerDown(pointer: Phaser.Input.Pointer) {
down = {
id: pointer.id,
x: pointer.x,
y: pointer.y
}
up = null;
const type = DragDropEventType.DOWN;
const relativeX = pointer.x - down.x;
const relativeY = pointer.y - down.y;
gameObject.emit('drag', {type, relativeX, relativeY});
}
function onPointerUp(pointer: Phaser.Input.Pointer) {
if(!down) return;
up = {
id: pointer.id,
x: pointer.x,
y: pointer.y
}
const type = DragDropEventType.UP;
const relativeX = pointer.x - down.x;
const relativeY = pointer.y - down.y;
gameObject.emit('drag', {type, relativeX, relativeY});
}
function onPointerMove(pointer: Phaser.Input.Pointer) {
if(!down || up) return;
if(down.id !== pointer.id) return;
const type = DragDropEventType.MOVE;
const relativeX = pointer.x - down.x;
const relativeY = pointer.y - down.y;
gameObject.emit('drag', {type, relativeX, relativeY});
}
gameObject.on('pointerdown', onPointerDown);
gameObject.on('pointerup', onPointerUp);
gameObject.scene.input.on('pointermove', onPointerMove);
return function () {
gameObject.off('pointerdown', onPointerDown);
gameObject.off('pointerup', onPointerUp);
gameObject.scene.input.off('pointermove', onPointerMove);
}
}

View File

@ -1,2 +1,3 @@
export { DisposableBag } from './disposable';
export type { IDisposable, DisposableItem } from './disposable';
export { dragDropEventEffect, DragDropEventType, type DragDropEvent } from './dnd';