Русскоязычный портал о QML и QtQuick, QmlPortal What the duck

Каталог статей

Главная » Статьи » Статьи по QML

"Duck hunt" на QML (часть вторая)

Продолжение.



О таймерах.

Отрисовкой элементов AnimatedSprite будут заниматься следующие таймеры:

Timer{
            id:dogTimer
            interval:dog.animationSpeed
            // интервал срабатывания таймера
            running:false
            // запущен\нет
            repeat:true
            // повторять ?
            onTriggered:{
            // обработка срабатывания таймера
                if (!mainPage.paused){
                // если игра не на паузе
             ……………………………………
             ……………………………………
 
                    if (dog.currentFrame==dog.endFrame){
                       ……………………………………
                       dog.currentFrame=dog.startFrame
                       // кадры кончились. Возвращаемся к первому
                    } else {
                        dog.currentFrame++
                        // переходим к след. кадру
                    }
                }
            }
        }

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

if (dog.state=="START_LEVEL"){
       if (dog.x>=200){
            dog.y=370
            dog.targetX=240
            dog.targetY=320
            dog.animationSpeed=40
            dog.state="JUMP"
            // меняем анимацию идущей собаки на анимацию прыгающей собаки
            dog.z=10
            if (!mainPage.muted) chienSaute.play()
       }
         }

Про траекторию движения.

О траектории движения уток. Добавим переменных в элемент DuckSprite:

x:600
y:360
// текущие координаты утки
targetX: 10+Math.random()*800
targetY: 10+Math.random()*350
// координаты цели. Выбираются случайным образом в пределах экрана
 
Координаты следующей точки при передвижении вычисляются по следующим нехитрым формулам:
brownDuck.x+=Math.ceil(((brownDuck.targetX-brownDuck.x)/Math.abs(brownDuck.targetX-brownDuck.x))*brownDuck.speed)
brownDuck.y+=Math.ceil(((brownDuck.targetY-brownDuck.y)/Math.abs(brownDuck.targetY-brownDuck.y))*brownDuck.speed)
 
Если утка долетела до цели – вычисляем координаты следующей цели:

if (Math.ceil((Math.floor(Math.abs(blackDuck.x-blackDuck.targetX)))<=blackDuck.epsilon)&&
                                (Math.ceil(Math.floor(Math.abs(blackDuck.y-blackDuck.targetY)))<=blackDuck.epsilon)){
                            blackDuck.targetX=10+Math.random()*800
                            blackDuck.targetY=10+Math.random()*350
                        }

Epsilon здесь – некоторая небольшая величина. Служит для предотвращения «подрагивания» утки при подлете к цели на расстояние нескольких пикселей.
Также для выбора анимации важно знать, в какую именно сторону направляется утка (влево-вверх, вверх, вправо-вниз и т.д.). Вычисляется довольно просто – от вычисленных координат следующей точки траектории вычитаем текущие координаты. В зависимости от получившихся знаков разницы (+/-)  выбираем правильную анимацию.

Для облаков, идущей собаки и летящих вниз перьев нет смысла вычислять обе новых координаты, т.к. объект движется вдоль одной оси. Таким образом одну координату вычисляем, вторая остается константой.


Об обработке касаний экрана.

Обработкой касаний экрана занимается стандартный элемент MouseArea. Область действия для него – вся рабочая область экрана. Сразу код с подробными комментариями:

MouseArea{
   anchors.fill: parent
   // область действия – весь родительский элемент (в данном случае – главный экран игры)
   onPressed: {
   // действие при срабатывании события
     if ((!mainPage.paused)&&(dog.state!="START_LEVEL")&&(!initializationFlag)&&(!startMenu.visible)){
// если игра не на паузе и это не начало уровня, и мы не находимся в меню
        if (gameStatistic.bullet>0){
        // если есть еще патроны
            shot.x=mouseX-shot.width/2
            shot.y=mouseY-shot.height/2
            // вычисляем координаты выстрела
            shot.currentFrame=0
            shotAnimationTimer.start()
            // включаем таймер анимации выстрела
 
            gameStatistic.bullet--
            // уменьшаем кол-во оставшихся патронов
 
            rumbleEffect.start();
            // вибрируем (подробности далее в статье)
 
            if (!mainPage.muted) shotSound.play()
            // если звук не выключен – проигрываем звук выстрела
 
            if ((mouseX>blackDuck.x)&&(mouseX<(blackDuck.x+blackDuck.width))&&                            (mouseY>blackDuck.y)&&(mouseY<(blackDuck.y+blackDuck.height))){
            // если попали в утку
                 gameStatistic.kill++
                 // увеличиваем счетчик убитых уток
                 blackDuck.state = "DEAD"
                 // меняем анимацию утки на «мертвую утку»
                 if (!mainPage.muted) duckDeadSound.play()
                 …………………
                 …………………
                 feathers1.x=blackDuck.x-70
                 feathers1.y=blackDuck.y-70
                 feathers1.targetX=blackDuck.x
                 feathers1.targetY=500
                feathers1.state="START"
                 feathers1.currentFrame=-1
                 feathers1.opacity=1
                 feathers1.visible=true
                 featherTimer.start()
                 // пускаем разлетающиеся во все стороны перья
            }
         } else {
            if (!mainPage.muted) fireSound.play()
            // если не попали и звук включен – проигрывается звук выстрела
         }
      }
   }
}

http://qml.ucoz.com/MaemoWorld/screen_03-ijunja-12_14-18-33.png


О вибрации.

