mirror of
https://github.com/cocos/cocos-engine.git
synced 2026-09-07 00:02:53 +08:00
86 lines
3.3 KiB
TypeScript
86 lines
3.3 KiB
TypeScript
import { MouseCallback } from 'pal/input';
|
|
import { screenAdapter } from 'pal/screen-adapter';
|
|
import { EventMouse } from '../../../cocos/input/types';
|
|
import { EventTarget } from '../../../cocos/core/event';
|
|
import { Vec2 } from '../../../cocos/core/math';
|
|
import { InputEventType } from '../../../cocos/input/types/event-enum';
|
|
|
|
export class MouseInputSource {
|
|
private _eventTarget: EventTarget = new EventTarget();
|
|
private _preMousePos: Vec2 = new Vec2();
|
|
private _isPressed = false;
|
|
|
|
constructor () {
|
|
this._registerEvent();
|
|
}
|
|
|
|
private _getLocation (event: jsb.MouseEvent): Vec2 {
|
|
const windowSize = screenAdapter.windowSize;
|
|
const dpr = screenAdapter.devicePixelRatio;
|
|
const x = event.x * dpr;
|
|
const y = windowSize.height - event.y * dpr;
|
|
return new Vec2(x, y);
|
|
}
|
|
|
|
private _registerEvent () {
|
|
jsb.onMouseDown = this._createCallback(InputEventType.MOUSE_DOWN);
|
|
jsb.onMouseMove = this._createCallback(InputEventType.MOUSE_MOVE);
|
|
jsb.onMouseUp = this._createCallback(InputEventType.MOUSE_UP);
|
|
jsb.onMouseWheel = this._handleMouseWheel.bind(this);
|
|
}
|
|
|
|
private _createCallback (eventType: InputEventType) {
|
|
return (mouseEvent: jsb.MouseEvent) => {
|
|
const location = this._getLocation(mouseEvent);
|
|
let button = mouseEvent.button;
|
|
switch (eventType) {
|
|
case InputEventType.MOUSE_DOWN:
|
|
this._isPressed = true;
|
|
break;
|
|
case InputEventType.MOUSE_UP:
|
|
this._isPressed = false;
|
|
break;
|
|
case InputEventType.MOUSE_MOVE:
|
|
if (!this._isPressed) {
|
|
button = EventMouse.BUTTON_MISSING;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
const eventMouse = new EventMouse(eventType, false, this._preMousePos);
|
|
eventMouse.setLocation(location.x, location.y);
|
|
eventMouse.setButton(button);
|
|
eventMouse.movementX = location.x - this._preMousePos.x;
|
|
eventMouse.movementY = this._preMousePos.y - location.y;
|
|
|
|
// update previous mouse position.
|
|
this._preMousePos.set(location.x, location.y);
|
|
this._eventTarget.emit(eventType, eventMouse);
|
|
};
|
|
}
|
|
|
|
private _handleMouseWheel (mouseEvent: jsb.MouseWheelEvent) {
|
|
const eventType = InputEventType.MOUSE_WHEEL;
|
|
const location = this._getLocation(mouseEvent);
|
|
const button = mouseEvent.button;
|
|
|
|
const eventMouse = new EventMouse(eventType, false, this._preMousePos);
|
|
eventMouse.setLocation(location.x, location.y);
|
|
eventMouse.setButton(button);
|
|
eventMouse.movementX = location.x - this._preMousePos.x;
|
|
eventMouse.movementY = this._preMousePos.y - location.y;
|
|
|
|
const matchStandardFactor = 120;
|
|
eventMouse.setScrollData(mouseEvent.wheelDeltaX * matchStandardFactor, mouseEvent.wheelDeltaY * matchStandardFactor);
|
|
// update previous mouse position.
|
|
this._preMousePos.set(location.x, location.y);
|
|
this._eventTarget.emit(eventType, eventMouse);
|
|
}
|
|
|
|
public on (eventType: InputEventType, callback: MouseCallback, target?: any) {
|
|
this._eventTarget.on(eventType, callback, target);
|
|
}
|
|
}
|