ImpactJS - значения переменных действительны до тех пор, пока не будут переданы в конструктор класса, после чего станут NaN

Извините за длинный пост, но я хотел быть как можно более подробным

Так что я создаю плагин с парой пользовательских ig.Class экземпляров. одна из них - реализация вектора: Vec2, тогда у меня есть класс частиц:

Particle = ig.Class.extend({
    pos: null,
    last: null,
    init: function (pos) {
        this.pos = new Vec2().mutableSet(pos.x, pos.y);
        this.last = this.pos;
    },
    draw: function (ctx) {
        ctx.beginPath();
        ctx.arc(this.pos.x, this.pos.y, 2, 0, 2 * Math.PI);
        ctx.fillStyle = "#2dad8f";
        ctx.fill();
    }
});

затем у меня есть эта функция шин внутри другого класса:

tire: function (origin, radius, segments, spokeStiffness, treadStiffness) {
        var stride = (2 * Math.PI) / segments;

        var composite = new Composite();

        // particles
        for (var i = 0; i < segments; i++) {
            var theta = i * stride;
            composite.particles.push(new Particle(new Vec2(origin.x + Math.cos(theta) * radius, origin.y + Math.sin(theta) * radius)));
        }
        var center = new Particle(origin);
        composite.particles.push(center);
        // constraints
        for (i = 0; i < segments; i++) {
            composite.constraints.push(new DistanceConstraint(composite.particles[i], composite.particles[(i + 1) % segments], treadStiffness));
            composite.constraints.push(new DistanceConstraint(composite.particles[i], center, spokeStiffness))
            composite.constraints.push(new DistanceConstraint(composite.particles[i], composite.particles[(i + 5) % segments], treadStiffness));
        }

        this.composites.push(composite);
        return composite;
    }

и, наконец, эта функция обновления внутри того же класса, что и функция шины:

update: function (step) {
        for (var c in this.composites) {
            for (var i in this.composites[c].particles) {
                var particles = this.composites[c].particles;
                // calculate velocity
                var velocity = particles[i].pos.sub(particles[i].last).scale(this.friction);

                // ground friction
                if (particles[i].pos.y >= this.height - 1 && velocity.length2() > 0.000001) {
                    var m = velocity.length();
                    velocity.x /= m;
                    velocity.y /= m;
                    velocity.mutableScale(m * this.groundFriction);
                }

                // save last good state
                particles[i].last.mutableSet(particles[i].pos);

                // gravity
                particles[i].pos.mutableAdd(this.gravity);

                // inertia  
                particles[i].pos.mutableAdd(velocity);
            }
        }
        // relax
        var stepCoef = 1 / step;
        for (var c in this.composites) {
            var constraints = this.composites[c].constraints;
            for (var i = 0; i < step; ++i) {
                for (var j in constraints) {
                    constraints[j].relax(stepCoef);
                }
            }
        }

        // bounds checking
        for (var c in this.composites) {
            var particles = this.composites[c].particles;
            for (var i in particles) {
                this.bounds(particles[i]);
            }
        }
    }

ошибка, которую я получаю, находится в этой строке в функции обновления: var velocity = particles[i].pos.sub(particles[i].last).scale(this.friction); в частности ошибка говорит о том, что он не может вызвать метод sub из неопределенного. я изменил метод шин выше, чтобы выглядеть так, чтобы я мог отладить его:

tire: function (origin, radius, segments, spokeStiffness, treadStiffness) {
        var stride = (2 * Math.PI) / segments;

        var composite = new Composite();

        // particles
        for (var i = 0; i < segments; i++) {
            var theta = i * stride;
            var x = origin.x + Math.cos(theta) * radius;
            var y = origin.y + Math.sin(theta) * radius;
            var pos = new Vec2(x, y);
            console.log(pos);
            var particle = new Particle(pos);
            composite.particles.push(particle);
        }
        var center = new Particle(origin);
        composite.particles.push(center);
        // constraints
        for (i = 0; i < segments; i++) {
            composite.constraints.push(new DistanceConstraint(composite.particles[i], composite.particles[(i + 1) % segments], treadStiffness));
            composite.constraints.push(new DistanceConstraint(composite.particles[i], center, spokeStiffness))
            composite.constraints.push(new DistanceConstraint(composite.particles[i], composite.particles[(i + 5) % segments], treadStiffness));
        }

        this.composites.push(composite);
        return composite;
    }

когда я войду pos Переменная я получаю правильные значения, выводимые на консоль, однако, если все равно получаю ошибку. Единственное, что я могу думать, это то, что где-то между pos переменная создается в tire метод и когда он передается и назначается в Particle конструктор теряет свою ценность и приводит к частице, имеющей pos.x / pos.y значение NaN, которое я могу видеть, когда я записываю var particles выше строки ошибки (var velocity = particles[i].pos.sub(particles[i].last).scale(this.friction);). Я действительно понятия не имею, что происходит не так, я пытался изменить Particle присваивание конструктору параметра pos назначить его несколькими способами (через Vec2.mutableSet() метод и настройка напрямую. но что бы я ни делал, это все равно приводит к значению NaN для частицы.

Кто-нибудь может увидеть что-то, чем я не являюсь? Спасибо

1 ответ

Решение

Понял, что был загружен файл JavaScript, который переопределял Particle учебный класс. убрал тег script с файлом javascript и все хорошо

Другие вопросы по тегам