Итак, я пытаюсь создать сеть частиц с помощью PIXI. js in Angular 9. Вот мой сервис, который я добавляю в root:
import { Injectable } from '@angular/core';
import * as PIXI from 'pixi.js'
class Particle {
x: number;
y: number;
xDirection: number;
yDirection: number;
radius: number;
graphicCorespondent: PIXI.Graphics;
constructor(){
this.x = Math.random() * window.innerWidth;
this.y = Math.random() * window.innerHeight;
this.xDirection = Math.random();
this.xDirection *= Math.ceil(Math.random()*2) == 2 ? 1 : -1;
this.yDirection = Math.random();
this.yDirection *= Math.ceil(Math.random()*2) == 2 ? 1 : -1;
// this.xDirection = 1;
// this.yDirection = 1;
this.radius = 1 + Math.random() * 3;
}
}
@Injectable({
providedIn: 'root'
})
export class ParticlesService {
app = new PIXI.Application({width: window.innerWidth, height: window.innerHeight});
density = 3000;
particles = [];
velocity = 1;
constructor() {
window.onload = () => {
document.body.appendChild(this.app.view);
this.app.renderer.backgroundColor = 0xFFFFFF;
this.app.renderer.view.style.position = "fixed";
this.app.renderer.view.style.display = "block";
this.app.renderer.view.style.left = '0';
this.app.renderer.view.style.top = '0';
this.app.renderer.view.style.zIndex = '-1';
// window.onresize = () => {
// this.app.renderer.resize(window.innerWidth, window.innerHeight)
// }
}
}
init(){
for(let i=0; i<this.density; i++){
const particle = new Particle();
const gr = new PIXI.Graphics();
gr.beginFill(0x000000);
gr.drawCircle(particle.x, particle.y, particle.radius);
gr.endFill();
particle.graphicCorespondent = gr;
this.particles.push(particle)
this.app.stage.addChild(gr)
}
this.app.ticker.add((delta) => {
this.animate(delta);
});
this.app.ticker.start();
}
animate(delta){
this.particles.forEach((particle, index) => {
if(particle.x > window.innerWidth) particle.x = 0;
if(particle.y > window.innerHeight) particle.y = 0;
if(particle.x < 0) particle.x = window.innerWidth;
if(particle.y < 0) particle.y = window.innerHeight;
particle.graphicCorespondent.x = particle.x + delta * particle.xDirection;
particle.graphicCorespondent.y = particle.y + delta * particle.yDirection;
particle.x = particle.graphicCorespondent.x;
particle.y = particle.graphicCorespondent.y;
})
this.app.render()
}
}
Мне удалось зайти так далеко, это работает .... но частицы имеют тенденцию слипаться в правом нижнем углу каждый раз.
Если я удаляю «Обнаружение столкновения края»:
if(particle.x > window.innerWidth) particle.x = 0;
if(particle.y > window.innerHeight) particle.y = 0;
if(particle.x < 0) particle.x = window.innerWidth;
if(particle.y < 0) particle.y = window.innerHeight;
Кажется, это работает нормально, но частицы улетят в бесконечность. Иначе ... они имеют тенденцию скапливаться в правом нижнем углу, и я не понимаю, почему.
Снимок экрана сгущения
Я потратил целый день на этот, и я до сих пор не могу понять, почему он это делает. Я создал приложение fre sh Angular, используя CLI, и единственной вещью, которую я создал, был этот сервис. Те же результаты.
Присутствует <meta name="viewport" content="width=device-width, initial-scale=1">
.
Похоже, что изменение масштаба работает.
Ширина и высота совпадают.
Particle.x и В конце тика частицы.graphicCorespondent.x равны.
Кроме того, кажется, что частицы исчезают и появляются снова, прежде чем они достигают края большую часть времени.
Если бы кто-нибудь мог взглянуть на это, я был бы чрезвычайно благодарен. Это сводит меня с ума.
Я пытался отрезать частицу, как только она исчезла с экрана, и создать другую. Он создает еще один, но после этого он выглядит как c.
Я попытался выполнить цикл непосредственно через stage.children
, тот же результат.
Также попытался прочитать значения x и y частицы путем доступа к методу getBounds () в частице .graphicCorespondent. То же значение, не имеет значения.
Редактировать: Я получаю одинаковые результаты в Chrome и Firefox.
PIXI. js версия : 5.2.3
Angular версия: 9.1.1