Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
6 апреля 2018 г. 12: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)
{
}
}

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


5

Могу подсказать вот такой вариант с 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();}
}
0

А метод

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

0

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

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

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

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

  1. onFrameCountChanged
  2. onFrameXChanged
  3. onRunningChanged
0

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

            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}
            }

        }

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

0

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

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
v
17 января 2019 г. 11:51
vitalir12

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
v
17 января 2019 г. 11:49
vitalir12

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

  • Результат:50баллов,
  • Очки рейтинга-4
v
17 января 2019 г. 11:13
vitalir12

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

  • Результат:28баллов,
  • Очки рейтинга-10
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
18 января 2019 г. 11:26
nayk1982

Для Desktop делал так: void pause(int ms){ QTimer timer; timer.setInterval( qBound(1, ms, 3600000) ); timer.setSingleShot(true); QEventLoop loop; QObject::connect(&...
17 января 2019 г. 12:01
Алексей Внуков

у меня просто есть отдельное поле с чекбоксамими какие колонки нужно отображать CheckBox { id: checkBox text: qsTr("some text") checked: true onC...
15 января 2019 г. 16:53
Михаиллл

Спасибо, заработало.Но выдало обычный текст без форатирования HTML.Придется искать дальше
15 января 2019 г. 12:52
BlinCT

Я же вам выше написал CLion умеет работать с ремоут машинами. И Qt так же собирает.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы