| | |
| | | |
| | | export default class Player { |
| | | |
| | | constructor(dom) { |
| | | constructor(dom, dark) { |
| | | this.darkModel = dark; |
| | | |
| | | // init |
| | | this.app = generatePixiApp(); |
| | | dom.appendChild(this.app.view); |
| | | |
| | | globalThis.__PIXI_APP__ = this.app; |
| | | |
| | | |
| | | this.mapContainer = generatePixiContainer('mapContainer'); |
| | | this.app.stage.addChild(this.mapContainer); |
| | | this.app.view.addEventListener('contextmenu', (event) => { |
| | | event.preventDefault(); |
| | | }); |
| | | |
| | | this.scale = 1; // 缩放 |
| | | this.pan = false; // 平移 |
| | | |
| | | // func |
| | | this.app.view.addEventListener('mousedown', (event) => { |
| | | // 右键 |
| | | if (event.button === 2) { |
| | | this.mapPan(event); |
| | | } |
| | | }) |
| | | |
| | | this.activateMapScale(); |
| | | this.showCoordinates(); |
| | | |
| | | this.appTicker(); |
| | | } |
| | | |
| | | activateMapScale = () => { |
| | | this.app.view.addEventListener('wheel', (event) => { |
| | | event.preventDefault(); |
| | | const delta = Math.sign(event.deltaY); |
| | | |
| | | if (delta === 1) { |
| | | this.scale *= 0.9; |
| | | } else if (delta === -1) { |
| | | this.scale *= 1.1; |
| | | } |
| | | |
| | | this.mapContainer.scale.set(this.scale); |
| | | |
| | | this.mapContainer.children.forEach(child => { |
| | | // child.scale.set(1 / this.scale); // 防止图标变小 |
| | | }) |
| | | }); |
| | | } |
| | | |
| | | mapPan = (event) => { |
| | | this.pan = true; |
| | | let previousPosition = { x: event.clientX, y: event.clientY }; |
| | | |
| | | const mouseMoveHandler = (event) => { |
| | | if (this.pan) { |
| | | const dx = event.clientX - previousPosition.x; |
| | | const dy = event.clientY - previousPosition.y; |
| | | |
| | | this.mapContainer.position.x += dx; |
| | | this.mapContainer.position.y += dy; |
| | | |
| | | previousPosition = { x: event.clientX, y: event.clientY }; |
| | | } |
| | | }; |
| | | |
| | | this.app.view.addEventListener('mousemove', mouseMoveHandler); |
| | | |
| | | this.app.view.addEventListener('mouseup', () => { |
| | | this.app.view.removeEventListener('mousemove', mouseMoveHandler); |
| | | this.pan = false; |
| | | }); |
| | | |
| | | } |
| | | |
| | | showCoordinates = () => { |
| | | const coordinatesText = new PIXI.Text('{ x: 0, y: 0 }', { |
| | | fill: 0x000000, |
| | | fontSize: 13, |
| | | fontFamily: 'MicrosoftYaHei', |
| | | fontWeight: 'bold', |
| | | }); |
| | | coordinatesText.position.set(10, 10); |
| | | this.app.stage.addChild(coordinatesText); |
| | | |
| | | const mouseMoveInfoTextHandler = (event) => { |
| | | const mouseX = (event.clientX - this.mapContainer.position.x) / this.scale; |
| | | const mouseY = (event.clientY - this.mapContainer.position.y) / this.scale; |
| | | coordinatesText.text = `{ x: ${mouseX.toFixed(2)}, y: ${mouseY.toFixed(2)} }`; |
| | | }; |
| | | |
| | | this.app.view.addEventListener('mousemove', mouseMoveInfoTextHandler); |
| | | |
| | | } |
| | | |
| | | appTicker = () => { |
| | | TWEEDLE.Group.shared.update(); |
| | | } |
| | | |
| | | } |
| | | |