Реактивный пикси
Иногда раз в неделю, бывает чаще, бывает реже, я пишу гиперказуалки на Pixi.js. Не доделываю обычно до конца, интересен больше процесс решения сложных ситуаций и поиск выхода: как красивее и проще всего решить конфликт архитектурный (да, я типа нахожу себе головоломки, вместо всяких игр-головоломок, я думаю такие люди как я и делают такие игры).
Но есть нерешенная проблема, что приходится придумывать геморойный велосипед как писать на Pixi не только функционально, но и реактивно. Не жду прям реакт рендера, но хочется, чтобы оно само красиво обновлялось.
Я долго делал обертку черезTicker.shared.tick(() => {})
и придумывал как сделать это сfunction useState<T>(value: T): [T, (value: T) => void]
потому что нет реактивного обновление стейта у детей
А потом случайно наткнулся на React Pixi.
https://pixijs.io/pixi-react/stage/
Ох, сколько идей, это можно теперь делать типа игру на привычном компонентном подходе реактивном, но рисовать графику с пикси.
OLD
Есть вот такой пример (1), где мы создаем типа хук, но не хук, функцию, которая возвращает игрока и мы можем у его instance менять скорость, например каждую секунду увеличивать.
// My old variant with vanilla Pixi. js
export function PlayerShort0) {
const sprite = Sprite.from("player.png");
// init speed
const [speed, setSpeed] = useState(0);
const newProps = { setSpeed, speed };
return Object. assign (sprite, newProps);
}
export function SceneShort() {
const container = new Container();
const player = PlayerShort();
// update speed
Ticker. shared. tick( (dt) = {
player.setSpeed (Math. floor(dt));
};
// result speed
console.log(player.speed);
container. addChild (player);
}Надо создавать отдельные инстансы, связывать методы, добавлять к контейнеру как в DOM
Так же както придумать, как обновлять стейт
NEW
(2)-ой вариант с ReactPixi, где мы контролируем скорость игрока верхнеуровнего, скорее всего делать надо както подругому, чтобы методы были более приватные и логическо относились друг к другу, но
// New variant with ReactPixi, React, Pixi. js
export function ReactScene() {
// init speed
const [playerSpeed, setPlayerSpeed] = React.useState(0)
const i = ReactPixi.useIteration(1)
// update speed
setPlayerSpeed(i)
return (
‹Container>
‹Player speed={speed}>
</Container>
)
}
export function ReactPLayer({ speed }) {
// result sped
console.log(speed);
return ‹Sprite image="player.png" />;
}Зато теперь мы просто в дереве как в React используем Player и все, само снова нормально обновляется