1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2024-10-27 20:34:29 +00:00

Allow to pan the map with the mouse by moving the cursor to the edges of the screen

This commit is contained in:
tobspr 2020-09-19 20:30:35 +02:00
parent d6f56da9e4
commit fbff0a0ad4
5 changed files with 484 additions and 412 deletions

View File

@ -168,6 +168,9 @@ export class Application {
if (!G_IS_MOBILE_APP && !IS_MOBILE) { if (!G_IS_MOBILE_APP && !IS_MOBILE) {
window.addEventListener("mousemove", this.handleMousemove.bind(this)); window.addEventListener("mousemove", this.handleMousemove.bind(this));
window.addEventListener("mouseout", this.handleMousemove.bind(this));
window.addEventListener("mouseover", this.handleMousemove.bind(this));
window.addEventListener("mouseleave", this.handleMousemove.bind(this));
} }
// Unload events // Unload events

View File

@ -31,6 +31,7 @@ export const CHANGELOG = [
"Show mouse and camera tile on debug overlay (F4) (by dengr)", "Show mouse and camera tile on debug overlay (F4) (by dengr)",
"Added confirmation when deleting a savegame", "Added confirmation when deleting a savegame",
"Fixed tunnels entrances connecting to exits sometimes when they shouldn't", "Fixed tunnels entrances connecting to exits sometimes when they shouldn't",
"You can now pan the map with your mouse by moving the cursor to the edges of the screen!",
"Added setting to auto select the extractor when pipetting a resource patch (by Exund)", "Added setting to auto select the extractor when pipetting a resource patch (by Exund)",
"The initial belt planner direction is now based on the cursor movement (by MizardX)", "The initial belt planner direction is now based on the cursor movement (by MizardX)",
"Fix preferred variant not getting saved when clicking on the hud (by Danacus)", "Fix preferred variant not getting saved when clicking on the hud (by Danacus)",

View File

@ -769,6 +769,7 @@ export class Camera extends BasicSerializableObject {
this.cameraUpdateTimeBucket -= physicsStepSizeMs; this.cameraUpdateTimeBucket -= physicsStepSizeMs;
this.internalUpdatePanning(now, physicsStepSizeMs); this.internalUpdatePanning(now, physicsStepSizeMs);
this.internalUpdateMousePanning(now, physicsStepSizeMs);
this.internalUpdateZooming(now, physicsStepSizeMs); this.internalUpdateZooming(now, physicsStepSizeMs);
this.internalUpdateCentering(now, physicsStepSizeMs); this.internalUpdateCentering(now, physicsStepSizeMs);
this.internalUpdateShake(now, physicsStepSizeMs); this.internalUpdateShake(now, physicsStepSizeMs);
@ -855,6 +856,61 @@ export class Camera extends BasicSerializableObject {
} }
} }
/**
* Internal screen panning handler
* @param {number} now
* @param {number} dt
*/
internalUpdateMousePanning(now, dt) {
if (!this.root.app.settings.getAllSettings().enableMousePan) {
// Not enabled
return;
}
const mousePos = this.root.app.mousePosition;
if (!mousePos) {
return;
}
if (this.desiredCenter || this.desiredZoom || this.currentlyMoving || this.currentlyPinching) {
// Performing another method of movement right now
return;
}
if (
mousePos.x < 0 ||
mousePos.y < 0 ||
mousePos.x > this.root.gameWidth ||
mousePos.y > this.root.gameHeight
) {
// Out of screen
return;
}
const panAreaPixels = Math.min(this.root.gameWidth, this.root.gameHeight) * 0.015;
const panVelocity = new Vector();
if (mousePos.x < panAreaPixels) {
panVelocity.x -= 1;
}
if (mousePos.x > this.root.gameWidth - panAreaPixels) {
panVelocity.x += 1;
}
if (mousePos.y < panAreaPixels) {
panVelocity.y -= 1;
}
if (mousePos.y > this.root.gameHeight - panAreaPixels) {
panVelocity.y += 1;
}
this.center = this.center.add(
panVelocity.multiplyScalar(
((0.5 * dt) / this.zoomLevel) * this.root.app.settings.getMovementSpeed()
)
);
}
/** /**
* Updates the non user interaction zooming * Updates the non user interaction zooming
* @param {number} now Time now in seconds * @param {number} now Time now in seconds

View File

@ -253,6 +253,7 @@ export const allApplicationSettings = [
changeCb: (app, id) => {}, changeCb: (app, id) => {},
}), }),
new BoolSetting("enableMousePan", enumCategories.advanced, (app, value) => {}),
new BoolSetting("alwaysMultiplace", enumCategories.advanced, (app, value) => {}), new BoolSetting("alwaysMultiplace", enumCategories.advanced, (app, value) => {}),
new BoolSetting("clearCursorOnDeleteWhilePlacing", enumCategories.advanced, (app, value) => {}), new BoolSetting("clearCursorOnDeleteWhilePlacing", enumCategories.advanced, (app, value) => {}),
new BoolSetting("enableTunnelSmartplace", enumCategories.advanced, (app, value) => {}), new BoolSetting("enableTunnelSmartplace", enumCategories.advanced, (app, value) => {}),
@ -308,6 +309,7 @@ class SettingsStorage {
this.clearCursorOnDeleteWhilePlacing = true; this.clearCursorOnDeleteWhilePlacing = true;
this.displayChunkBorders = false; this.displayChunkBorders = false;
this.pickMinerOnPatch = true; this.pickMinerOnPatch = true;
this.enableMousePan = true;
this.enableColorBlindHelper = false; this.enableColorBlindHelper = false;
@ -525,7 +527,7 @@ export class ApplicationSettings extends ReadWriteProxy {
} }
getCurrentVersion() { getCurrentVersion() {
return 27; return 28;
} }
/** @param {{settings: SettingsStorage, version: number}} data */ /** @param {{settings: SettingsStorage, version: number}} data */
@ -653,6 +655,11 @@ export class ApplicationSettings extends ReadWriteProxy {
data.version = 27; data.version = 27;
} }
if (data.version < 28) {
data.settings.enableMousePan = true;
data.version = 28;
}
return ExplainedResult.good(); return ExplainedResult.good();
} }
} }

