Использовать существующий холст без потери содержимого в pIxi.js

Я новичок в Pixi.js, поэтому мне очень жаль, что это глупый вопрос.

Я понимаю, что если я хочу отобразить pixi.js на существующем холсте, я должен указать view.

const app = new PIXI.Application({
    view: myExistingCanvas,
});

Однако я понял, что если я напишу так, приложение Pixi фактически перезапишет мой существующий холст, и я потеряю все содержимое внутри «myExistingCanvas».

Может ли кто-нибудь посоветовать мне, как я могу создать приложение pixi поверх существующего холста без перезаписи?

Вероятно, вы могли бы позволить Pixi рисовать на холсте за пределами экрана и объединить вывод этого и другого холста с третьим экранным холстом.

obscure 06.04.2021 12:21

@obscure Спасибо за ответ. Не могли бы вы подробнее рассказать о своей точке зрения на «объединение результатов»? Я не совсем уверен, как это можно сделать в pixi.js.

rks 06.04.2021 17:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
31
1

Ответы 1

Используя свойство Посмотреть, вы можете передать конструктору нового PIXI.Application, мы можем указать ему использовать существующий холст. Хотя этот холст не обязательно должен быть добавлен в DOM - достаточно, если он существует «виртуально».

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

  • Первым холстом будет существующий холст, который вы упомянули в своем вопросе, и действующий как холст за пределами экрана.
  • Второй холст - это еще один пустой холст за пределами экрана, на котором фиксируется вывод Pixi.
  • Третий холст на самом деле является экранным холстом, который объединяет выходные данные двух предыдущих холстов.

Теперь вы можете задаться вопросом, как это сделать.

Для этого мы должны перехватить цикл обновления Pixi, что мы можем сделать, добавив тикер в PIXI.Ticker.shared.

Внутри этого цикла обновления нам нужно сделать следующее:

  • Обновите анимацию Pixi и назовите ее рендерером
  • Очистить третий (экранный) холст
  • Нарисуйте содержимое первого холста на третьем
  • Нарисуйте содержимое второго холста на третьем

В основном это все - хотя это может показаться немного абстрактным.

Вот пример (просто нажмите «Выполнить фрагмент кода»):

let offScreenCanvasA = document.createElement("canvas");
let offScreenCanvasB = document.createElement("canvas");
let onScreenCanvas = document.createElement("canvas");
let width = 400;
let height = 300;


offScreenCanvasA.width = width;
offScreenCanvasB.width = width;
onScreenCanvas.width = width;

offScreenCanvasA.height = height;
offScreenCanvasB.height = height;
onScreenCanvas.height = height;

document.body.appendChild(onScreenCanvas);

const app = new PIXI.Application({
  view: offScreenCanvasB,
  transparent: true,
  width: 400,
  height: 300
});


const container = new PIXI.Container();
const renderer = PIXI.autoDetectRenderer();

app.stage.addChild(container);

const texture = PIXI.Texture.from('https://picsum.photos/id/237/26/37');

for (let i = 0; i < 25; i++) {
  const bunny = new PIXI.Sprite(texture);
  bunny.anchor.set(0.5);
  bunny.x = (i % 5) * 40;
  bunny.y = Math.floor(i / 5) * 40;
  container.addChild(bunny);
}

container.x = app.screen.width / 2;
container.y = app.screen.height / 2;
container.pivot.x = container.width / 2;
container.pivot.y = container.height / 2;

let ticker = PIXI.Ticker.shared
ticker.add(function(delta) {
  container.rotation -= 0.01;
  renderer.render(container);
  onScreenCanvas.getContext("2d").clearRect(0, 0, width, height);
  onScreenCanvas.getContext("2d").drawImage(offScreenCanvasA, 0, 0, width, height);
  onScreenCanvas.getContext("2d").drawImage(offScreenCanvasB, 0, 0, width, height);
});

let image = new Image();
image.onload = function(e) {
  offScreenCanvasA.getContext("2d").drawImage(e.target, 0, 0, width, height);
}
image.src = "https://picsum.photos/id/237/400/300";
<script src = "https://d157l7jdn8e5sf.cloudfront.net/dev/pixi-legacy.js"></script>

Изображение собаки на заднем плане - это изображение с первого холста, а вращающаяся сетка собак, выведенная Pixi, - на второй холст.

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