Как улучшить мою анимацию PIXI?

Всем привет! Сделал анимацию секвенции на PIXI.js, но есть вопросы, до которых не могу сам додуматься(

Ссылка на файлы проекта

Если вкратце:

У меня есть секвенция из 150 кадров, каждый из которых 1920х1080 я сделал spritesheet в программе texturePacker, но туда влезло только 17 кадров. Я загрузил этот спрайт в PIXI и у меня анимация играет все кадры, хотя в spritesheet только 17(что мне до сих пор не понятно).

Так же у меня если слайдер, я использую swiper, для полноэкранного скролла, каждую смену слайда проигрывается 30 кадров анимации. И есть кликабельная пагинация, которая тоже должна тригерить анимацию.

Тут я столкнулся с проблемой:

Я не знаю как мне сделать, что бы играть правильную анимацию, если я, например, с первого слайда сразу прыгаю на последний и подобные паттерны ломают всю красоту :(

Так же мои картинки размерами 1920х1080, но например если ратянуть экран больше, чем на эти значения, то как я могу динамически скейлить мои кадры (что-то вроде backgroun-size: cover)? Пытался погуглить на эту тему, но не нашел ничего...

Так же прошу помощи, в рефакторинге моего кода, потому что уверен, что его можно улучшить

Мой код (картинки можно найти по ссылке):

import * as PIXI from 'pixi.js'
import Swiper from 'swiper';

let slider = new Swiper('.swiper-container', {
    direction: 'vertical',
    mousewheel: true,
    slidesPerView: 1,
    speed: 1500,
    spaceBetween: 100,
    pagination: {
        el: '.swiper-pagination',
        clickable: true
    },
});



const app = new PIXI.Application({
    width: window.innerWidth,
    height: window.innerHeight,
    transparent: true
});
document.body.appendChild(app.view);
app.stop();


app.loader
    .add('/sprite.json')
    .load(onAssetsLoaded);


function onAssetsLoaded() {
    // create an array to store the textures
    const controllerTextures = [];

    for (let i = 1; i < 150; i++) {
        const texture = PIXI.Texture.from(`/assets/img/123/controller_${i}.jpg`);
        controllerTextures.push(texture);
    }

    goAnimationGo(controllerTextures,0, 30);

    slider.on('slideNextTransitionStart', function () {
        switch (slider.activeIndex) {
            case 1:
                goAnimationGo(controllerTextures,29, 59);
                break;
            case 2:
                goAnimationGo(controllerTextures,60, 89);
                break;
            case 3:
                goAnimationGo(controllerTextures,90, 119);
                break;
            case 4:
                goAnimationGo(controllerTextures,120, 149);
                break;
            default:
                break;
        }
    });
    slider.on('slidePrevTransitionStart', function () {
        switch (slider.activeIndex) {
            case 3:
                goAnimationGo(controllerTextures,149, 121, false);
                break;
            case 2:
                goAnimationGo(controllerTextures,120, 91, false);
                break;
            case 1:
                goAnimationGo(controllerTextures,90, 61, false);
                break;
            case 0:
                goAnimationGo(controllerTextures,60, 29, false);
                break;
            default:
                break;
        }
    });
}


function goAnimationGo (controllerTextures, frameStartNumber, frameStopNumber, direction = true) {
    // делаем анимацию в одну и другую сторону.
    let speed;
    direction === true ? speed = 0.35 : speed = -0.35;

    // create an controller AnimatedSprite
    const controller = new PIXI.AnimatedSprite(controllerTextures);

    controller.x = app.screen.width;
    controller.y = app.screen.height;
    controller.anchor.set(1);
    controller.gotoAndPlay(frameStartNumber);
    controller.animationSpeed = speed;
    controller.loop = false;
    app.stage.addChild(controller);

    // start animating
    app.start();

    if (direction === true) {
        controller.onFrameChange = () => {
            if (controller.currentFrame <= frameStopNumber) {
                app.start();
            } else {
                app.stop();
                controller.gotoAndStop(frameStopNumber);
            }
        }
    } else {
        controller.onFrameChange = () => {
            if (controller.currentFrame >= frameStopNumber) {
                app.start();
            } else {
                app.stop();
                controller.gotoAndStop(frameStopNumber);
            }
        }
    }

}
canvas {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 0;
}

main {
  height: 100vh;
}
.swiper-container {
    width: 100%;
    height: 100%;
  }
  
.swiper-slide {
  @extend %flex-center;
  font-size: 50px;
  color: tomato;
  font-weight: bold;
}
<main>
    <!-- Slider main container -->
    <div class="swiper-container">
        <!-- Additional required wrapper -->
        <div class="swiper-wrapper">
            <!-- Slides -->
            <div class="swiper-slide"><span>Slide 1</span></div>
            <div class="swiper-slide"><span>Slide 2</span></div>
            <div class="swiper-slide"><span>Slide 3</span></div>
            <div class="swiper-slide"><span>Slide 4</span></div>
            <div class="swiper-slide"><span>Slide 5</span></div>
        </div>

        <div class="swiper-pagination"></div>
    </div>
</main>


Ответы (0 шт):