В QtMobility.feedback 1.1 есть готовый элемент HapticsEffect. Остается его немного настроить и можно использовать:
HapticsEffect {
        id: rumbleEffect
        attackIntensity: 0.0
        attackTime: 0
        intensity: 1.0       
duration: 250       
fadeTime: 0       
fadeIntensity: 0.0
    }

Чтобы проиграть этот эффект, достаточно вызвать rumbleEffect.start();


О звуках.

Библиотека QtMultimediaKit 1.1. Элемент называется SoundEffect. Чтобы начать его использовать – достаточно указать ему id и, собственно, путь до файла со звуком. 

SoundEffect  {
            id: shotSound
            source:"MEDIA/SND/shot.wav"
        }

Проигрывается так: shotSound.play()


О публикации в магазине Nokia.

Тут так же ничего сложного. Регистрируемся в магазине: www. publish.nokia.com. Оплачиваем 1 евро. Читаем небольшой мануал (есть на русском).
Создаем контент, настраиваем, отправляем на QA. Ждем результатов, правим баги, отправляем заново . 
Контент успешно проходит QA, публикуется в магазине и мы наслаждаемся отзывами благодарных пользователей N9. 
Пара нюансов. Если будете продавать контент – с оплатой не все так просто.
Оплата будет произведена через месяц после окончания того месяца, когда за вычетом всяческих поборов на вашем аккаунте было более 100 евро. 
Причем покупать приложение могли как по банковской карте, так и через сотовых операторов. Как я понял, операторы рассчитываются с нокией всего несколько раз в году.
А без их платежей довольно трудно набрать нужную для вывода сумму.
Нокия, кстати, берет себе всего 30% от итоговой суммы. Плюс у вас должно быть подписанное соглашение с ней. 
Его пришлют вам по емэйлу сразу после того, как ожидаемая теоритически сумма превысит 100 евро. 
Вы будете должны его распечатать в двух экземплярах, подписать и отправить в Espoo. Вскоре вам пришлют подписанный и с их стороны договор. 
Если же к концу года на вашем счету так и не наберется минимальной суммы – тогда вам выплатят то, что есть.
Оплата производится исключительно банковским переводом на указанный в аккаунте счет. 
С платежей вы будете должны самостоятельно уплатить все налоги согласно действующему законодательству РФ.

Кстати, законно ли получать частному разработчику суммы в евро от зарубежной компании – для меня так и осталось загадкой. 
Если кто сталкивался – проконсультируйте, пожалуйста. 

По секрету приведу топ стран по количеству покупок одной конкретной игры:
1. С большим отрывом лидирует Mexico
2. Russian Federation
3. Finland
4. Australia
5. Vietnam
6. Argentina
Как видите - не стоит лишать удовольствия попользоваться вашим продуктом наших иностранных единомышленников и делать приложение только на русском языке. 
Тем более, что в среднестатистической мобильной игре текста не так уж и много.

А где в статистике Китай? . С ним тоже не просто: The content file failed for distribution in mainland China because paid games need to be distributed by licensed partners.
 
Кстати, одним из требований QA является: приложение в свернутом состоянии должно потреблять минимум ресурсов и никоим образом не издавать никаких звуков. Логично .
Достигается следующим образом: в главном цикле игры добавляем проверку

if ((!Qt.application.active)&&(gameStarted)){
                mainTheme.stop()
                // тушим звуки
                pauseMenu.visible=true
                mainPage.paused=true
                // ставим все циклы на паузу и выводим меню паузы                 
            }

Вот и всё.  Надеюсь, не утомил большим количеством кода smile.

Весь проект залит на GitHub, там вы можете скачать  исходники, а также взять собранный .deb пакет, поставить на свой телефон и попробовать игру вживую.

Go create!



Источник: http://meegos.ru/forum/viewtopic.php?pid=119575
Категория: Статьи по QML | Добавил: CYAN (23.12.2012) | Автор: qml.portal.ru E W
Просмотров: 4497 | Теги: QML, Анимация, QML пример, D.U.C.K. H.U.N.T. | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела

Все статьи [0]
Обучение QML [8]
Статьи с базовой информацией о языке QML
Статьи по QML [6]
Статьи по QML
QML для профессионалов [4]
Статьи по QML-темам повышенной сложности
Ссылки на видео [5]
Ссылки на видео с демонстрацией возможностей QML
Ссылки на материалы по QML в интернете [2]
Ссылки на полезные материалы по QML в интернете
Обо всём [1]
Статьи на разные темы, не имеющие отношение к QML и QtQuick

Поиск на сайте

Облако тэгов

kinetic scroll анимация интерфейса кинетик скролл создание интерфейса path view qml видео демонстрация qml QML Component QML Grid Demo QML browser plugin просмотр QML форм QML signal QML Transition базовые типы QML QML Text пример QML экспорт qml из GIMP QML Rectangle color picker QML MouseArea qml export QML State экспорт QML из Photoshop QML QtQuick Web-browser Набор виджетов для QML статьи о QML на русском языке MeegoHarmattan N9/N950 game Sprite Animation GLSL fragment shader Qt Quick 2 Анимация Easing Easing curves Сглаживающие кривые C++ QGraphicsView Q_INVOKABLE Интеграция QML и C++ QML Particle System QtQuick.Particles QML Scene Graph javascript глобальные переменные Qt Mobility QtMultimediaKit map QtMobility.location Debian package Harmattan QtCreator D.U.C.K. H.U.N.T. QML пример

Статистика сайта

Статей: 26
Новостей: 6
Файлов: 10
Форум: 19/46
Коментариев: 6

Посетители

Полезные ресурсы

сайт Российского Qt сообщества The FRUCT program Российская сеть MeeGo пользователей и разработчиков