View File

@ -785,7 +785,7 @@ settings:
movementSpeed: movementSpeed:
title: Movement speed title: Movement speed
description: >- description: >-
Changes how fast the view moves when using the keyboard. Changes how fast the view moves when using the keyboard or moving the mouse to the screen borders.
speeds: speeds:
super_slow: Super slow super_slow: Super slow
slow: Slow slow: Slow
@ -840,7 +840,7 @@ settings:
refreshRate: refreshRate:
title: Tick Rate title: Tick Rate
description: >- description: >-
The game will automatically adjust the tickrate to be between this target tickrate and half of it. For example, with a tickrate of 60hz, the game will try to stay at 60hz, and if your computer can't handle it it will go down until it eventually reaches 30hz. This determines how many game ticks happen per second. In general, a higher tick rate means better precision but also worse performance. On lower tickrates, the throughput may not be exact.
alwaysMultiplace: alwaysMultiplace:
title: Multiplace title: Multiplace
@ -911,7 +911,12 @@ settings:
simplifiedBelts: simplifiedBelts:
title: Simplified Belts (Ugly) title: Simplified Belts (Ugly)
description: >- description: >-
Does not render belt items except when hovering the belt, to save performance. Does not render belt items except when hovering the belt to save performance. I do not recommend to play with this setting if you do not absolutely need the performance.
enableMousePan:
title: Enable Mouse Pan
description: >-
Allows to move the map by moving the cursor to the edges of the screen. The speed depends on the Movement Speed setting.
keybindings: keybindings:
title: Keybindings title: Keybindings