#object #push #processing #instance #p5.js
#объект #толкать #обработка #экземпляр #p5.js
Вопрос:
У меня есть эскиз в глобальном режиме, который отлично работает, и сейчас я переношу его в другой документ в режиме экземпляра, поскольку он находится рядом с эскизом 3D / WEBGL.
Всякий раз, когда я нажимаю, чтобы отправить новый экземпляр Pulse(), я получаю «Не удается прочитать свойство ‘0’ из undefined» в ответ, поступающий из цикла for() в draw(). Как я уже сказал, это отлично работает в глобальном режиме, так что, должно быть, здесь просто неправильный синтаксис, но я не могу найти никаких примеров использования объектов в режиме экземпляра p5. Я понятия не имею, почему он не может считывать данные из массива или почему он не может нажимать.
Я был очень неуверен в синтаксисе при переходе к массиву объектов в p5.js Режим экземпляра. Я также пробовал варианты s.pulse.push (new s.Pulse()) и s.pulse.s.push(new s.Pulse()), но они возвращали ошибки нажатия. Приведенный ниже код, кажется, подталкивает, но массив просто не может быть прочитан.
Любая помощь была бы отличной, спасибо.
var twoDee = function(s) {
var cnv;
var cnvWidth, cnvHeight;
var pulsesAmount;
var pulses = [];
s.setup = function() {
s.cnvWidth = s.windowWidth;
s.cnvHeight = document.getElementById('sketch-wrap-bleed-bottom').offsetHeight;
s.cnv = s.createCanvas(s.cnvWidth, s.cnvHeight, s.P2D);
s.cnv.parent("sketch-wrap-bleed-bottom");
s.pulsesAmount = 0;
}
s.draw = function() {
s.background(40);
for (var i = 0; i < s.pulsesAmount; i ) {
s.pulses[i].move(); // problem here
s.pulses[i].display();
}
s.noFill();
s.stroke(255);
s.ellipse(s.mouseX, s.mouseY, 30, 30);
}
s.Pulse = function() {
this.size = 20;
this.grow = 0.5;
this.xPos = s.width/2 200;
this.yPos = s.height/2;
this.opacity = 255;
this.move = function() {
this.size = this.grow;
this.opacity = map(this.size, 0, 60, 255, 0);
}
this.display = function() {
s.noFill();
s.strokeWeight(2);
s.stroke(242, 202, 102, this.opacity);
s.translate(this.xPos, this.yPos);
s.ellipse(0, 0, this.size, this.size);
s.translate(-this.xPos, -this.yPos);
}
}
s.mousePressed = function() {
s.pulsesAmount = 1;
s.pulses = s.push(new s.Pulse());
}
}
Комментарии:
1. Можете ли вы ссылаться на jsfiddle или codepen вашего кода? Мы не можем запустить ваш код, потому что он выдает ошибку, поскольку не может найти
sketch-wrap-bleed-bottom'
элемент.2. Спасибо, Кевин. Я создал версию codepen, но консоль не выводит код ошибки. Оно все равно здесь codepen.io/tomricci/pen/wzNPAK?editors=0001 Я добавил многоточие на мыши, которое отключается, как только вы щелкаете, чтобы продемонстрировать, что эскиз прерывается, как только вы пытаетесь нажать на объект
3. Safari выдает ошибку как «TypeError: undefined не является объектом (вычисление ‘i’)».
Ответ №1:
Вам нужно использовать s
переменную только для материалов, которые поступают из P5.js , как mouseX
или setup()
функция.
Для вещей, которые вы объявляете, таких как переменные pulses
и pulsesAmount
, вы не используете s
переменную. Итак, ваш for
цикл должен выглядеть следующим образом:
for (var i = 0; i < pulsesAmount; i ) {
pulses[i].move();
pulses[i].display();
}
Редактировать: После того, как вы исправили эту проблему, у вас все еще есть другая проблема. Эта строка не имеет смысла:
pulses = s.push(new Pulse());
Пожалуйста, проконсультируйтесь с P5.js обратитесь к, чтобы лучше понять, что делает push()
функция. Это не имеет ничего общего с массивами.
Возможно, вы думаете о append()
функции, но даже тогда ваш синтаксис отключен. Вы должны передать массив в функцию вместе со значением, которое вы хотите к нему добавить. Вот так:
s.append(pulses, new Pulse());
После исправления этого у вас все еще будут некоторые другие проблемы (например, не использование s
переменной для доступа к map()
функции), но это должно помочь вам двигаться в правильном направлении.
Комментарии:
1. Большое вам спасибо! Я прошел через это и попытался исправить синтаксис в соответствии с этим, но я все еще получаю ошибку. Есть ли здесь что-то, что я неправильно обработал?
2. @themessup Пожалуйста, посмотрите мой отредактированный ответ. Stack Overflow на самом деле не предназначен для обмена сообщениями, поэтому, если у вас есть дополнительный вопрос, пожалуйста, разместите его как новый вопрос в отдельном сообщении, и мы перейдем оттуда.