【问题标题】:How to add a loading event listener to an object javascript如何将加载事件侦听器添加到对象javascript
【发布时间】:2018-02-21 19:58:36
【问题描述】:

我目前正在开发一个在 javascript 中使用精灵的游戏,我想添加一个事件侦听器,在游戏开始之前检查精灵图像是否已加载。我正在使用面向对象的编程,我遇到了一些问题......我将展示一个我想到的例子:

function Sprite() {
    this.img = new Image();
    // either this:
    this.img.onload = function() {
    }
    // or this:
    this.img.addEventListener("load", function() {
        // Either way, when it loads, then it could proceed with the move or draw methods.
        // I don't even know how to do this yet...
    });

    this.img.src = "res/image.png";

    this.draw = function() {
        context.drawImage(//with all the parameters);
    }

    this.move = function() {
        // code that makes the sprites move
    }
}

无论哪种方式,以及我尝试过的任何方式,它都无法正常工作而不会显示任何错误。它只是不显示精灵。有谁知道怎么回事?

【问题讨论】:

  • 如果负载没有触发,错误事件会被触发吗?
  • 什么意思?
  • this.img.onerror = function(){}
  • 这并没有真正做任何事情。或者至少我不知道它应该做什么......对不起
  • 您是否在 onerror 中添加了日志记录以查看它是否被触发......这只是基本的想法......学习使用您的控制台和网络面板来查看请求是否通过出来获取图像。

标签: javascript oop methods sprite


【解决方案1】:

使用var self = this; 明确捕获语义。通过在名为self 的变量中引用this,您将能够在Sprite 的图像加载函数中调用self.draw

问题可能是您在 onload 中尝试了 this.draw,但在这种情况下,this 指的是匿名函数而不是 Sprite。请参见下面的示例。

除此之外,我认为评论者的建议是您在加载图像时出错。这是一个使用堆栈溢出使用的 CDN 之一的图像的示例:

var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');

function Sprite() {

    var self = this;
    self.img = new Image();

    self.draw = function() {
        context.drawImage(self.img, 0, 0);
    }

    self.move = function() {
        // code that makes the sprites move
    }

    // or this:
    self.img.addEventListener("load", function() {
        self.draw();
    });

    self.img.src = "https://cdn.sstatic.net/img/share-sprite-new.svg?v=78be252218f3g";
}

var s = new Sprite();
<canvas id="canvas" width="300" height="300"></canvas>

【讨论】:

  • 好的,至少可以按照我想要的方式绘制精灵,但问题是我想在对象外部调用 draw 和 move 方法,在单独函数的间隔内......但是还是谢谢
  • 看看我如何将精灵存储在一个名为 s 的变量中?现在,您可以在程序中的任何位置执行s.move()s.draw()。例如,setTimeout(function() { s.draw(); s.move(); }, 15); 会调用 draw 并在您的 sprite 上移动一次。
  • 我知道。这就是我最初计划的方式。问题是它不起作用。如果我在事件侦听器中使用self.draw() 绘制它,它可以工作,但是当我从另一个函数使用 s.draw() 调用它时它不起作用
  • 它从我的角度开始工作 - 我在上次编辑中所做的是注释掉加载函数中的 self.draw 并简单地在我实例化的 Sprite 实例上使用它。在代码中的其他地方调用 self.draw 应该像我提供的示例一样工作。
  • 链接你的小提琴。我在使用 Fiddles 时遇到了我在其他地方的 JavaScript 中所不期望的细微差别。
猜你喜欢
  • 2018-12-10
  • 1970-01-01
  • 2021-04-17
  • 2012-09-09
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
相关资源
最近更新 更多