Всем известна эта игра. Вроде, ничего особенного просто птичка прыгает через трубы. Но многие подсаживались и старались поставить свои рекорды. По слухам она принесла своему создателю 50.000 баксов за одну только баннерную рекламу. В App Store и Google Play быстро появилось множество клонов Flappy Bird. Если вам интересно как можно создать Flappy Bird на Fusion 2.5, то добро пожаловать!
Используемые объекты
Движение птички сделаны с помощью физики
За все движения птички отвечает физический объект птички с красным глазом
В настройках указана высокая гравитация для того, что бы птичка резко прыгала и быстро опускалась.
За внешний вид птички отвечает обычный Static
Как подпрыгивает птичка
Думаю, не для кого не секрет, что в игре не птичка летит, а трубы движутся, так что координата X птички установлена фиксировано в значение 70.
По клику ЛКМ (либо tap-нажатие на мобильных устройствах) физическая птичка получает линейное ускорение linear velocity с силой 30, в направлении 90 градусов (вверх).
В добавок, птичка ещё получает импульс с силой 20 вверх, что бы придать резкость её прыжку.
Примечание. Высота прыжка отличается в Windows и в Android. В Window птичка прыгает чуть выше, чем надо, а в Androin в самый раз. Это зависит от среды выполнения движка Box2D. Я делал настройки под Android.
Направление птички изначально установлено на две точки выше от горизонтального.
Птичка должна наклонятся вниз когда падает, но с какого момента это должно происходить? Я определил этот момент как позицию на 15 пикселей ниже, чем начальная точка прыжка.
Позиция из которой происходит прыжок записывается как текущая координата Y в переменную ПозицияНаклона. Когда птичка падает ниже этой точки она начинает наклонятся вниз.
Наклон происходит постепенно, проходя каждое направление от верхнего до нижнего. Что бы это событие сработало нужно отметить галочку Automatic Rotations в настройках птички.
Движение Труб
Самая первая труба появляется с чуть большим интервалом времени (спустя 2 секунды после начала игры), чем все остальные трубы следующие за ней. flag 0 предотвращает повторное появление первой трубы. За тем включается flag 1, который вызывает цепочку следующих труб.
С помощью флагов я управляют последовательностью появления труб. В моей Flappy Bird используется три трубы. Они появляются друг за другом с одинаковым интервалом времени. Каждые 1.45 секунды появляется новая труба и движется со скоростью 15 справа налево, для этого я использовал тип движения Bouncing ball.
Каждая труба появляется справа за сценой в позиции X=315, а позиция Y определяется с помощью генератора случайных чисел — Random (110, 320), что бы просвет в трубе появлялся на разной высоте.
Я не использовал creat object, а сделал три трубы, потому что при создании каждой новой трубы на Android устройстве игра притормаживала. Копая этот вопрос, я выяснил, что такая проблема была не у меня одного. Мне кажется, что это из-за того, что труба довольно большой объект. В общем, от creat object пришлось отказаться и создать логику с тремя трубами.
Начисление очков
Очки должны начисляться в тот момент когда птичка пролетает трубу.
Довольно интересный момент — событие столкновения для обычных объектов срабатывает, только когда одна «картинка» сталкивается с другой, но столкновение физических объектов срабатывает даже когда физический объект пересекает прозрачную часть другого объекта!
Из этого следует логика — когда физическая птичка сталкивается с трубой, то присваиваем единицу к переменной трубы ПролетелТрубу. За тем. если птичка перелетает дальше координаты X этой трубы (середины трубы), то прибавляем одно очко и ПролетелТруб снова обнуляется.
Трубы добавлены в группу
Если не использовать ПролетелТрубу, то очки будут прибавляться когда птичка просто врежется в трубу
Когда птичка сталкивается с трубой или полом
Если птичка сталкивается с трубами или полом, группа событий Игра деактивируется и активируются события Ударился.
При чем когда птичка сталкивается именно с полом, её направление сразу меняться на вниз.
В следующем событии отслеживается случай, когда птичка улетает вверх за пределы сцены, так высоко, что будет перелетать трубы (такое возможно сделать в самом начале). Соответственно, если птичка перелетает трубу, то она должна удариться.
Включенный flag 0 нужен, что бы оставить возможность вылететь за экран пока не появятся трубы.
После столкновения
Когда включается группа событий Ударился
останавливаются трубы и пол, обнуляется скорость птички и создается объект красной вспышки — он появляется при ударе.
Заставка GameOver с лучшим результатом
Когда птичка падает на пол и красная вспышка уже исчезла:
- птичка останавливается,
- счетчик очков становится невидимым
- и в переменную ЗначениеТаймера записывается текущее время игры, что бы управлять временем до появления надписи GameOver и доски рекордов.
GameOver появляется спустя 300 мс с момента падения птички на пол. Обязательно нужно проверять, что ЗначениеТаймера неравно нулю, а то GameOver будет появляться до того как птица достигнет пола. Доска рекордов появляется спустя 800 мс с момента падения птички на пол.
На доску рекордов подгружается лучший результат из сохраненного значения в объекте ini
Результат
Счетчик результата начисляется по 1 каждые 2 мс, пока не станет равен текущему результату (значению счетчика очков). И если этот результат выше предыдущего рекорда, то записываем его в ini как лучший. И делаем видимой надпись new, которая изначально установлена как невидимая.
Если нужна дополнительная информация по объекту ini
Медаль
- За 10 очков — бронзовая
- За 20 очков — серебряная
- За 30 очков — золотая
- За 40 и более очков — платиновая
Важно, что бы события здесь шли от меньшего к большему сверху вниз.
Далее создается искорка блика в случайном месте на медальке.
Три условия:
- только один блик создается за раз, по этому количество бликов должно быть равно нулю;
- блик появляется после того как начислены очки;
- и блик появляется если есть медаль, т.е. если набранные очки больше 10.
Благодаря тому, что блик создается в позиции относительно медальки, то и рандомные позиции генерируются также относительно медальки.
Попробовать ещё раз
Здесь задержка времени с переменной ЗначениеТаймера от объекта кнопки нужно только для того, что бы звук успел воспроизвестись до того как уровень перезапустится.
В самом начале
В начале игрок видит заставку, а птичка немного двигается вверх и вниз
У физической птички два типа движения. В начале используется движение под названием Stay — это тип движения Path
После того как игрок нажимает на экран, тип движение птички меняется на Phisics — Buncing Ball под названием Flap, а заставка растворяется.
Для Android нельзя использовать Transitions, так что растворение сделано простой анимацией Disappearing.
За тем данное событие деактивируется и активируется группа событий Игра, которая описана выше.
Начальные настройки
В начале игры, когда мы видим заставку птичка не падает, по этому тип движение — Stay
Черный квадрат — объект для переменных:
- ВидПтички — случайно определяет один из трех цветов птички
- ЗаднийФон — фон превратиться в ночной, если эта переменная выдаст значение 2
Так же при старте игры сразу подключаем файл ini для сохранения рекорда.
Настройки для телефона
Размер экрана 288×511 на моем телефоне отображается как надо.
Выключены верхняя шапка и меню.
В настройках Android установлена ориентация — портрет (только вертикально).
Ну, и всё
Думаю, получилось довольно похоже на оригинал.
Поставь 5 звезд, если понравился мой пост, поделись ссылкой в соц.сети и спасибо за подписку!