pts.js 'NS_ERROR_NOT_AVAILABLE:' Ошибка при попытке использовать изображение для частицы - PullRequest
2 голосов
/ 03 июня 2019

Я хочу загрузить то же самое изображение для частиц в pts.js.

Когда я пытаюсь использовать локальное изображение из моей папки ресурсов, я получаю сообщение об ошибке «NS_ERROR_NOT_AVAILABLE:» в консоли.

Я где-то читал, что это может быть связано с тем, что изображение пытается быть использовано до того, как оно будет загружено в ...

Я также попытался использовать внешнюю ссылку на какое-то другое изображение, а нечем местный, и это работает.Поэтому не уверен, что происходит с моими локальными файлами.

РЕДАКТИРОВАТЬ:

Я только что попробовал это на Chrome, а не Firefox, и я получаю новое и более подробное сообщение об ошибке.

"Uncaught DOMException: не удалось выполнить 'drawImage' для 'CanvasRenderingContext2D': предоставленный элемент HTMLImageElement находится в состоянии 'поврежден'."в pts.min.js: 6.

Все еще не уверен, что именно не так.

Pts.quickStart('#hello', 'transparent')

var world

// Loading in image to be used
var myImg = new Image()
myImg.src = '/assets/img/myImage.png'

space.add({
  start: (bound, space) => {
    // Create world and 100 random points
    world = new World(space.innerBound, 1, 0)
    let pts = Create.distributeRandom(space.innerBound, 20)

    // Create particles and hit them with a random impulse
    for (let i = 0, len = pts.length; i < len; i++) {
      let p = new Particle(pts[i]).size(i === 0 ? 10 : 20)
      p.hit(0, 0)
      world.add(p)
    }

    world.particle(0).lock = true
  },

  animate: (time, ftime) => {
    world.drawParticles((p, i) => {


// Image variable for the particle to be drawn as
      form.image(myImg)
    })

    world.update(ftime)
  },

  action: (type, px, py) => {
    if (type == 'move') {
      world.particle(0).position = new Pt(px, py)
    }
  },

  resize: (bound, evt) => {
    if (world) world.bound = space.innerBound
  }
})

space.bindMouse().bindTouch()
space.play()

1 Ответ

0 голосов
/ 05 июня 2019

Для рисования изображений на холсте, изображение должно быть загружено в первую очередь. Вы можете отслеживать это, используя myImg.addEventListener( 'load', ... ).

После загрузки вы можете использовать его в form.image( myImg, ... ) в цикле анимации Pts.

Вот рабочий пример, основанный на вашем коде выше:

Pts.quickStart( "#pt", "#123" );

//// Demo code starts (anonymous function wrapper is optional) ---

(function() {

  var world;
  var imgReady = false;

    // Loading in image to be used
    var myImg = new Image()
    myImg.src = 'http://icons.iconarchive.com/icons/icojoy/maneki-neko/256/cat-6-icon.png';
    myImg.addEventListener('load', function() {
        imgReady = true;
    }, false);

  space.add( {

    start: (bound, space) => {

      // Create world and 100 random points
      world = new World( space.innerBound, 1, 0 );
      let pts = Create.distributeRandom( space.innerBound, 100 );

      // Create particles and hit them with a random impulse
      for (let i=0, len=pts.length; i<len; i++) {
        let p = new Particle( pts[i] ).size( (i===0) ? 30 : 3+Math.random()*space.size.x/50 );
        p.hit( Num.randomRange(-50,50), Num.randomRange(-25, 25) );
        world.add( p );
      }

      world.particle( 0 ).lock = true; // lock it to move it by pointer later on

    },


    animate: (time, ftime) => {
      world.drawParticles( (p, i) => {
        if (imgReady) {
          console.log( p )
          form.image(myImg, [p.$subtract( p.radius ), p.$add( p.radius )] );
        }
      });

      world.update( ftime );
    },


    action:( type, px, py) => {
      if (type == "move") {
        world.particle( 0 ).position = new Pt(px, py);
      }
    },

    resize: (bound, evt) => {
      if (world) world.bound = space.innerBound;
    }
  });

  space.bindMouse().bindTouch();
  space.play();

})();
...