alex_lip
alex_lip6 апреля 2018 г. 8:10

Как остановить анимирование спрайта на последнем фрейме?

Использую SpriteSequence

        SpriteSequence {
            id: zombie1
            width: 81
            height: 120
            interpolate: false
            goalSprite: ""
            opacity: 0
           // z: i_tem.z+1

            Sprite {
                id:a_taka
                name : "ataka"
                source: "../pict/Zombie1/z1_ataka.png"
                frameCount: 6  
                frameWidth: 245  
                frameHeight: 362 
                frameSync: false 
                frameDuration : 70
            }

            Sprite {
                id:d_ead
                name: "dead"
                source: "../pict/Zombie1/z1_dead.png"
                frameCount: 8  
                frameWidth: 449  
                frameHeight: 364 
                frameSync: false 
                frameDuration : 70
            }
        }

Вызываю таким образом
zombie1.jumpTo("ataka"); ...
zombie1.jumpTo("dead");

Спрайтовая анимация dead - должна проиграться один раз и остановиться на последнем фрейме.
Никак не получается (( . Пробовал  AnimatedSprite  -  loops:  1 - все равно проигрывает один раз и останавливается на первом фрейме. Куда смотреть?
В и-нете видел такие конструкции


onCurrentFrameChanged: {
console.log("current frame Changed : current frame", sprite.currentFrame)
//frameChanged()
if (sprite.currentFrame === 100)
{
}
if (sprite.currentFrame === 120)
{
}
}

Но как их применить?


Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 6 апреля 2018 г. 8:25

Могу подсказать вот такой вариант с AnimatedSprite

AnimatedSprite {
    id: animatedSprite

    width: 20   // Ширина области под спрайт
    height: 20  // Высота области под спрайт

    // Источник, спрайтовая картинка
    source: "sprite_sheet.png"
    frameCount: 15  // Количество кадров
    frameWidth: 20  // Ширина фрейма
    frameHeight: 20 // Высота фрейма
    frameSync: true // Синхронизация
    loops: 1
    onRunningChanged: if(!running) {introAnim.advance(-1); pause();}
}
    alex_lip
    • 6 апреля 2018 г. 8:32

    А метод

    onRunningChanged
    где описан? Я его не нашел в http://doc.qt.io/qt-5/qml-qtquick-animatedsprite.html

      Evgenii Legotckoi
      • 6 апреля 2018 г. 8:39
      • (ред.)

      Все property у типов QML могут иметь обработчики (кроме тех которые были написаны самим программистом в C++ и не указаны в макросе Q_PROPERTY, что касается стандартных типов, то исключений я ещё не встречал).

      В документации имя обработчиков вообще не пишется, но они есть. Может где-то в самой базовой части документации про это и сказано, но мне не попадалось. Как-то сам дошёл до этого, а потому и не искал информации.

      В общем возьму из документации рандомно три property, например

      1. frameCount
      2. frameX
      3. running
      Так вот, следуя описанной мной логике, получаем, что на данный объект, который имеет эти property, можно навесить следующие обработчики

      1. onFrameCountChanged
      2. onFrameXChanged
      3. onRunningChanged
        alex_lip
        • 6 апреля 2018 г. 8:54

        Ну пока сделал вот так

                    Sprite {
                        id:a_taka
                        name : "ataka"
                        source: "../pict/Zombie1/z1_ataka.png"
                        frameCount: 6  // Количество кадров
                        frameWidth: 245  // Ширина фрейма
                        frameHeight: 362 // Высота фрейма
                        frameSync: false // Синхронизация
                        frameDuration : 70
        
                    }
                    Sprite {
                        id:d_ead
                        name: "dead"
                        source: "../pict/Zombie1/z1_dead.png"
                        frameCount: 8  // Количество кадров
        
                        frameWidth: 449  // Ширина фрейма
                        frameHeight: 364 // Высота фрейма
                        frameSync: false // Синхронизация
                        frameDuration : 70
                        to: {"dead_last":1}
                    }
                    Sprite {
                        id:d_ead_last
                        name: "dead_last"
                        source: "../pict/Zombie1/z1_dead.png"
                        frameCount: 1  // Количество кадров
                        frameX:3143
                        frameWidth: 449  // Ширина фрейма
                        frameHeight: 364 // Высота фрейма
                        frameSync: false // Синхронизация
                        frameDuration : 70
                        to: {"dead_last":1}
                    }
        
                }

        То есть после последней анимации идет ссылка на анимацию с последним фреймом. которая сама на себя зациклена. Я боюсь, что обработчик будет тормозить анимацию.

          Evgenii Legotckoi
          • 6 апреля 2018 г. 9:01

          Постоянная пустая перерисовка тоже будет нагружать систему. Обработчик - это всего лишь сигнал/слотовое соединение по своем сушеству.

          Когда будете иметь достаточную нагрузку в вашем проекте, попробуйте сравнить оба варианта.

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            e
            • ehot
            • 31 марта 2024 г. 11:29

            C++ - Тест 003. Условия и циклы

            • Результат:78баллов,
            • Очки рейтинга2
            B

            C++ - Тест 002. Константы

            • Результат:16баллов,
            • Очки рейтинга-10
            B

            C++ - Тест 001. Первая программа и типы данных

            • Результат:46баллов,
            • Очки рейтинга-6
            Последние комментарии
            k
            kmssr8 февраля 2024 г. 15:43
            Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий Кононенко4 февраля 2024 г. 22:50
            Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            EVA
            EVA25 декабря 2023 г. 7:30
            Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
            J
            JonnyJo25 декабря 2023 г. 5:38
            Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
            G
            Gvozdik18 декабря 2023 г. 18:01
            Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
            Сейчас обсуждают на форуме
            a
            a_vlasov14 апреля 2024 г. 3:41
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
            Павел Дорофеев
            Павел Дорофеев13 апреля 2024 г. 23:35
            QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
            f
            fastrex4 апреля 2024 г. 1:47
            Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
            P
            Pisych27 февраля 2023 г. 1:04
            Как получить в массив значения из связанной модели? Спасибо, разобрался:))
            AC
            Alexandru Codreanu19 января 2024 г. 8:57
            QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

            Следите за нами в социальных сетях