如何使用ES6类添加事件侦听器并在画布中移动对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用ES6类添加事件侦听器并在画布中移动对象?相关的知识,希望对你有一定的参考价值。

我正在创建一个小游戏,你可以移动一个星/不明飞行物。我很难弄清楚应该如何让它移动。使用函数式编程很容易,但我们如何使用ES6 utlizing类来完成这项工作呢?我们需要绑定还是什么?我想我的逻辑也有些错误。

如何让圆圈移动?

Codepen:https://codepen.io/Aurelian/pen/mGWVbq?editors=0010

'use strict';
/*
 * ------------------------------------------
 * *-----------------------------
 *  User Event
 * *-----------------------------
 * ------------------------------------------
 */
class UserEvent {
  constructor(canvasBody) {
    this.UP_ARROW = 38 || 87,
      this.RIGHT_ARROW = 39 || 68,
      this.DOWN_ARROW = 37 || 83,
      this.LEFT_ARROW = 40 || 65,
      this.keys = []

    canvasBody.addEventListener('keydown', (e) => {
      this.keys[e.keyCode] = true;
    });

    canvasBody.addEventListener('keyup', (e) => {
      this.keys[e.keyCode] = false;
    });
  }

  checkKey(key) {
    return this.keys[key];
  }

  ufoMove() {
    this.canvasBody.checkKey(this.UP_ARROW)
    this.canvasBody.checkKey(this.RIGHT_ARROW)
    this.canvasBodycheckKey(this.DOWN_ARROW)
    this.canvasBody.checkKey(this.LEFT_ARROW)
    console.log(this.canvasBody.leftArrow = this.checkKey(this.LEFT_ARROW))

    if (this.UP_ARROW) {
      this.x += this.x * this.velocity.x
    }
  }
}


/*
 * ------------------------------------------
 * *-----------------------------
 *  UFO
 * *-----------------------------
 * ------------------------------------------
 */
class Ufo {
  constructor(x, y) {
    this.x = x,
      this.y = y,
      this.velocity = {
        x: 3,
        y: 3
      }
  }

  draw(c) {
    c.save()
    c.beginPath()
    c.arc(this.x, this.y, 50, 0, Math.PI * 2, false)
    c.fillStyle = "#fff";
    c.shadowColor = "#e3eaef";
    c.shadowBlur = 20;
    c.fill()
    c.closePath()
    c.restore()
  }

  update(c) {
    this.draw(c)
    // Get the keys first
    this.EventUser.ufoMove(this.c);
    //    this.x = this.x + this.velocity.x;
    // }
  }
}

/*
 * ------------------------------------------
 * *-----------------------------
 *  Canvas
 * *-----------------------------
 * ------------------------------------------
 */
class CanvasDisplay {
  constructor() {
    this.canvas = document.querySelector('canvas');
    this.ctx = this.canvas.getContext('2d');
    this.stageConfig = {
      width: window.innerWidth,
      height: window.innerHeight
    };
    this.canvas.width = this.stageConfig.width;
    this.canvas.height = this.stageConfig.height;

    this.backgroundGradient = this.ctx.createLinearGradient(0, 0, 0, this.canvas.height);
    this.backgroundGradient.addColorStop(0, '#171e26');
    this.backgroundGradient.addColorStop(1, '#3f586b');

    this.Ufo = new Ufo(this.canvas.width / 2, this.canvas.height / 2);
    this.UserEvent = new UserEvent(document.body);
  }

  animate() {
    this.ctx.fillStyle = this.backgroundGradient;
    this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);

    this.Ufo.update(this.ctx)
    window.requestAnimationFrame(this.animate);
  }
}

let canvasDisplay = new CanvasDisplay();
canvasDisplay.animate();
canvas {
  display: block;
}
<canvas></canvas>
答案

请看一下这段代码(你的想法有点不同)

let keys = {ArrowUp:false,ArrowDown:false,ArrowLeft:false,ArrowRight:false};

         window.addEventListener('keydown', function(e){
            keys[e.code] = true;
         });

         window.addEventListener('keyup', function(e){
            keys[e.code] = false;
         });

  /*UFO*/
   class Ufo {
      constructor(x, y) {
         this.x = x,
         this.y = y,
         this.velocity = {
            x: 3,
            y: 3
         }
      }
      
      draw(c) {
         c.save()
         c.beginPath()
         c.arc(this.x, this.y, 50, 0, Math.PI * 2, false)
         c.fillStyle = "#fff";
         c.shadowColor = "#e3eaef";
         c.shadowBlur = 20;
         c.fill()
         c.closePath()
         c.restore()
      }
      
      update(c) {
        if(keys.ArrowUp){this.y -= this.velocity.y;}
        if(keys.ArrowDown){this.y += this.velocity.y;}
        if(keys.ArrowLeft){this.x -= this.velocity.x;}
        if(keys.ArrowRight){this.x += this.velocity.x;}
        this.draw(c);
      }
   }

   /* Canvas*/		
   class CanvasDisplay {
      constructor() {
         this.canvas = document.querySelector('canvas');
		     this.ctx = this.canvas.getContext('2d');       
         this.cw = this.canvas.width = window.innerWidth;
         this.ch = this.canvas.height = window.innerHeight;
         
         this.ufo = new Ufo(this.cw / 2, this.ch / 2);
       
         this.ctx.fillStyle = this.grd();
      }
      
      grd(){
         let grd = this.ctx.createLinearGradient(0, 0, 0, this.ch);
         grd.addColorStop(0, '#171e26');
         grd.addColorStop(1, '#3f586b');
         return grd;
      }
      
       animate() {
         window.requestAnimationFrame(this.animate.bind(this));
         this.ctx.fillRect(0,0,this.cw,this.ch);
         this.ufo.update(this.ctx);
      }
   }

   let canv= new CanvasDisplay();

   canv.animate();
body {
  overflow: hidden;
}
canvas {
  display: block;
}
<canvas></canvas>

以上是关于如何使用ES6类添加事件侦听器并在画布中移动对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 es6 中,创建一个带有回调的事件监听器到一个可迭代对象中

es6 添加事件监听

如何仅使用 HTML5 功能使画布移动?

我遇到了 es6 类和事件监听器的问题? [复制]

如何将html5画布上的点击事件传递给兄弟画布元素上的事件监听器

在普通JavaScript中切换多个类