Compare commits
No commits in common. "bc490b48784491ac02430dd70223e16d1a329d9e" and "b8bf93269fb457d09b3f6f9cc63982da4839a801" have entirely different histories.
bc490b4878
...
b8bf93269f
@ -17,4 +17,3 @@ export const ZOOM_IN_FACTOR = 2;
|
|||||||
export const ZOOM_OUT_FACTOR = 0.5;
|
export const ZOOM_OUT_FACTOR = 0.5;
|
||||||
export const SCALE_MAX = 256;
|
export const SCALE_MAX = 256;
|
||||||
export const SCALE_MIN = 1/256;
|
export const SCALE_MIN = 1/256;
|
||||||
export const DRAGGABLE_ELEMENT_CLASSNAME = 'lhg-draggable-element';
|
|
||||||
|
|||||||
18
objects.js
18
objects.js
@ -60,24 +60,6 @@ export class Objects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
handlePointerDown({x, y}) {
|
|
||||||
// If pointer is touching an object, select the object
|
|
||||||
const touchingObject = this.objectAtLocation(x, y);
|
|
||||||
|
|
||||||
if (touchingObject !== undefined) {
|
|
||||||
this.selectObject(touchingObject);
|
|
||||||
} else {
|
|
||||||
// Otherwise, create a new object
|
|
||||||
this.createObject(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handlePointerUp({x, y}) {
|
|
||||||
this.doneCreatingObject();
|
|
||||||
this.deselect();
|
|
||||||
}
|
|
||||||
|
|
||||||
computeFrame(elapsedTime) {
|
computeFrame(elapsedTime) {
|
||||||
// If we're creating an object, increment its mass
|
// If we're creating an object, increment its mass
|
||||||
// with the mass creation rate accelerating over time
|
// with the mass creation rate accelerating over time
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
import {DRAGGABLE_ELEMENT_CLASSNAME} from './config.js';
|
|
||||||
|
|
||||||
export class Overlay {
|
export class Overlay {
|
||||||
sim = undefined;
|
sim = undefined;
|
||||||
constructor(sim) {
|
constructor(sim) {
|
||||||
@ -14,7 +12,7 @@ export class Overlay {
|
|||||||
infoBox.style.left = 0;
|
infoBox.style.left = 0;
|
||||||
infoBox.width = 'fit-content';
|
infoBox.width = 'fit-content';
|
||||||
infoBox.style.zIndex = 1;
|
infoBox.style.zIndex = 1;
|
||||||
infoBox.classList.add(DRAGGABLE_ELEMENT_CLASSNAME);
|
infoBox.classList.add('draggable');
|
||||||
}
|
}
|
||||||
|
|
||||||
renderInfo() {
|
renderInfo() {
|
||||||
@ -38,7 +36,7 @@ export class Overlay {
|
|||||||
|
|
||||||
// Update positions of draggable items
|
// Update positions of draggable items
|
||||||
updateDraggable() {
|
updateDraggable() {
|
||||||
const elements = document.querySelectorAll(`.${DRAGGABLE_ELEMENT_CLASSNAME}`);
|
const elements = document.querySelectorAll('.draggable');
|
||||||
for (let el of elements) {
|
for (let el of elements) {
|
||||||
if (!el.dragging) continue;
|
if (!el.dragging) continue;
|
||||||
const {
|
const {
|
||||||
|
|||||||
25
pointer.js
25
pointer.js
@ -3,7 +3,6 @@ import {
|
|||||||
ZOOM_IN_FACTOR,
|
ZOOM_IN_FACTOR,
|
||||||
ZOOM_OUT_FACTOR,
|
ZOOM_OUT_FACTOR,
|
||||||
DISPLAY_CURSOR_INFO,
|
DISPLAY_CURSOR_INFO,
|
||||||
DRAGGABLE_ELEMENT_CLASSNAME,
|
|
||||||
} from './config.js';
|
} from './config.js';
|
||||||
|
|
||||||
function dispatchEvent(target, eventType, data) {
|
function dispatchEvent(target, eventType, data) {
|
||||||
@ -24,7 +23,7 @@ export class Pointer {
|
|||||||
const el = window;
|
const el = window;
|
||||||
|
|
||||||
el.addEventListener('pointermove', e => {
|
el.addEventListener('pointermove', e => {
|
||||||
this.sim.info['pointermove'] = [`${e.clientX}, `, `${e.clientY}`];
|
// const velocity = this.sim.pointer.getPointerVelocity();
|
||||||
if (this.draggingElement) {
|
if (this.draggingElement) {
|
||||||
// e.preventDefault();
|
// e.preventDefault();
|
||||||
this.draggingElement.dragging.pointerEnd = {
|
this.draggingElement.dragging.pointerEnd = {
|
||||||
@ -40,10 +39,10 @@ export class Pointer {
|
|||||||
el.addEventListener('pointerdown', e => {
|
el.addEventListener('pointerdown', e => {
|
||||||
// e.preventDefault();
|
// e.preventDefault();
|
||||||
let target = e.target;
|
let target = e.target;
|
||||||
while (target && !target.classList.contains(DRAGGABLE_ELEMENT_CLASSNAME)) {
|
while (target && !target.classList.contains('draggable')) {
|
||||||
target = target.parentElement;
|
target = target.parentElement;
|
||||||
}
|
}
|
||||||
if (target?.classList.contains(DRAGGABLE_ELEMENT_CLASSNAME)) {
|
if (target?.classList.contains('draggable')) {
|
||||||
// e.preventDefault();
|
// e.preventDefault();
|
||||||
this.draggingElement = target;
|
this.draggingElement = target;
|
||||||
this.draggingElement.dragging = {
|
this.draggingElement.dragging = {
|
||||||
@ -121,24 +120,32 @@ export class Pointer {
|
|||||||
this.clearPointerHistory();
|
this.clearPointerHistory();
|
||||||
this.updatePointer({x, y});
|
this.updatePointer({x, y});
|
||||||
|
|
||||||
this.sim.objects.handlePointerDown({x, y});
|
// If pointer is touching an object, select the object
|
||||||
|
const touchingObject = this.sim.objects.objectAtLocation(x, y);
|
||||||
|
|
||||||
|
if (touchingObject !== undefined) {
|
||||||
|
this.sim.objects.selectObject(touchingObject);
|
||||||
|
} else {
|
||||||
|
// Otherwise, create a new object
|
||||||
|
this.sim.objects.createObject(x, y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePointerUp({x, y}) {
|
handlePointerUp({x, y}) {
|
||||||
// TODO: Conditional?
|
this.sim.objects.doneCreatingObject();
|
||||||
this.sim.objects.handlePointerUp({x, y});
|
this.sim.objects.deselect();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle cursor (mouse or touch) movement
|
// Handle cursor (mouse or touch) movement
|
||||||
// TODO: If e.touches.length > 1, user may be engaging pinch to zoom
|
|
||||||
handlePointerMove({x, y}) {
|
handlePointerMove({x, y}) {
|
||||||
this.updatePointer({x, y});
|
this.updatePointer({x, y});
|
||||||
const {x: vx, y: vy} = this.getPointerVelocity();
|
// TODO: If e.touches.length > 1, user may be engaging pinch to zoom
|
||||||
|
|
||||||
// If the cursor moves while creating an object, or while an object is selected,
|
// If the cursor moves while creating an object, or while an object is selected,
|
||||||
// update the position and velocity of the object
|
// update the position and velocity of the object
|
||||||
const obj = this.sim.objects.getSelectedOrCreating();
|
const obj = this.sim.objects.getSelectedOrCreating();
|
||||||
if (obj !== undefined) {
|
if (obj !== undefined) {
|
||||||
|
const {x: vx, y: vy} = this.getPointerVelocity();
|
||||||
obj.position.x = x;
|
obj.position.x = x;
|
||||||
obj.position.y = y;
|
obj.position.y = y;
|
||||||
obj.velocity.x = vx;
|
obj.velocity.x = vx;
|
||||||
|
|||||||
@ -67,6 +67,7 @@ export class Sim {
|
|||||||
|
|
||||||
// Main loop
|
// Main loop
|
||||||
loop(currentTime) {
|
loop(currentTime) {
|
||||||
|
this.overlay.updateDraggable();
|
||||||
const elapsedTime = currentTime - this.time;
|
const elapsedTime = currentTime - this.time;
|
||||||
this.time = currentTime;
|
this.time = currentTime;
|
||||||
if (this.nextZoom) {
|
if (this.nextZoom) {
|
||||||
@ -77,7 +78,6 @@ export class Sim {
|
|||||||
this.objects.computeFrame(elapsedTime);
|
this.objects.computeFrame(elapsedTime);
|
||||||
this.display.fillCanvas();
|
this.display.fillCanvas();
|
||||||
this.display.drawObjects();
|
this.display.drawObjects();
|
||||||
this.overlay.updateDraggable();
|
|
||||||
this.overlay.renderInfo();
|
this.overlay.renderInfo();
|
||||||
requestAnimationFrame(t => this.loop(t));
|
requestAnimationFrame(t => this.loop(t));
|
||||||
}
|
}
|
||||||
|
|||||||
4
tool.js
4
tool.js
@ -2,8 +2,6 @@
|
|||||||
// can call back to toolbar for whatever...
|
// can call back to toolbar for whatever...
|
||||||
// through toolbar can access sim
|
// through toolbar can access sim
|
||||||
|
|
||||||
import {DRAGGABLE_ELEMENT_CLASSNAME} from './config.js';
|
|
||||||
|
|
||||||
export class Tool {
|
export class Tool {
|
||||||
toolbar = undefined;
|
toolbar = undefined;
|
||||||
sim = undefined;
|
sim = undefined;
|
||||||
@ -19,7 +17,7 @@ export class Tool {
|
|||||||
div.style.border = '1px #0fb solid';
|
div.style.border = '1px #0fb solid';
|
||||||
div.style.margin = '5px';
|
div.style.margin = '5px';
|
||||||
div.style.padding = '5px';
|
div.style.padding = '5px';
|
||||||
div.classList.add(DRAGGABLE_ELEMENT_CLASSNAME);
|
div.classList.add('draggable');
|
||||||
}
|
}
|
||||||
|
|
||||||
frame() {}
|
frame() {}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user