paint-by-numbers

Relaxing paint-by-numbers game  https://p.ce9e.org/paint-by-numbers/
git clone https://git.ce9e.org/paint-by-numbers.git

commit
15bbb04f22762b374f5cd9b69538bdfbeab44722
parent
0ab4db5590c05773d4395c0d7f4d8448dcaa4a32
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-02-26 20:03
allow to move canvas with two fingers

Diffstat

M js/index.js 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++---------
M js/view.js 23 +++++++++++++++++++++++
M style.css 1 +

3 files changed, 87 insertions, 10 deletions


diff --git a/js/index.js b/js/index.js

@@ -19,6 +19,9 @@ var moveY = new Animation((value, dt) => {
   19    19     view.render();
   20    20 });
   21    21 
   -1    22 var pointers = [];
   -1    23 var pointersStartState = null;
   -1    24 
   22    25 var setupPalette = function(image) {
   23    26     palette.innerHTML = '';
   24    27     for (var i = 1; i < image.colors.length; i++) {
@@ -105,16 +108,66 @@ canvas.addEventListener('wheel', event => {
  105   108     view.setZoom(event.offsetX, event.offsetY, view.zoom * Math.pow(2, -event.deltaY / 2000));
  106   109 });
  107   110 
  108    -1 var onMouse = function(event) {
  109    -1     if (event.buttons & 1) {
  110    -1         view.mouse = [event.offsetX, event.offsetY];
  111    -1         view.render();
  112    -1     } else {
  113    -1         view.mouse = null;
  114    -1         view.prevMouse = null;
   -1   111 canvas.addEventListener('pointerdown', event => {
   -1   112     if (pointers.length < 2 && (event.buttons & 1 || event.pointerType !== 'mouse')) {
   -1   113         canvas.setPointerCapture(event.pointerId);
   -1   114 
   -1   115         // clone because offsetX/Y change to 0 on the original event
   -1   116         pointers.push({
   -1   117             id: event.pointerId,
   -1   118             x: event.offsetX,
   -1   119             y: event.offsetY,
   -1   120         });
   -1   121 
   -1   122         pointersStartState = {
   -1   123             pointers: pointers.map(e => ({x: e.x, y: e.y})),
   -1   124             view: {
   -1   125                 dx: view.dx,
   -1   126                 dy: view.dy,
   -1   127                 zoom: view.zoom,
   -1   128             },
   -1   129         };
   -1   130     }
   -1   131 });
   -1   132 
   -1   133 canvas.addEventListener('pointermove', event => {
   -1   134     var i = pointers.findIndex(e => e.id === event.pointerId);
   -1   135     if (i !== -1) {
   -1   136         pointers[i].x = event.offsetX;
   -1   137         pointers[i].y = event.offsetY;
   -1   138 
   -1   139         if (pointers.length === 1) {
   -1   140             view.mouse = [event.offsetX, event.offsetY];
   -1   141             view.render();
   -1   142         } else {
   -1   143             view.mouse = null;
   -1   144             view.prevMouse = null;
   -1   145             view.transform(
   -1   146                 pointersStartState.pointers[0],
   -1   147                 pointersStartState.pointers[1],
   -1   148                 pointers[0],
   -1   149                 pointers[1],
   -1   150                 pointersStartState.view,
   -1   151             );
   -1   152         }
   -1   153     }
   -1   154 });
   -1   155 
   -1   156 var pointerup = function(event) {
   -1   157     var i = pointers.findIndex(e => e.id === event.pointerId);
   -1   158     if (i !== -1) {
   -1   159         if (pointers.length === 1) {
   -1   160             view.mouse = [event.offsetX, event.offsetY];
   -1   161             view.draw();
   -1   162 
   -1   163             view.prevMouse = null;
   -1   164             view.mouse = null;
   -1   165             view.render();
   -1   166         }
   -1   167         pointers = [];
   -1   168         pointersStartState = null;
  115   169     }
  116   170 };
  117   171 
  118    -1 canvas.addEventListener('mousemove', onMouse);
  119    -1 canvas.addEventListener('mousedown', onMouse);
  120    -1 canvas.addEventListener('mouseup', onMouse);
   -1   172 canvas.addEventListener('pointerup', pointerup);
   -1   173 canvas.addEventListener('pointercancel', pointerup);

diff --git a/js/view.js b/js/view.js

@@ -61,6 +61,29 @@ export class View {
   61    61         this.render();
   62    62     }
   63    63 
   -1    64     transform(old1, old2, new1, new2, old_view) {
   -1    65         var cx_old = (old1.x + old2.x) / 2;
   -1    66         var cy_old = (old1.y + old2.y) / 2;
   -1    67         var cx_new = (new1.x + new2.x) / 2;
   -1    68         var cy_new = (new1.y + new2.y) / 2;
   -1    69 
   -1    70         var dx_old = old1.x - old2.x;
   -1    71         var dy_old = old1.y - old2.y;
   -1    72         var d_old = Math.sqrt(dx_old * dx_old + dy_old * dy_old);
   -1    73 
   -1    74         var dx_new = new1.x - new2.x;
   -1    75         var dy_new = new1.y - new2.y;
   -1    76         var d_new = Math.sqrt(dx_new * dx_new + dy_new * dy_new);
   -1    77 
   -1    78         // move center
   -1    79         this.dx = old_view.dx + cx_new - cx_old;
   -1    80         this.dy = old_view.dy + cy_new - cy_old;
   -1    81 
   -1    82         // change zoom and keep center
   -1    83         this.zoom = old_view.zoom;
   -1    84         this.setZoom(cx_new, cy_new, old_view.zoom * d_new / d_old);
   -1    85     }
   -1    86 
   64    87     draw() {
   65    88         if (this.mouse) {
   66    89             var [x, y] = this.toFrameXY(...this.mouse);

diff --git a/style.css b/style.css

@@ -13,6 +13,7 @@ body {
   13    13 canvas {
   14    14 	block-size: 100%;
   15    15 	inline-size: 100%;
   -1    16 	touch-action: none;
   16    17 }
   17    18 
   18    19 .loader {