background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Базовый курс С++ Часть #93. Анимация финальных титров"

input logo icon
"videoThumbnail Базовый курс С++ Часть #93. Анимация финальных титров
Оглавление
|

Оглавление

0:00
Анимация финальных титров
0:20
Добавим состояние титров Game_Over_Show
5:47
Добавим обработку состояния Game_Over_Destroy
10:06
Вынесем логику взрывающихся шариков в класс AExplosion
15:23
Переносим код начала взрывов в Start_Explosion()
20:33
Перенесём метод Draw_Destroying() в Draw_Explosion()
22:33
Вынесем анимацию в метод Act_On_Explosion()
27:34
Popcorn_part_93_1.zip: пишем код
27:47
Вынесем класс AExplosion в свою пару файлов
30:38
Вынесем класс AsLevel_Title
31:55
Вынесем класс ALabel
33:53
Вынесем класс AFinal_Letter
35:17
Вынесем класс AsGame_Title
39:07
Popcorn_part_93_2.zip: пишем код
39:23
Отнаследуем финальную букву от AExplosion
44:35
Добавим анимацию и рисование взрывов
46:31
Смотрим в отладчике, как уничтожаются буквы
49:19
Исправим анимацию финальных титров
53:40
Добавим код для Is_Finished()
55:00
Баг: Шарики не рисуются
56:11
Баг: Шарики анимируются слишком медленно
59:10
Баг: Шарики не закрывают буквы полностью
1:00:44
Вынесем код в метод Destroy_Letters()
1:05:40
Вычислим размеры буквы
1:10:05
Баг: остаются кусочки букв
1:21:10
Добавим состояния финальной буквы
1:23:57
Исправим отрисовку буквы по состояниям
1:30:20
Вынесем код в Draw_Letter()
1:32:38
Popcorn_part_93_3.zip: пишем код
Теги видео
|

Теги видео

C++
c++ visual studio
Popcorn
visual studio 2019
делаем игровой движок на C++
игры на С++
изучение С++
как научиться программировать с нуля
кодим игры
курсы С++
основы c++
пишем игры
попкорн
Программирование в Windows
Программирование
С++ для начинающих
С++ за час
С++ игры
С++ лекции
С++ обучение
С++ с нуля
С++ уроки
С++
Создание игры на С++
арканоид
анимация
анимация на с++
титры
финальные титры
анимация титров
конец игры
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:00
[музыка]
00:00:16
мы продолжаем делать нашу игру и теперь
00:00:19
когда у нас реализована функциональность
00:00:23
спускающаяся надписи конец игры давайте
00:00:26
сделаем так чтобы эти буквы взрывались
00:00:29
примерно также как это происходит в
00:00:31
оригинальной игре
00:00:34
но здесь мы можем заметить что у нас
00:00:36
буквы переворачиваются и
00:00:38
преобразовываются в монстров а потом
00:00:41
взрываются я предлагаю сделать чуть
00:00:43
проще и просто взорвать эти буквы не
00:00:45
превращая их в монстров но тогда нам
00:00:49
нужно будет в нашей игре сделать еще
00:00:52
одно наверное дополнительно и состояние
00:00:54
у нас сейчас есть состояние описывающая
00:00:57
спуск этих букв и
00:01:02
здесь у нас в перечислении для этого
00:01:05
есть константа имаго descent а также у
00:01:08
нас есть
00:01:09
ситуация описывающая взрывы этих букв но
00:01:12
нам не хватает
00:01:14
ситуации которая течение нескольких
00:01:16
секунд оригинальной игре за 4 секунды
00:01:18
показывает эти буквы игроков перед тем
00:01:21
как взорваться я предлагаю добавить
00:01:23
здесь еще одно состояние давайте назовем
00:01:25
его game over шоу и
00:01:29
в этом состоянии мы будем в течение
00:01:32
четырех секунд показывать буквы на
00:01:34
экране и тогда мне нужно сделать где-то
00:01:37
нашем коде переход в это состояние
00:01:41
вот здесь методе анимация когда мы
00:01:46
спускаем эти буквы в какой-то момент у
00:01:48
нас этот текущий тип времени достигнет
00:01:52
своего предела которая у нас сейчас
00:01:54
равен 6 секундам то есть 120 кадров вот
00:01:59
когда текущий тип дойдет до этого
00:02:00
времени у нас коэффициент
00:02:03
станет равен единице и надпись у нас
00:02:06
будет время находиться на одном и том же
00:02:07
месте вот в принципе это мы и можем
00:02:10
использовать как ситуацию перехода в
00:02:13
другое состояние в котором мы будем
00:02:15
просто показывать эти буквы
00:02:17
здесь
00:02:19
добавлю условия но так как мы можем
00:02:22
прийти к и и ситуации и для спуска
00:02:25
надписи конец игры и для надписей победа
00:02:29
то здесь мне нужно будет в случае если у
00:02:31
нас
00:02:33
мы спускали надпись game over the
00:02:36
перейти в состояние шоу а вот если мы
00:02:39
спускали надпись победа ту я думаю мы не
00:02:41
будем его показывать а сразу перейдем
00:02:43
состоянии анимации поэтому здесь мне
00:02:46
тоже наверно ему нужно будет какое-то
00:02:48
условие сделаешь то есть ли меня
00:02:50
состояние было равно
00:02:55
будут такому спускаю надпись конец игры
00:02:58
то тогда я перейду состоянии показа
00:03:05
то есть вот такое а иначе а
00:03:10
иначе значит мы были вот в таком
00:03:13
создание спускали надпись победа тогда
00:03:16
мы переднем следующее состояние
00:03:20
вот в такое
00:03:22
game вон анимейт я пока еще не знаю что
00:03:26
мы сделаем для этого состояния но у нас
00:03:29
пока я надпись победа еще не анимировано
00:03:31
поэтому решим эту задачу чуть позже а
00:03:34
сейчас нам нужно сделать так чтобы наши
00:03:36
буквы после того как они будут показаны
00:03:38
начали взрываться ну я думаю что здесь
00:03:41
вполне уместно будет
00:03:44
записать в переменную start тег текущий
00:03:48
тип времени и
00:03:50
тогда находясь вот в этом состоянии я
00:03:54
могу подождать пока стартовый тег не
00:03:57
достигнем какой-то другой отметки в
00:03:59
течение которые мы показываем надпись а
00:04:02
когда мы отойдем иногда отметки мы
00:04:03
начнем взрывать буква поэтому в этом
00:04:06
свече я добавлю ещё один кейс
00:04:11
для состояния
00:04:14
game over шоу и
00:04:19
вот в этом состоянии
00:04:22
если
00:04:25
текущий тег
00:04:28
больше некоторого интервала в течение
00:04:32
которую мы показан надпись game over
00:04:35
я думаю мне понадобится константа game
00:04:38
over
00:04:41
show
00:04:43
time out у нас такой нет но мы ее
00:04:47
добавим
00:04:49
сюда и
00:04:52
пусть у нас будет
00:04:55
четыре секунды хотя возможно это много
00:04:59
но пусть будет
00:05:02
так вот если он находимся в состоянии
00:05:05
показа букв и текущей тех времени
00:05:08
превысила это пороговое значение
00:05:10
значит все мы должны перейти в другое
00:05:13
состояние
00:05:14
которое мы будем
00:05:17
уничтожать эти буквы
00:05:28
game over де строй и я думаю сразу же
00:05:32
можно
00:05:33
задать новое значение для стартового
00:05:37
тика для того чтобы мы находясь в этом
00:05:39
состоянии гейма вроде строй уже от этой
00:05:42
отметки отсчитывали значение текущего
00:05:45
тика времени поэтому я пожалуй добавлю
00:05:48
сразу же
00:05:50
еще один кейс для game award и дестрой и
00:05:56
вот в этом состоянии мы будем смотреть
00:06:00
на текущий тег и нам в принципе здесь
00:06:03
нужно вот эту надпись конец игры нам
00:06:06
нужно по очереди взрывать каждую букву
00:06:10
то есть нам нужна некая периодичность я
00:06:13
могу например сделать вот так я могу
00:06:15
делить текущее время на некий интервал
00:06:19
через которую мы будем взрывать
00:06:21
очередным буквам и если остаток от этого
00:06:23
отделения будет равен нулю то значит
00:06:25
такое событие будет происходить раз в
00:06:27
интервал то есть я вот этот текущий тип
00:06:32
разделю причем не просто разделе возьму
00:06:34
остаток отделение на задержку перед
00:06:38
взрывом задержка это живой
00:06:43
и
00:06:44
вот если у меня остаток от деления будет
00:06:48
равен нулю то значит раз вот столько
00:06:52
тиков у меня будет срабатывать это
00:06:53
условие ну давайте сделаем эту задержку
00:06:56
перед взрывом ну допустим в полсекунды
00:07:08
fps делить на два и
00:07:11
таким образом у меня получится условия
00:07:14
которая срабатывает каждые 10 кадров я
00:07:17
думаю что можно это даже подписать
00:07:19
комментария
00:07:22
вот так и тогда здесь находясь в этом
00:07:26
условии я могу уже взять это значение
00:07:29
текущего тика и разделить на вот это вот
00:07:33
время на интервал и таким образом я
00:07:36
получил сколько раз у меня в этом
00:07:39
количестве тиков помещается вот этот
00:07:42
интервал и таким образом по сути получил
00:07:44
номер буквы и я могу этот номер вернее
00:07:46
даже индекс использовать для выбора
00:07:49
очередной буква
00:07:53
назовем этот дестрой индекс
00:07:56
добавим эту целую переменную и
00:08:01
и сгруппирую из другой целые
00:08:05
причем я группирую сначала переменные
00:08:08
которые занимают меньше памяти по четыре
00:08:10
байта а потом будут переменные которые
00:08:12
занимают по восемь байт и таким образом
00:08:14
для стыка может выделиться меньше памяти
00:08:18
это зависит от компиляции проекта а
00:08:20
может выделиться по восемь элементов но
00:08:23
случае если мы будем компилировать эту
00:08:25
программу в особом религиозном виде я
00:08:27
думаю мы это сделаем чуть позже то тогда
00:08:30
здесь будет пенсию памяти расходованы на
00:08:32
представление этих переменных ну в общем
00:08:35
теперь я буду использовать этот дестрой
00:08:37
индекс для того чтобы выбрать очередную
00:08:40
букву из коллекции наших букв и
00:08:46
если этот индекс он больше либо равен
00:08:50
нулю потому что индекс нос от моря
00:08:53
должен отчитываться и при этом этот
00:08:55
индекс меньше но не равен количеству
00:08:58
элементов в коллекции
00:09:02
для этого я этого вектора вызову me that
00:09:06
says
00:09:08
значит мы попали внутрь этой коллекции и
00:09:11
тогда я могу
00:09:13
обратившись к этому очередному элементу
00:09:16
через квадратной скобки вызвать у него
00:09:19
метод который должен уничтожить эту
00:09:22
букву таком метода у нас нет
00:09:25
давайте предположим что у нас есть метод
00:09:28
для уничтожения
00:09:29
дестрой а есть ли этот индекс у нас уже
00:09:33
не попадает в коллекцию то есть слишком
00:09:36
много этих тиков то значит все мы
00:09:40
закончили уничтожать последнюю букву я
00:09:43
здесь могу перейти следующее состояние
00:09:47
следующее состояние в данном случае
00:09:49
будет у нас
00:09:51
finished потому что из этого дестрой мы
00:09:55
перейдем сюда а из этого села
00:10:05
ну вот в принципе и всё осталось
00:10:08
добавить метод для уничтожения буквы в
00:10:12
нашу
00:10:14
финальную букву это будет очевидно
00:10:17
публичный метод
00:10:18
который ничего не будет возвращать
00:10:31
ну и вот здесь в этом методе не нужно
00:10:35
уничтожить нашу боку точно так же как мы
00:10:38
это делаем уничтожая наших монстров а у
00:10:42
наших монстров
00:10:47
вот у монстра есть метод быстрой этот
00:10:52
метод он там вычисляет позицию и размеры
00:10:56
области в которой будут взорваться
00:10:58
шарики и потом всем своем взрывающимся
00:11:01
шариком задает случайную позицию
00:11:04
случайный интервал размер и
00:11:07
включает им взрывание после чего эти
00:11:10
шарики уже как бы сами взрываются а все
00:11:13
что делает монстры он в своем методе
00:11:15
анимации
00:11:17
акт случае уничтожения
00:11:21
он пробегается по каждому взрывающеюся
00:11:25
шарику и заставляет его анимироваться
00:11:27
при этом проверяет закончилась ли
00:11:30
анимация очередного шарика и когда у
00:11:32
всех шариков анимация закончена то он
00:11:35
стёр считается пропавшим вот принципе то
00:11:38
же самое нам бы и нужно повторить для
00:11:41
нашей финальной буквы и я думаю что
00:11:44
лучшим вариантом будет вынести
00:11:47
функциональность взрывающихся шариков из
00:11:50
монстров в отдельный класс и потом
00:11:53
использовать эту функциональность для
00:11:56
наших
00:12:00
файна лето и
00:12:03
для этого я думаю самый лучший вариант
00:12:06
будет вынести
00:12:08
функциональность этих шариков и
00:12:11
унаследовать от нее монстра потому что
00:12:14
взрывающиеся шарики это как бы
00:12:16
функциональность монстр просто она у нас
00:12:19
будет инкапсулированным в отдельный
00:12:20
класс давайте класс который отличается
00:12:23
взрывы назовем x пружин
00:12:35
ну а так как функциональность этого
00:12:37
класса не должна у нас быть доступна
00:12:39
извне то у нас оно все будет защищена и
00:12:42
и
00:12:43
мы унаследуем от этого класса класс
00:12:47
нашего монстр
00:12:49
причем наследование я сделаю публичное
00:12:53
таким образом все защищенные методы из
00:12:56
этого класса x положим останутся
00:12:59
защищенными но уже внутри класса монстр
00:13:02
и тогда будет в этот класс я перенесу
00:13:05
коллекцию взрывающихся шариков и
00:13:11
нам понадобится еще метод который будет
00:13:14
создавать эти шарики правильно сейчас у
00:13:16
нас насколько я помню нашего монстра
00:13:21
в конструкторе тха монстра мы создаем
00:13:25
сразу всех шарики мы используем
00:13:27
конструктор вектора с количеством
00:13:31
элементов и это значит что при создании
00:13:33
вектора то есть при создании коллекции
00:13:36
шариков будут созданы все элементы
00:13:39
внутри этой коллекции это сделано потому
00:13:41
что у нас здесь хранятся экземпляры
00:13:44
объектов они указатели на объект в куче
00:13:47
но в общем для нас это значит что у
00:13:49
кваса t-икс позже он должен быть свой
00:13:53
конструктор моего разместим защищенное
00:13:56
секции этот конструктор нельзя будет
00:13:59
вызвать извне то есть нельзя будет
00:14:00
создать просто объект типа x положен но
00:14:03
этот конструктор можно будет вызвать в
00:14:06
контексте производного класса причем мы
00:14:09
явно его даже вызывать не будем он
00:14:11
вызовется сам когда будет создаваться
00:14:13
объект классом монстр
00:14:15
но
00:14:17
тогда я смогу реализовать здесь отдельно
00:14:20
конструктор
00:14:22
чтобы в нем
00:14:25
проинициализировать вот эти взрывающиеся
00:14:27
шарики
00:14:40
я заберу из конструктора монстров эту
00:14:43
синицы а лиза цию и реализую ее списке
00:14:47
инициализации этого класса экспо жим ну
00:14:51
и здесь нам нужно константа теперь это
00:14:54
константа неизвестно внутри этого класса
00:14:57
я ее заберу отсюда и
00:15:02
добавлю сюда почему это может быть уже в
00:15:05
приватной секции
00:15:07
данного класса и
00:15:09
таким образом у нас тут коллекция
00:15:13
взрывающегося шариков оказалось вынесены
00:15:15
в отдельный класс если я сейчас
00:15:17
компилирую этот файл то скорее всего всё
00:15:20
с компиляция потому что к разных точек
00:15:21
тут не было но этого недостаточно
00:15:25
нам нужно еще и вынести весь функционал
00:15:27
который оперирует этими шариками тоже в
00:15:30
этот класс для этого я эту коллекцию
00:15:34
шариков перенесу в приватную секцию и
00:15:37
теперь тот код который был у монстра уже
00:15:41
не имеет доступа к этим шарикам
00:15:43
потому что они находятся в приватной
00:15:46
секции базового класса и это дает нам
00:15:50
подсказку о том какие именно строки кода
00:15:53
нужно перенести из монстра в базовый
00:15:57
класс x положим я думаю что наверно весь
00:15:59
этот метод дестрой можно перенести в
00:16:03
класс explo жим хотя нет не весь здесь
00:16:06
мы модифицируем состоянии монстра
00:16:08
которого у нас нету в этом классе x
00:16:11
положим да и не должно быть здесь мы
00:16:14
обновляем счет поэтому как минимум вот
00:16:17
эти две строки останутся но всё
00:16:20
остальное наверное надо забрать в новый
00:16:22
метод но а так как этот метод будет
00:16:24
находиться уже в контексте класса а x
00:16:27
позже то здесь это уже будет не то чтобы
00:16:29
достроить то есть не уничтожение а
00:16:31
скорее просто начала взрывов поэтому я
00:16:35
бы здесь добавил метод который я бы
00:16:36
назвал старт экспо жен и
00:16:55
вот этот метод я и перенесу все что у
00:17:01
нас есть в этом методе ondestroy
00:17:03
отсюда забираем
00:17:06
сюда переносим а там откуда мы забрали
00:17:12
я вызову метод start x положим так как у
00:17:17
нас монстр от наследова над класса а x
00:17:22
положим то этот метод
00:17:24
находится уже в контексте этого класса
00:17:27
монстр то есть это метод этого класс
00:17:29
поэтому я вам здесь могу спокойно
00:17:31
вызвать не указывая бернем имени класса
00:17:33
или имени объекта то есть это считается
00:17:36
как метод монстр ну и теперь надо
00:17:40
работать этот код вот кстати вот эта
00:17:43
проверка состояния монстра она здесь
00:17:47
неуместно контексте этого класса поэтому
00:17:49
я это верну обратно
00:17:52
сюда наверно перед старт x положенном
00:17:59
и
00:18:00
все что мне остается это передать
00:18:03
каким-то образом ширину и высоту а также
00:18:06
начало прямоугольной области внутри
00:18:08
которые будут взорваться шарики и все
00:18:10
причем я думаю что можно даже наверное
00:18:13
не заморачиваться с передачей вот этих
00:18:15
координат а сразу передать сюда
00:18:18
прямоугольную область
00:18:19
у
00:18:22
нас у нашего монстра наверняка должно
00:18:25
быть какая-нибудь такая у вас вот монстр
00:18:28
correct я могу этот монстр трек
00:18:31
передать например по ссылке сюда и
00:18:35
использовать этот прямоугольник
00:18:38
чтобы получить его размера и позицию
00:18:41
тогда я здесь в этом методе приму ссылку
00:18:45
на rect которая будет описывать
00:18:48
прямоугольник области в которой
00:18:50
происходят взрывы
00:18:56
я добавлю тащу за голову снам файле и
00:19:00
тогда я могу
00:19:02
ширину области кстати она уже будет
00:19:05
приведено к реальным пикселем то есть
00:19:08
тут уже все будет в этом и рио rect
00:19:10
представлена реальными пикселями имя не
00:19:13
надо умножать на глобальный масштаб
00:19:14
поэтому я вместо вот этого выражения
00:19:16
могу взять правый край этой области
00:19:21
вычесть из него левый край и таким
00:19:24
образом получу ширину все что мне
00:19:27
остается это разделить потом на 2 чтобы
00:19:30
получить половину ширины и аналогично
00:19:34
я поступлю с высотой я из нижнего края
00:19:38
потому что он больше
00:19:40
вычету верхней это меньшее значение и
00:19:44
это все раздели на 2 и у нас получится
00:19:47
половина высоты ну а позицию по иксу я
00:19:52
могу получить причем вот эту умноженную
00:19:55
на масштаб позицию я могу получить
00:19:58
обратившись к члену данных лифт а по
00:20:03
игреку это будет топ
00:20:07
да этот прямоугольник позволив нам
00:20:11
получить все нужные координаты
00:20:12
тогда вот это преобразование канту можно
00:20:15
убрать может the left это и так целое
00:20:17
значение и
00:20:20
аналогично топ тоже целое значение
00:20:24
вот и все студия тут нам красных точек
00:20:27
не ставит и значит что похоже в этом
00:20:30
методе ошибок нет и у нас остается пара
00:20:34
других ошибок связано с тем что мы в
00:20:36
монстры при рисовании и при анимации
00:20:39
обращаемся к коллекция этих взрывающихся
00:20:42
шариков но теперь эта коллекция
00:20:44
находится в приватной секции класса x
00:20:48
положен несмотря на то что монстр от
00:20:50
наследова на от этого класса все что
00:20:53
находится в приватной секции монстру
00:20:55
непосредственно недоступна и это не баг
00:20:59
это фича которая позволяет нам строить
00:21:01
правильные иерархии наследования классов
00:21:04
то есть эти шарики являются
00:21:07
функциональностью класса занимающегося
00:21:09
взрывами поэтому оперировать этими
00:21:12
шариками и должен и этот класс они
00:21:15
производный класс поэтому я
00:21:18
вот это могу
00:21:22
реализовать уже в базовом курсе
00:21:25
вот здесь
00:21:29
я сюда перенесу копию этого метода то
00:21:33
меня название класса но и здесь это имя
00:21:36
уже поменял бы потому что здесь в
00:21:39
контексте этого класса x позже но уже не
00:21:41
про уничтожение говорим о про эксплоужн
00:21:44
про взрывы поэтому я здесь сделают / x
00:21:48
позже и
00:21:57
уже этот метод я и вызвал бы вот здесь
00:22:02
но зачем нам метод который вызывает
00:22:06
метод поэтому я могу вместо / достроен
00:22:10
вызвать метод / x положим
00:22:21
и тогда метод
00:22:23
который у нас называется дроны строим я
00:22:27
могу удалить
00:22:28
теперь у нас такая функциональность в
00:22:31
базовом классе и
00:22:33
аналогично я могу поступить и с вот этим
00:22:36
методом но этот метод у нас модифицирует
00:22:39
еще состоянии монстра поэтому полностью
00:22:44
перенести не получится но я могу
00:22:45
перенести вот эту часть которая
00:22:47
оперировать только шариками поэтому я
00:22:50
скопирую это и
00:22:53
так как у нас традиционно метатег от
00:22:57
идет перед рисованием то я здесь тоже
00:23:00
рисующий метод оставлю ниже а
00:23:03
действующий метод поставлю выше и
00:23:11
также его переименую
00:23:13
икт икс положен но как то не очень
00:23:18
получится этот тоник позже действует при
00:23:22
взрывах и
00:23:23
я добавлю этот метод
00:23:27
заголовочный файл и
00:23:32
поменяю имя класса
00:23:35
ну вот отличным ясно что нам нужно
00:23:39
наверное будет вернуть вот это значение
00:23:41
которое у нас тут накапливается за счет
00:23:44
того что я использую оператор and равно
00:23:46
то на каждую итерацию я применяю к этой
00:23:50
булевой переменной результат который
00:23:53
вернет функция из финиш и если здесь
00:23:55
хотя бы один шарик вернет фолз то у нас
00:23:59
здесь будет falls для всех это значит
00:24:02
что мы ещё не закончили и только когда
00:24:04
все вызовы вернут true тогда эта
00:24:07
операция не поменяет значение этой
00:24:10
переменной она останется true и вот мы
00:24:12
его вернем как результат уничтожение
00:24:15
всех шариков
00:24:17
но для этого метод должен иметь булевой
00:24:20
возврату
00:24:23
и
00:24:25
тогда я могу этот метод вызвать уже
00:24:29
здесь
00:24:32
так причем даже внутри этого условия что
00:24:37
если
00:24:38
act on explosion то есть если все там
00:24:42
успешно завершилась то мы перейдем
00:24:45
состоянии пропавшего монстра давайте
00:24:47
посмотрим что у нас тут будет
00:24:49
компилироваться
00:24:54
есть одно замечание по поводу того что я
00:24:57
обращаюсь к методу says векторах который
00:25:00
возвращает без знаковое значение а мы
00:25:02
его сравниваем со знака вам значение но
00:25:05
похоже это единственное замечание и это
00:25:08
значит что у нас
00:25:10
процесс вынесения функционала монстров в
00:25:15
отдельный класс прошел успешно ну по
00:25:18
крайней мере с точки зрения компиляции
00:25:20
давайте посмотрим будет ли взрываться
00:25:22
монстр если он будет взорваться то
00:25:24
значит и функционально у нас тоже все
00:25:26
хорошо и мы не поломали ничего процессе
00:25:30
такого рефакторинга
00:25:37
монстр появился
00:25:41
монстр взрывается
00:25:45
надпись спускается ну-ка роста я на
00:25:49
всякий случай добавлю сюда этот скриншот
00:25:52
чтобы эта надпись была под рукой
00:25:56
ну и это хорошо это значит что нам
00:25:59
удалось вынести часть функциональности
00:26:02
из одного класса в другой раньше мы
00:26:04
выносили как бы сущность находящуюся
00:26:07
внутри сущности и это было проще делать
00:26:11
потому что сразу было видно что к чему
00:26:13
относится но в этот раз мы вынесли
00:26:15
именно функциональность этого монстра
00:26:18
которую мы смогли представить к
00:26:19
отдельным классом в принципе это можно
00:26:21
сделать практически с любым классом и
00:26:23
любые функциональности тоже по выносить
00:26:25
в отдельные классы но лишний раз лучше
00:26:28
этого не делать потому что все-таки это
00:26:30
лишний квас это усложняет архитектуру
00:26:33
нашего проекта я рекомендую это делать
00:26:34
только тогда когда нам нужно повторить
00:26:37
одну и ту же функциональность в разных
00:26:40
сущностях именно поэтому мы и выносили
00:26:42
здесь всего в отдельный класс и
00:26:44
explosion для того чтобы применить потом
00:26:47
это же наследование вот такое но уже для
00:26:52
нашей финальные буквы чтобы она тоже
00:26:55
много взрываться но прежде чем это
00:26:57
сделать я бы хотел немного а3 factory
00:27:01
наш код у нас тут в этом файле лектора
00:27:05
аж уже много сущностей
00:27:07
или трассе пеппи наверно разросся уже
00:27:11
больше чем за тысячу строк это много
00:27:15
ориентироваться в таком файле будет
00:27:17
непросто поэтому я бы вынес это всё в
00:27:20
отдельные пара файлов но прежде чем это
00:27:22
сделать нам нужен некий срез нашего
00:27:25
проекта по которым вы могли бы проверить
00:27:27
правильно ли вам удалось вынести
00:27:30
функциональность взрывов в отдельный
00:27:33
класс поэтому мы сейчас сделаем паузу и
00:27:35
теперь ваша очередь вынести
00:27:37
функционально взрывов в отдельный класс
00:27:40
и x положен и убедиться что монстр после
00:27:43
этого продолжает взрываться при
00:27:45
уничтожении
00:27:46
для того чтобы мы могли воспользоваться
00:27:49
функциональностью класса explosm для
00:27:52
взрыва наших финальных букв
00:27:56
нам нужно здесь подключить тот исходный
00:28:00
файл в котором этот код находится но
00:28:03
подключается здесь монстров в уровне как
00:28:07
бы не совсем правильно и по хорошему
00:28:09
более правильным решением будет вынести
00:28:11
вот этот класс в отдельную пару файлов и
00:28:14
ее подключить здесь у монстров и здесь в
00:28:18
этом уровне ну и раз мы будем выносить
00:28:21
классы в отдельные пары файлов тут
00:28:23
давайте заодно и заберем отсюда ту же
00:28:26
лишние квас они у нас уже более меня
00:28:29
сформированы но мы начнем
00:28:31
с экс позже но я возьму это имя без
00:28:35
префикса создам здесь фильтр и
00:28:39
перенесу его отсюда на monster's чтобы
00:28:43
он здесь стал в алфавитном порядке и
00:28:47
добавлю сюда пару файлов
00:28:54
си пи пи и
00:29:00
заголовочный файл
00:29:07
я заберу из монстра
00:29:13
этот класс а
00:29:17
соответствующий код заберем уже есть
00:29:19
типе файла
00:29:22
[музыка]
00:29:31
поправлю список инициализация и для того
00:29:35
чтобы тут всё компе лилась я думаю что
00:29:36
нам будет достаточно подключить наш
00:29:38
конфиг
00:29:44
я скомпилирует только это цепи файл но
00:29:48
студия говорит что нам тут нужен x по
00:29:52
xii в пол и
00:29:53
тогда это значит что нужно вот этот
00:29:57
класс который у нас и так находится в
00:29:59
отдельная паре файлов
00:30:02
подключить вот здесь ну тогда его вместо
00:30:05
конфига и подключу
00:30:07
компилируем
00:30:10
ошибок нет и у нас квас и explosion
00:30:15
оказался в своей собственной баре файлов
00:30:17
и теперь я могу этот
00:30:20
файл подключить уже
00:30:24
монстра вместо x по xii в полу подключим
00:30:28
x положен и таким образом наш монстр
00:30:31
получит эту функциональность а
00:30:33
скомпилировал только этой цепи файл и
00:30:37
ошибок нет теперь давайте вынесем
00:30:41
из файла level хаш вот этот квас для в
00:30:46
тайтл который описывает табличку с
00:30:49
номером нового уровня и
00:30:52
я добавлю фильтр
00:30:56
перенесу его здесь в пределах этого
00:30:59
фильтра screen и он занял последнее
00:31:02
место согласно алфавиту
00:31:19
я добавил пару файлов теперь сюда у нас
00:31:23
переедет и вот той дал вместе с этим
00:31:27
перечислением
00:31:38
а
00:31:40
кот я заберу из себя пи файла и
00:31:44
перенесу уже в свой собственный стиль
00:31:47
хиппи файл
00:31:50
поправим список инициализации и
00:31:55
здесь для того чтобы это всю компе
00:31:57
лилась
00:31:59
нам нужен будет квас лэйбл поэтому я
00:32:03
думаю что надо будет вынести еще и этот
00:32:06
а
00:32:07
где он у нас кстати находится этот и
00:32:10
логику а
00:32:13
ум у нас в инфо панель надо будет из
00:32:17
инфопанели вынести этот квас тоже в
00:32:19
отдельную пару файлов тогда я возьму
00:32:21
этот лейбл
00:32:24
создам фильтр
00:32:30
добавлю пару файлов
00:33:02
и
00:33:03
вот класс и лэйбл переехал в свою пару
00:33:08
файлов и
00:33:09
я думаю что для его компиляции он будет
00:33:13
достаточно подключить наш конфиг
00:33:19
я скомпилируют только это цепи файл
00:33:23
он скомпилировалось а успешно ты знаешь
00:33:26
что теперь я этот лейбл могу подключить
00:33:31
вот здесь в нашем новом файле требовал
00:33:35
то это ложь и мы получим
00:33:37
функциональность из конфига и
00:33:40
функциональность этого лэйбл компилируем
00:33:43
только этот файл ошибок нет и вот у нас
00:33:47
еще и этот класс переехала свою
00:33:51
собственную пару файлов но это кажется
00:33:54
еще не все и у нас в нашем уровне я
00:33:58
думаю мы можем и вот этот класс файна
00:34:01
узнать то тоже перенести свою
00:34:03
собственную пару файлов поэтому я
00:34:06
добавлю фильтр
00:34:12
и
00:34:20
парк файлов
00:34:55
здесь я думаю нам будет достаточно
00:34:56
конфига
00:35:02
компилируем только этот файл
00:35:05
ошибок нет ну тогда этот файлов лента
00:35:09
она будет подключить вот здесь в нашем
00:35:12
лево ли
00:35:16
ну я думаю что и вот game тайтл тоже
00:35:20
наверно нужно вынести свою собственную
00:35:22
пару файлов раз у нас тут такой
00:35:25
рефакторинг
00:35:35
я добавлю пару файлов
00:35:56
и нам этот гейм той талон ужин вместе со
00:35:59
своим
00:36:00
перечислением поэтому я заберу его
00:36:03
вместе с классом
00:36:10
ну а кот заберем асти где flava
00:36:27
здесь нам нужен конфиг-файл
00:36:30
адепта поэтому я думаю что если мы
00:36:34
подключим fine он это кстати его здесь
00:36:38
вливал подключал я заберу отсюда и
00:36:43
подключу здесь
00:36:50
компилируем этот файл
00:36:52
тут ошибок нет и тогда я могу подключить
00:36:55
game тайтл нашем уровне и по идее этого
00:36:59
будет достаточно чтобы скомпилировать
00:37:03
нет
00:37:04
недостаточно нужен еще лейбл
00:37:08
в инфо панели
00:37:19
компилируем весь проект
00:37:25
не хватает подключение level тайтл
00:37:30
ах ну да game тайтл и левл тайтл
00:37:47
и все проект скомпилировав и кажется это
00:37:51
прекрасно нас получился чуть ли не самый
00:37:54
масштабный рефакторинг за последнее
00:37:56
время и я думаю что вот как минимум вот
00:37:59
эти три пары файлов можно объединить в
00:38:02
свой собственный раздел я бы его назвал
00:38:04
лего
00:38:10
я добавлю решетка левую
00:38:25
и сюда я перенесу
00:38:27
сама лего лего да это
00:38:31
level to it all ну вроде все в принципе
00:38:36
мы могли бы из вот этих вот
00:38:38
виртуальных каталогов тоже построить
00:38:41
какую-то иерархию ну пока что я думаю
00:38:44
будет достаточно и такого
00:38:47
компилируем мы запускаем
00:38:50
ну пока все работает
00:38:59
ну в принципе анимация работает
00:39:02
монстры плавает это значит что все у нас
00:39:05
вроде бы работает правильно и на этом
00:39:07
месте мы сделаем очередную паузу и
00:39:10
теперь ваша очередь вынести в отдельные
00:39:12
пары файлов класс rx plugin класс клевал
00:39:16
тайтл лейбл и также класс с финальной
00:39:20
буква и кейм тайтл ну и теперь когда
00:39:24
функциональность взрывов у нас уже
00:39:26
оформлена в виде отдельного класса в
00:39:29
своей собственной паре файлов мы можем
00:39:32
подключить эту функциональность
00:39:34
для букв которые будут у нас взорваться
00:39:38
сюда файнал это то есть здесь не нужно
00:39:42
поступить так же как мы обошлись с
00:39:45
нашими монстрами а именно от наследовать
00:39:49
класс от класса x паузу
00:39:54
для того чтобы этот класс был и здесь
00:39:56
доступен я подключу его в места конфига
00:40:00
он уже подтянет конфиг и все те типы
00:40:04
которые нам нужны для компиляции теперь
00:40:06
класс нашей финальные буквы получил
00:40:10
возможность начать взрывы анимировать
00:40:14
эти взрывы и отрисовывать шарики взрывов
00:40:16
но для того чтобы это работало нам нужно
00:40:19
вызвать эти функции соответствующих
00:40:21
местах методов файлов лет ну давайте
00:40:24
начнем с первого метода который
00:40:28
запускает взрывы и
00:40:30
для нашей файнал нет то у нас есть метод
00:40:34
дестрой которые и стартует эти взрывы
00:40:37
поэтому здесь я и вызовов метод start
00:40:40
как сложен теперь это метод еще и этого
00:40:45
класса потому что мы унаследовали его из
00:40:48
базового но этому методу нужно передать
00:40:52
прямоугольник в котором находится
00:40:53
область этих взрывов и здесь нам нужно
00:40:57
либо традиционным для нас уже способом
00:40:59
определить прямоугольник как член данных
00:41:02
и заполнить его параметрами но так как
00:41:05
эта буква у нас самостоятельно двигаться
00:41:07
не будет то наверное нет смысла
00:41:09
определяет линию этот прямоугольник я
00:41:11
могу его сделать прямо здесь и
00:41:17
передач в этот метод предварительно
00:41:20
заполнив значениями
00:41:23
левый край у меня будет эта позиция по x
00:41:26
ум а кстати можно взять всю эту
00:41:29
конструкцию
00:41:32
это будет
00:41:35
верхний край
00:41:46
оправа я получу прибавив ширину нас тут
00:41:50
есть ширина а нету у нашей финальной
00:41:53
буквы ширины ну наверное надо было бы ее
00:41:57
сюда передать причем я бы передал ширину
00:42:02
и высоту
00:42:03
последними параметрами а так как они
00:42:06
нужны нам здесь
00:42:07
целочисленном видит то это будет целует
00:42:11
вид
00:42:14
хейт и сразу в приравнял их какому-то
00:42:18
значению ну например как у нас буквы
00:42:20
идут с отступом 16 игровых пикселей вот
00:42:23
здесь-то я могу сразу задать им размеры
00:42:27
по 16 игровых пикселей и тогда
00:42:32
создавая экземпляры этих fine only то я
00:42:36
смогу использовать тот же самый код
00:42:37
который у нас и так уже сейчас создают
00:42:40
эти файлов дать то
00:42:42
вот здесь методе шоу потому что эти два
00:42:46
дополнительных параметров автоматически
00:42:48
получат свои размеры
00:42:50
в общем я
00:42:55
добавлю две этих переменных в
00:43:00
конструкторы но уже без этих
00:43:04
присваивания снимем будет у нас ошибка
00:43:07
не эти присваивания должны находиться в
00:43:09
заголовке данном случае в заголовочной
00:43:12
файле но не в себе и я сохраню то дайте
00:43:16
значение
00:43:19
в члены данных которые мне придется сюда
00:43:22
добавить
00:43:23
будет шириною то и
00:43:38
тогда я могу воспользоваться этими
00:43:40
значениями уже вот здесь ему придется
00:43:43
умножать на
00:43:45
масштаб его целой численной форме
00:43:58
за счёт того что эти параметры имеет
00:44:01
значения по умолчанию мне не нужно их
00:44:04
дополнительно прописывать для каждой
00:44:06
буквы ну а если какая-то буква должна
00:44:08
быть о таких шире то тогда мы уже имеем
00:44:11
возможность конкретно указать эти
00:44:13
значения например для bukva оно все таки
00:44:15
будет шире чем допустим буква г хотя
00:44:19
в общем да здесь у нас
00:44:23
это буква по ширине вся четыре пикселя
00:44:27
это 37 так что если нужно мы сможем этим
00:44:33
буквам указать конкретное значение ну
00:44:36
давайте вернемся к той задаче с которой
00:44:39
мы начали а именно мы добавили новый
00:44:43
базовый класс в нашу финальную букву и
00:44:46
теперь нам нужно вызвать эти методы уже
00:44:49
в нашей финальной букве вот этот старт x
00:44:52
положим мы вызываем когда запускаем
00:44:55
уничтожения буква и теперь нам нужно
00:44:58
вызвать анимацию ну и это мы можем
00:45:01
сделать
00:45:04
в методе анимации нашей финальной буквы
00:45:08
вот так и
00:45:10
остается последний метод это отрисовка
00:45:15
друга x положим мы вызовем вот здесь но
00:45:21
правда мы должны это вызвать так это
00:45:24
буква уже взрывается а она у нас должна
00:45:27
либо рисоваться либо взрываться но думаю
00:45:30
здесь можно добавить простое условие что
00:45:32
если взрываемся
00:45:38
кузин
00:45:39
[музыка]
00:45:41
то героем
00:45:43
рисовал не этих взрывов а
00:45:48
иначе
00:45:51
рискуем букву так как рисковали до этого
00:45:55
тогда мне нужно добавить эту булеву
00:45:58
переменную
00:45:59
в наш класс и
00:46:03
pro инициализировать ее
00:46:06
конструкторы
00:46:08
вначале у нас будет фолз потому что мы
00:46:11
не взрываемся
00:46:13
тогда эти скобки уже не нужны ну вот мы
00:46:17
и задействовали все три метода есть
00:46:20
нового базового класса остается только
00:46:22
вот этот экспо узел установить в true
00:46:27
когда мы начнем взрывать
00:46:30
давайте посмотрим что из этого получится
00:46:33
причем я бы поставил контрольную точку в
00:46:37
методе анимации нашей надписи
00:46:40
вот здесь нет ни здесь мы плавно
00:46:44
опускаем мукой а вот когда мы начнем их
00:46:46
показывать и
00:46:48
уничтожать я бы посмотрим в отладчике
00:46:50
потому что это у нас новые секции
00:46:52
которую мы ещё не проверяли
00:47:07
итак буквы доехали до кантом и мы
00:47:10
перешли в состоянии game over шоу это
00:47:13
состояние включается после того как мы
00:47:16
закончили спуск надписи и
00:47:20
мы здесь ждем пока текущей тег достигнет
00:47:24
вот этой отметки в 40 кадров я поставлю
00:47:27
контрольную точку внутри условия и эта
00:47:30
точка должна будет сработать когда мы
00:47:31
проиграем 40 кадров
00:47:36
до прошли эти 40 кадров и мы переходим в
00:47:39
состояние дестрой и
00:47:41
перезапускаем счетчик тиков и
00:47:45
вот мы зашли в состоянии где строй и у
00:47:49
нас мы сразу не попали сюда но я
00:47:51
поставлю контрольную точку внутрь
00:47:53
условия и
00:47:55
конце концов на десятом кадре мы зашли
00:47:58
сюда и дестрой индекс у нас равен 1
00:48:01
вообще-то хотелось бы начать с 0 ну да
00:48:04
ладно и мы обращаемся к первому элементу
00:48:07
от нуля и
00:48:10
вызываем метод дестрой у нашей фай но
00:48:13
зато это буква о от этого то есть это у
00:48:19
нас
00:48:20
вот эта буква
00:48:23
здесь я вычисляю прямоугольник которые
00:48:27
более менее достоверно выглядит и
00:48:29
запускаю процесс взрывов для этой буквы
00:48:32
так что теоретически
00:48:35
я должен запустить взрыва всех этих букв
00:48:38
и когда мы запустим взрыв следующая
00:48:42
буква у нас на экране должны быть
00:48:43
взрывающиеся шарики вместо букву но их
00:48:47
нет поэтому если я сниму здесь
00:48:49
контрольную точку to destroy как бы
00:48:53
работает но ничего не рисуется я думаю
00:48:57
что это связано с тем что когда мы
00:48:59
делаем нет и строй наверно нам нужно
00:49:01
заказать перерисовку от этого
00:49:04
прямоугольника для того чтобы это
00:49:06
изображение попала на экран и обзовут
00:49:09
здесь
00:49:11
нашего инструментария
00:49:13
метод инвалиды трек для этого проекта и
00:49:18
посмотрим что у нас получится хотя я
00:49:23
думаю что за одну нужно сделать еще и
00:49:26
здесь важную задачу у нас несмотря на то
00:49:30
что мы в методе акт заказываем
00:49:33
уничтожения этих символов нас нигде не
00:49:36
вызывается метод икт для наших финальных
00:49:40
букв я могу правой клавишей мышки
00:49:43
выбрать пункт меню файл all references
00:49:47
который найдет все использования этого
00:49:49
метода рода этот поиск не всегда
00:49:52
работает правильно иногда студия
00:49:55
почему-то не может найти все вызовы
00:49:58
такого метода поэтому полагаться
00:50:00
полностью на отсутствие чего-то в этом
00:50:03
списке нельзя но вот тем не менее студия
00:50:05
проанализировала во весь наш проект и
00:50:08
нашла только две строки
00:50:10
заголовочные файлы и все пеппи файле и
00:50:13
все не где этот метод не вызывается ну в
00:50:17
принципе так наверно но есть нам нужно
00:50:20
здесь пока идет уничтожение букв из
00:50:24
этого метода акт
00:50:26
вызывать методы икт для каждой буквы а
00:50:29
это значит что вот здесь нам нужно
00:50:32
пробежаться в цикле по каждой букве и
00:50:41
для этой буквы выполнить метод анимацию
00:50:47
при чем здесь у нас когда мы закончим
00:50:51
перебирать все буквы мы сразу же
00:50:53
перейдем состоянии финиш
00:50:55
честно говоря преждевременно потому что
00:50:58
скорее всего анимация последняя буква
00:51:00
возможно даже предпоследний еще не будет
00:51:02
закончена поэтому по-хорошему мы должны
00:51:05
сделать отложенный переход в это
00:51:07
конечное состояние тогда когда
00:51:10
закончатся собственно анимация и у нас
00:51:13
есть специальный метод который мы можем
00:51:16
вызвать для каждой буквы
00:51:19
называется из финиш
00:51:21
этот не вернет нам true или false если
00:51:25
буква закончила свою анимацию сейчас
00:51:28
правда этот метод ничего не делает но в
00:51:32
одном это чуть позже сделал а здесь мы
00:51:34
давайте сделаем алгоритм который
00:51:37
проанализирует
00:51:38
закончилась ли анимация у всех букв и
00:51:41
если да то тогда перейдет в состояние
00:51:44
финиш я здесь могу накопить результат
00:51:47
множество вызовов метода из финиш в одну
00:51:51
болевую переменную например назовем ее
00:51:54
так
00:52:00
я тогда это значение сюда
00:52:03
применю с помощью оператора and равно
00:52:07
это у нас будет пулевая переменная
00:52:13
которое у нас в начале этого алгоритма
00:52:17
установится в труд если хотя бы одна
00:52:22
буква вернет фолз то это значение станет
00:52:25
фолз и неважно уже что будет дальше но
00:52:28
для нас это будет означать что еще не
00:52:30
все буквы закончили свою анимацию тогда
00:52:33
я могу использовать простое условие что
00:52:34
ей если все буквы
00:52:38
закончили свою анимацию вот тогда только
00:52:41
мы не перейдем вот в это состояние а
00:52:43
здесь тогда мне нужно наверное отметить
00:52:47
что нам пора переходить в это состояние
00:52:49
и я могу здесь допустим в болевую
00:52:52
переменную
00:52:54
записать труп что означает можем
00:52:58
заканчивать но тогда здесь
00:53:02
запишем фолз в обозначают что еще рано и
00:53:06
тогда есть ли я могу заканчивать и все
00:53:10
буквы у нас закончились вот только тогда
00:53:12
весь этот тайтл вся эта надпись перейдет
00:53:15
состоянии закончилась
00:53:17
остается добавить эту булеву переменную
00:53:20
сюда
00:53:22
это что мы так далеко мотаем чтобы
00:53:24
поставить эту переменную
00:53:27
намекает на то что наверно вот это все
00:53:30
неплохо бы вынести в отдельный метод
00:53:32
потому что получается и так много логики
00:53:35
в одном методе акт но это можно сделать
00:53:39
чуть позже а сейчас я бы еще добавил
00:53:44
реализацию метода из финиш для нашей
00:53:47
финальной буква но в принципе это можно
00:53:50
сделать сейчас я хотел бы глянуть да вот
00:53:54
у нас косо x положен метод который
00:53:57
анимирует все эти шарики взрывов точно
00:54:00
таким же образом подсчитывает а не
00:54:03
закончилась ли анимация у всех шариков и
00:54:05
если закончилась возвращает булевы
00:54:08
результат но здесь мы его игнорируем и
00:54:12
таким образом мы даже не узнаю что
00:54:14
анимация закончилась а если мы сохраним
00:54:16
это в какую-то переменную член данных
00:54:21
например финиш то тогда я могу здесь
00:54:25
просто вернуть этот результат тогда мне
00:54:30
остается добавить эту переменную сюда
00:54:34
ранец или зеравак ее
00:54:36
в конструкторе и
00:54:40
у нас появился механизм который
00:54:42
определяет окончании взрыва то есть
00:54:46
анимации всей нашей буква и вот это уже
00:54:50
наверно можно скомпилить и посмотреть
00:54:57
компилируется без ошибок ну давайте
00:55:00
посмотрим
00:55:12
[музыка]
00:55:13
ну
00:55:15
что-то происходит это конечно хорошо ну
00:55:19
правда ничего не видно и это конечно
00:55:21
плохо
00:55:24
но есть ли у нас анимация отрабатывать
00:55:28
то есть запускается дестрой что-то там
00:55:30
происходит
00:55:32
возможно у нас самом методе анимации
00:55:36
взрывающиеся буквы не хватает заказа
00:55:39
перерисовки той области в которой это
00:55:41
все происходит что если вот это
00:55:47
скопить пущу сюда
00:55:49
просто чтобы посмотреть
00:55:53
заработает ли у нас анимация если я
00:55:56
здесь буду заказывать перерисовку точно
00:55:59
такого же прямоугольник
00:56:13
а
00:56:14
вот и взрывы
00:56:16
но что-то как-то не анимируются слишком
00:56:20
медленно
00:56:24
кажется я понял почему у нас анимация
00:56:27
получается идет два раза в секунду что
00:56:30
как раз и характерно
00:56:33
срабатыванию этого условия каждые 10
00:56:36
кадров то есть два раза в секунду но да
00:56:39
получается у нас перебор всех букв и
00:56:43
вызов анимации происходит только при
00:56:46
запуске очередной буква а это должно у
00:56:48
нас происходить всё время поэтому я вот
00:56:51
так стелла это условие у нас будет 1 в
00:56:55
такое количество тиков запускать
00:56:58
уничтожения очередных буква а вот это
00:57:01
все будет срабатывать на каждый кадр для
00:57:04
того чтобы у нас работала анимация но
00:57:08
проблема на самом деле была вот здесь мы
00:57:12
когда анимировали очередную кадр со
00:57:15
взрывами нам нужно было заказать
00:57:17
перерисовку области но то что я
00:57:19
скопипастил этот код отсюда конечно же
00:57:23
неправильно и это намекает на то что
00:57:25
нужно этот прямоугольник вынести в члены
00:57:28
данных здесь проинициализировать а там
00:57:31
использовать то есть вместо того чтоб
00:57:34
объявлять эту переменную
00:57:35
я здесь добавлю
00:57:39
член данных которая будет называться у
00:57:42
нас
00:57:45
correct он будет описывать вот это вот
00:57:49
прямоугольную область которую мы здесь и
00:57:53
проинициализируем при начале уничтожения
00:57:56
для нее запустим взрывы закажем ей
00:57:59
перерисовку и вот это
00:58:05
сделаем еще и на каждый кадр анимация
00:58:09
ну вот теперь по идее можно посмотреть
00:58:12
будут ли у нас взорваться
00:58:14
буква постоянно причем мне кажется вот
00:58:18
это не совсем хорошо интересно что нам
00:58:21
компилятор каже
00:58:26
ничего не скажет но получается мне от
00:58:29
эта переменная n финиш может не получить
00:58:32
значение не здесь и не здесь если не
00:58:36
сработало это условия а мы уже здесь а
00:58:38
да кстати студия говорит что мы
00:58:40
используем не проникали zero wanna
00:58:42
перемен а вот эту ниц и а лиза цию я
00:58:46
сделаю перед тем как выполнить такое
00:58:49
условие то дайте скобки не нужны и тогда
00:58:53
у нас коэн финиш постоянно будет иметь
00:58:55
определенное значение либо фолз либо в
00:58:59
конце концов труб студия все еще эту
00:59:03
претензию не сняла но
00:59:05
эта ошибка анализатора кода и оно прошло
00:59:10
давайте посмотрим как будет вести себя
00:59:13
анимация взрывающегося букв в этот раз
00:59:25
ну другое дело пошло анимация правда
00:59:29
конечно нам не хватает размера я думаю
00:59:32
нужно например в два раза больше сделать
00:59:35
но буквы взрываются кстати я бы поставил
00:59:39
здесь контрольную точку чтобы посмотреть
00:59:41
в этом нашем методе акт нашего game тайд
00:59:46
го да идем мы в конце концов в состоянии
00:59:48
финиш или нет и давайте размеры этих
00:59:53
шариков мы сделаем арно не знаю два раза
00:59:57
наверное будет сильно много эти в
00:59:59
полтора раза больше по 24
01:00:18
ну в принципе хорошо за исключением того
01:00:21
что остался хвостик от буквы c и
01:00:24
мы забыли про первую букву ну это уже
01:00:28
наверно мелочи и отладчик встал
01:00:32
контрольной точки на этой строке и это
01:00:34
значит что мы перейдем состояния
01:00:36
окончена то есть анимация закончилась мы
01:00:39
можем заканчивать кий это замечательно
01:00:42
но
01:00:43
прежде чем исправить эти взрывы я хотел
01:00:47
бы вынести вот этот код
01:00:50
секции game over дестрой из метода эко в
01:00:55
отдельный метод потому что ну слишком
01:00:57
тут много всего и сделать назад так
01:00:59
чтобы уничтожение букв начиналось с 0
01:01:02
индекса они из 1 а с первого у нас
01:01:05
начинается потому что мы здесь
01:01:07
стартовый тег сохраняем и
01:01:10
прерывая эту секцию кейс и в следующий
01:01:14
раз когда вызывается метод акт и мы
01:01:16
заходим сюда в гейм в аде строит у нас
01:01:19
уже car and timer текста нет на единицу
01:01:21
больше и здесь наш текущий тег станет на
01:01:25
единицу больше стартового следовательно
01:01:27
это уже не разделится на цело то есть
01:01:31
остаток отделение не будет равен или
01:01:33
поэтому мы как бы пропускаем первую
01:01:35
итерацию что тоже не совсем правильно ну
01:01:38
лучше сначала вынести этого дина метод а
01:01:40
потом уже решить эту проблему и метод
01:01:43
который уничтожает все наши буквы я бы
01:01:46
назвал быстро льдед с
01:01:56
я добавлю этот метод в приватной секцию
01:02:00
перенесу сюда код а потом перенесу и сам
01:02:03
метод чуть ниже мы вот это заберем а
01:02:12
в этой секции оставим просто вызов
01:02:15
метода
01:02:17
тогда вот эти переменные которые
01:02:19
определял сверху
01:02:21
нам понадобится уже здесь
01:02:26
причем я сразу могу задать им правильные
01:02:29
значения
01:02:37
и
01:02:41
нам здесь нужен текущей тег который я
01:02:45
могу передать как
01:02:47
аргумент
01:03:00
компилируем
01:03:05
ошибок нет и для того чтобы у нас этот
01:03:09
текущий тег начинался с нуля я могу
01:03:12
вообще сделать проще не делать здесь
01:03:15
break когда мы из этой секции будем
01:03:18
переходить на эту и тогда стартовый тег
01:03:21
останется таким же но правда к винтик но
01:03:25
все равно будет довольно большим да и
01:03:27
честного renner на плане самая лучшая
01:03:29
идея в том что если внезапно мы добавим
01:03:31
какое-то новое состояние между этими
01:03:33
двумя и пишем сюда код то у нас могут
01:03:36
возникнуть сложно выявляемые ошибки
01:03:39
поэтому я лучше сделаю по-другому я вот
01:03:42
этот дестрой индекс буду учитывать никак
01:03:46
локальную переменную в этом методе а это
01:03:49
у нас будет член данных
01:03:52
в приватной секции
01:03:58
которое будет описывать индекс очередную
01:04:01
буква из коллекции этих букв и я по
01:04:03
старту этот индекс сделаю равным минус 1
01:04:09
мы в конструкторы можем обнулить чтобы
01:04:13
студиях нам не цеплялось с горлинками а
01:04:15
вот собственно в методе который включает
01:04:19
анимацию я пропишу туда
01:04:24
отдельное значение -1 тогда наличие
01:04:28
этого минус 1 будет означать что у нас
01:04:31
еще не выводились буква
01:04:37
и тогда здесь я могу проверить
01:04:40
дополнительную что ей из предот индекс
01:04:42
равен минус 1 key или остаток деления
01:04:46
тика на эндера равен нулю тогда это
01:04:50
значит что нужно выбрать очередную букву
01:04:52
и тогда мы зайдем в этот метод скаррон
01:04:55
тиком равным единице и в этого слоя мы
01:04:58
попадем только потому что ты строй
01:05:01
индекс равен 1 тогда здесь нужно
01:05:03
вставить условие или и здесь мы уже не
01:05:07
будем вычислять этот дестрой индекс да
01:05:09
просто его увеличу сразу на единицу и он
01:05:13
у меня с первого же раза будет равен
01:05:14
нулю то есть нормальному значению для
01:05:17
индекса и вот если этот достройки индекс
01:05:20
у нас больше либо равен нулю меньше чем
01:05:25
количество букв тогда мы обратимся по
01:05:27
этому индексу к вектору и закажем
01:05:30
уничтожение буква а иначе будем считает
01:05:33
что все мы прошли все буквы таким
01:05:35
образом мы взорвем в том числе и первую
01:05:38
букву округ а и я предположу что это
01:05:42
будет правильное решение потому что
01:05:43
ждать пока швабра очистит экран и
01:05:45
надпись медленно использует вниз это
01:05:47
долго я уже потом все вместе посмотрю я
01:05:49
бы вот здесь тогда в нашем классе
01:05:52
описывающим букву сделал бы что-нибудь
01:05:54
такое чтобы у нас вот этот кончик буква
01:05:58
ц тоже стирался а он у нас остается
01:06:02
потому что у нас высота всех букв
01:06:04
одинаковая и ширина кстати тоже и
01:06:07
очевидно что это не работает для
01:06:09
особенных букв которые выглядят не так
01:06:12
как остальные вот цель или бы core еще
01:06:15
лет английская к большая или может еще
01:06:19
какие-то буквы но это значит что в общем
01:06:21
случае наш подход одинаковым размером по
01:06:23
высоте и ширине не совсем подходит
01:06:25
потому что символы могут оказаться
01:06:27
какими-то нестандартны а это значит что
01:06:31
вот эти вот ширина и высота должны быть
01:06:36
разными для разных букв и наверное самым
01:06:39
правильным вариантом был бы вычислить
01:06:41
размер этой буквы например когда мы ее
01:06:44
рисуем
01:06:46
при первом рисование и сохранить это как
01:06:49
длину и ширину той области в которой
01:06:52
будет находиться буква а потом уже
01:06:54
использовать это при определении этого
01:06:57
прямоугольника в котором будет
01:06:59
происходить взрывы и для того чтобы
01:07:01
вычислить размер текстовой строки
01:07:04
состоящие из одного символа у нас уже
01:07:07
есть тут решение которое мы применили в
01:07:09
нашей информационной панели и
01:07:11
кстати моё потом перенесли в нашу метку
01:07:14
вот он
01:07:16
здесь при выводе метки содержащие в себе
01:07:20
текстовую строку вот эту мы вызываем
01:07:24
виндовый функцию get экстракт and point
01:07:27
32 которая вычисляет нам размер
01:07:30
прямоугольной области
01:07:32
необходимое для того чтобы вывести это
01:07:34
на экран и вот этот размен сохраняется
01:07:36
сюда в эту структуру says в общем я могу
01:07:40
взять вот эту строку и
01:07:46
вот эту
01:07:48
это нам уже не нужно и
01:07:53
посчитать здесь в размер нашей текстовой
01:07:56
строки
01:07:57
для этой функции мне нужно передать
01:08:00
указателем на строку а указателем на
01:08:02
строку у нас является адрес этой буквы
01:08:06
которую мы выводим потому что по сути
01:08:08
это есть указатель на строку а так как
01:08:11
мы используем необычные строки которые
01:08:14
должны заканчиваться нулем а просто
01:08:17
последовательности символов и должны
01:08:19
указать количество символов то есть один
01:08:22
то мы можем пользоваться этой буква и не
01:08:24
заводить отдельную строку для того чтобы
01:08:27
посчитать ее размер или вывести но это
01:08:29
логично то да это переименовать
01:08:31
какую-нибудь для top site и
01:08:35
вот у нас есть способ вычислить размер
01:08:39
буква и тогда если мы вычислим тогда я
01:08:43
возьму член данных cx и сохраняю как
01:08:48
ширину
01:08:54
отцы y
01:08:56
как высоту и тогда здесь я не буду
01:08:59
умножать ширину и высоту на глобальный
01:09:02
масштаб потому что у нас и так это будет
01:09:05
всё посчитано в реальных пикселях ну и
01:09:07
чтобы не делать это на каждый вывод
01:09:09
буквы мы поставить здесь простого слове
01:09:11
что если у нас есть размер буквы точнее
01:09:15
если у нас нет размера буквы
01:09:21
год катар says
01:09:24
the мы это все посчитаем и
01:09:28
запишем в эту булеву переменную true
01:09:33
тогда нам понадобится еще одна болевая
01:09:36
переменная штука у нас их много этих
01:09:38
булевых переменных
01:09:40
возможно это все можно описать одним
01:09:43
состоянием но пока непонятно каким
01:09:45
поэтому пусть пока побудет и надо не
01:09:48
забыть эту булеву переменную обнулить в
01:09:51
конструкторе
01:09:52
для того чтобы мы при первом выводе
01:09:55
посчитали размер этой буквы давайте
01:09:58
посмотрим что получится
01:10:01
компилируем
01:10:05
запускаем
01:10:17
но в принципе ничего но остаются
01:10:21
какие-то кусочки
01:10:22
ну
01:10:24
наверно это лучше
01:10:28
но как бы лучше у
01:10:34
нас теперь вычисляется индивидуальные
01:10:37
размеры этих областей но вот эти кусочки
01:10:40
и
01:10:41
кстати лучшего 100 вливает это
01:10:43
изображение в другой paint
01:10:46
сынок
01:10:48
маску такие кусочки и вот такой конец
01:10:52
игры и
01:10:54
судя по всему вот эти остатки
01:10:56
соответствует вот этим вот
01:10:59
наклоненным элементом потому что нас
01:11:02
курсив тут используется вот все что
01:11:05
наклонилась она все вылезло а
01:11:08
это кстати наверное но в общем это
01:11:12
неожиданно и я думал что
01:11:15
эта функция нам посчитает размер
01:11:18
наклоненные буквы правильно ну да ладно
01:11:21
я же могу просто вывести эту букву перед
01:11:24
взрывом использовав фоновый цвет и она
01:11:27
перизат трет это то что там была и не
01:11:30
важно что там у нас остается поэтому вот
01:11:32
здесь в этой секции когда мы взрываем
01:11:36
буквы
01:11:37
если у нас это первое рисование взрывов
01:11:41
то сначала нужно букву удалить то есть
01:11:45
если есть буква
01:11:49
то мы ее выведем фоновым цветом
01:11:52
я пока для простоты скопье плачу этот
01:11:55
код
01:11:57
оставлю здесь bbq лор
01:12:02
это болевую переменную мы здесь
01:12:06
обнулим на тогда нужно во-первых
01:12:10
добавить сюда а
01:12:13
в конструкторе записать в нее значение
01:12:17
[музыка]
01:12:21
давайте посмотрим что у нас получится
01:12:27
компилится без ошибок
01:12:42
но кажется это не помогло все равно у
01:12:45
нас остаются остатки и
01:12:47
это честно говоря странно
01:12:50
давайте посмотрим что будет если мы не
01:12:54
будем рисовать эти взрывы а сама это
01:12:57
стирание я вообще веду красным цветом
01:13:00
чтобы посмотреть она вообще хоть
01:13:02
рисуются или нет и для простоты я
01:13:07
оставлю всего одну букву k и посмотрим
01:13:12
что у нас получится
01:13:16
вот здесь при отрисовке этой буквы
01:13:22
я поставлю здесь контрольную точку и
01:13:25
посмотрим что там у нас получается
01:13:32
я постараюсь снять скриншот до того как
01:13:36
буква начнет взорваться у меня есть
01:13:39
целых четыре секунды на это а потом
01:13:42
посмотрим что у нас там останется
01:13:54
я сохраню сюда
01:13:56
букву к
01:14:00
она у нас сейчас на экране вот мы зашли
01:14:03
в рисовании буква h цру и мы вроде бы
01:14:10
отрисовываем это все я сниму контрольную
01:14:14
точку и я поставлю здесь контрольную
01:14:16
точку чтобы посмотреть что у нас будет
01:14:19
на следующем кадре и
01:14:22
вот что у нас на следующем кадре
01:14:26
да не успел но что я увидел на следующем
01:14:31
кадре это то что вся буква вывелось
01:14:34
красным кроме вот этого хвостика и это
01:14:37
странно я
01:14:40
поставлю еще одну контрольную точку
01:14:42
чтобы посмотреть какого размера область
01:14:45
для нас вычисляется и посмотрим как эта
01:14:49
область у нас коррелирует с
01:14:53
изображением на экране
01:15:03
мы вычисляем размер и т буква он у нас
01:15:07
равен 38 но 84
01:15:13
оппозиция по иксу у нас если умножить
01:15:18
93
01:15:19
никогда это буква у нас спуститься вниз
01:15:22
у нее вот это как я это изображение
01:15:27
немножко подрежу так чтоб 0 начинался в
01:15:30
нули и
01:15:35
вот
01:15:39
93 это вот
01:15:43
а сама буква начинается на несколько
01:15:46
пикселей дальше
01:15:51
если я возьму ширину в 38 а высота 84
01:15:57
кстати y у нас чему равен а
01:16:01
тут 0 а он у нас доедет до 135
01:16:06
умноженное на 3
01:16:10
405 то есть на нашем
01:16:12
скриншоте 405
01:16:16
это вот этот пиксель ну в принципе
01:16:19
нормально ячейки символов они получаются
01:16:22
такие прямоугольные и сверху снизу у них
01:16:25
довольно много места как разлитого чтобы
01:16:28
можно было разместить всякие хвостики от
01:16:30
букв например фигурные скобки они будут
01:16:32
больше чем эти буквы но и это как бы с
01:16:35
запасом но конечно высоковат ну давай и
01:16:40
у нас получается
01:16:43
область 38 на 84
01:16:51
я возьму
01:16:53
тонкую линию красного цвета
01:16:57
38 на 84 вот такой прямоугольник
01:17:04
описывает эту папку и вот этот хвостик
01:17:07
который вылазит он как раз и здорово
01:17:10
похож на вот этот хвостик
01:17:14
тут он имеет ширину 5 пикселей
01:17:19
кто то у нас получается
01:17:27
5 пикселей вот собственно по этой
01:17:30
причине и остаются хвостике у наших букв
01:17:33
причем размер ячейки по ширине судя по
01:17:36
всему был подсчитан правильно я зря
01:17:39
грешил на вот эту функцию а наша
01:17:42
проблема в том что позиция вывода этот
01:17:45
expose который мы перейдем в текст а вот
01:17:48
почему то не совпадает с началом буквы
01:17:51
но это в принципе нормально это
01:17:53
известная проблема дело в том что в
01:17:55
некоторые шрифтах это бы совпало но для
01:17:58
кириллических шрифтов я эту проблему
01:18:01
встречал и не уверен если это в не
01:18:04
кириллический шрифт а проблема в том что
01:18:06
символы внутри своей ячейке получаются
01:18:08
смещены принципе нормально может буква к
01:18:11
для этого шрифта на самом деле это
01:18:13
векторное изображение и вот эти шрифты
01:18:16
которые мы используем они называются
01:18:18
true type и символа в этих шрифтах
01:18:20
строятся по некоторым точкам соединяем
01:18:24
между собой кривыми безье
01:18:26
с различными параметрами скрепления
01:18:29
поэтому вот это красивое изображение на
01:18:32
самом деле это просто множество точек
01:18:34
соединенных между собой линиями и это
01:18:36
множество она в принципе может быть
01:18:38
смещенным относительно своей ячейки на
01:18:41
какое-то расстояние
01:18:42
если бы мы выводили несколько символов и
01:18:45
считали бы вот этой функции размер
01:18:48
строки то он был был бы посчитан
01:18:51
точно но возможно последний бой символ
01:18:54
не поместился в эту область в общем в
01:18:57
принципе мы могли бы решить эту задачу
01:18:59
но этому а придется долго гуглить по
01:19:02
храмам чтобы понять где же там хранится
01:19:05
вот это смещение буквы как его учитывать
01:19:08
и
01:19:09
это несколько выходит за рамки нашей
01:19:11
задачи если бы делали какой-нибудь
01:19:13
редактор текста или графический редактор
01:19:16
там где позиционирования очень важно ну
01:19:18
тогда я бы занялся этой задачи а для
01:19:20
нашей игры в принципе это не актуально
01:19:22
поэтому я поступлю проще вот это вот эти
01:19:27
пять шесть пикселей
01:19:29
для расстояния в 38 это примерно одна
01:19:33
десятая от того размера по ширине
01:19:36
который в нас тут есть поэтому я просто
01:19:38
расширяю этот прямоугольник на две
01:19:41
десятых чтобы он гарантированно
01:19:44
перекрывал вот этот хвостик но сделаю
01:19:46
это только для ширины а высота оставим
01:19:49
такой какая есть
01:19:51
поэтому я вот здесь
01:19:54
вычисляя ширину буквы прибавлю к этому
01:19:57
значению еще 20 процентов от этого или
01:20:01
одну пятую
01:20:03
я думаю это стоит подписать комментарии
01:20:06
что это у нас 120 процентов
01:20:10
ширины
01:20:11
не то чтобы это сильно поможет понять
01:20:15
проблему которая здесь происходит ну это
01:20:17
будет хоть что-то
01:20:18
[музыка]
01:20:21
я сниму контрольной точки включу взрывы
01:20:25
и
01:20:27
раз комментирую вот эти оставшиеся буквы
01:20:30
чтобы посмотреть что же у нас получается
01:20:33
компилируем и
01:20:35
смотрим
01:20:52
по-моему это прекрасно хотя там остался
01:20:55
какой-то пиксель от одной буквы но
01:20:57
по-моему это было замечательно ясно что
01:20:59
я бы вот
01:21:00
здесь
01:21:02
все-таки не красным цветом очищу а
01:21:06
фоновым чтобы эти буквы как бы исчезали
01:21:09
перед взрывом и в принципе это уже можно
01:21:12
считать решением нашей задачи но честно
01:21:15
говоря мне вот не все нравится в нашей
01:21:18
файнал это а именно то что у нас тут
01:21:21
целых четыре булевых переменных которые
01:21:24
не явно между собой распределили
01:21:26
различные состояния нашей буква на самом
01:21:29
деле я думаю мы могли бы это описать все
01:21:32
перечислением и сделать через свич кейс
01:21:35
вот здесь методе друг вместо
01:21:39
использования вот этих различных условий
01:21:41
я думаю что это стоит сделать потому что
01:21:43
сами вот эти вот условия выглядят в
01:21:48
принципе просто но switch кейс будет
01:21:50
выглядеть проще и таким образом будет
01:21:52
выглядеть более юзер френдли особенно
01:21:54
для начинающих программистов но такой
01:21:57
код будет выглядеть более читабельным
01:21:59
что конечно же важно для нашей программы
01:22:01
если посмотреть на то что мы делаем для
01:22:04
падающие буквы то у нас есть состояние в
01:22:08
котором мы ничего не делаем а после того
01:22:10
как эта надпись появиться там и и
01:22:13
показываем и для этого у нас здесь
01:22:16
отрабатывает вот такой код потом мы
01:22:19
прячем букву
01:22:21
ли это у нас от работает эта секция
01:22:24
после чего мы переходим в режим
01:22:27
взрывающихся шариков и ждем пока они не
01:22:29
закончат взрываться после чего мы
01:22:32
заканчиваем все наши действия и
01:22:33
переходим к сути в состоянии ничего не
01:22:35
делание но это уже будет на создание
01:22:38
окончании действий таким образом я могу
01:22:41
описать эти состояния
01:22:44
виде перечисления
01:22:48
и
01:23:01
первым у нас будет idol
01:23:04
ничего не делаем потом мы показываем
01:23:07
букву
01:23:09
потом мы
01:23:12
прячем букву
01:23:15
потом взрываемся и
01:23:19
переходим состоянии finish it
01:23:22
в котором мы ничего не делаем
01:23:25
я добавлю это вместо четырех этих
01:23:29
булевых переменных и
01:23:35
проинициализируем это состояние в
01:23:38
конструкторе
01:23:40
ладно я пока это закомментируем то вдруг
01:23:43
что-нибудь пригодится хотя не не
01:23:45
пригодится и
01:23:49
с самого начала у нас тут будет
01:23:53
создания хайдук не делаем ничего тогда
01:23:59
в этом методе дробь я сделаю switch кейс
01:24:05
где в зависимости
01:24:08
от состояния
01:24:11
случае если это у
01:24:14
нас там 1 шел в сектор если это
01:24:18
показывание буквы
01:24:21
то мы делаем под этот код
01:24:27
а
01:24:32
когда мы закончили показ букв
01:24:36
мы перельем состоянии хайд лета и
01:24:46
в этом состоянии мы адресуем букву
01:24:52
фоновым цветом и
01:24:56
у нас остается
01:24:59
состоянии explosion
01:25:11
в котором мы рисуем взрыва
01:25:16
тогда вот это нам не нужно а
01:25:22
в состоянии финиш
01:25:26
мы не делаем ничего
01:25:36
даже можно добавить
01:25:40
доходную секцию в котором мы бросим
01:25:43
исключение но случай если вдруг тут
01:25:47
появится какое-то новое состояние ну вот
01:25:50
теперь правда это нужно немножко
01:25:52
исправить принципе мы могли бы добавить
01:25:55
еще одно состояние первый показ буквы в
01:25:58
котором бы мы отрисовали букву и
01:26:01
посчитали ее размер ну можно сделать
01:26:04
проще и все-таки оставить булеву
01:26:06
переменную
01:26:14
которые тогда нужно проинициализировать
01:26:16
в конструкторе и
01:26:23
кстати не так кажется что нам и не нужно
01:26:28
это сост и не idol потому что у нас в
01:26:30
этом классе нет метода которые включали
01:26:33
кнопку азбука прямо с самого начала
01:26:37
должно же себя показывать поэтому этот
01:26:40
тайтл не нужен
01:26:44
начнем с этого состояния а когда у нас
01:26:47
показ закончатся нам нужно будет перейти
01:26:50
в этот hyip дать то и собственно в него
01:26:54
мы и перейдем когда вы зовут метод
01:26:56
дестрой поэтому я здесь могу
01:26:59
в мид один дестрой
01:27:02
записать в качестве состояния
01:27:08
трахает лето и тогда у нас при очередном
01:27:14
которые рисования мы зайдем в это
01:27:17
состояние и
01:27:19
сотрем буква но после этого права нужно
01:27:21
тогда перейти в состояние взрывания
01:27:24
поэтому я
01:27:26
здесь перейду в другой состоянии
01:27:34
ну вот остается поправить метод из финиш
01:27:38
который должен вернуть true если у нас
01:27:42
состоянии
01:27:44
равно финиш и
01:27:59
вот здесь мы и переди ум это состояние
01:28:03
финиш
01:28:10
когда закончатся взрывы поэтому если тут
01:28:14
вернули труп
01:28:17
то мы запишем финиш в это состояние
01:28:24
студия говорит что лектор проект не
01:28:27
проинициализирован
01:28:29
ну давайте его в проинициализируем
01:28:37
фигурными скобками потому что это
01:28:40
структурное переменная
01:28:44
ну тут все выглядит нормально
01:28:47
здесь им убрать лишние переменные и все
01:28:52
можно компилить
01:28:58
компилируется без ошибок давайте
01:29:02
посмотрим от работает ли анимация
01:29:04
правильно и
01:29:07
я даже думаю что стоит поставить
01:29:10
контрольную точку в гейм тайтл
01:29:15
вот здесь
01:29:26
вот здесь в методе дестрой лет с там где
01:29:30
мы закончим анимацию всех взрывов мы
01:29:33
должны будем перейти в состояние финиш и
01:29:36
если мы ничего не испортили при
01:29:39
рефакторинг финальные буквы то эта
01:29:41
контрольная точка должна сработать
01:30:05
ну в принципе работы контрольная точка
01:30:08
сработала то есть мы перешли в состоянии
01:30:10
финиш но это уже состояние нашего game
01:30:14
тайд го и мы можем использовать переход
01:30:17
в это состояние как окончание игры и тут
01:30:20
наверно почти все готово мест на что мне
01:30:24
немного не нравится то что мы
01:30:27
копипастом рисуем букву фоновым цветом
01:30:31
[музыка]
01:30:32
вот здесь или белым цветом используя при
01:30:37
этом один и тот же код давайте вынесем
01:30:39
это в отдельный метод
01:30:43
который я бы назвал
01:30:47
рисование буква
01:30:50
дроп-листа
01:30:52
думаю тут можно ничего не возвращать из
01:30:55
них и
01:31:01
в этом методе мы
01:31:04
сделаем вот это
01:31:13
я добавлю этот метод приватную секцию
01:31:19
поэтому этот метод должен переехать в
01:31:22
конец и
01:31:25
здесь тогда нам нужно рисовать эту букву
01:31:29
двумя различными цветами белым или
01:31:31
фоновым поэтому я могу просто передать
01:31:33
здесь переменную которое будет говорить
01:31:37
рисуем в цвете или нет
01:31:41
например вот так и
01:31:46
тогда есть ли income or
01:31:53
the рисуем белым цветом а
01:31:57
иначе фоновым
01:31:59
теперь я вызову этот метод
01:32:03
вот здесь
01:32:07
здесь мы выводим в цвете
01:32:12
поэтому это удаляем а
01:32:17
здесь мы выводим фоновый цвет поэтому
01:32:22
передаем fox
01:32:25
или это тоже удаляем
01:32:29
ну вот так по моему стало получше
01:32:34
я думаю можно даже наверно не проверять
01:32:37
и теперь ваша очередь от наследовать
01:32:41
класса финальные буква от класса и
01:32:44
эксплоужн и сделать так чтобы эти буквы
01:32:47
взорвались также как и монстры после
01:32:50
того как надпись доедет до конца

Описание:

Самые лучшие бесплатные курсы по C++, Ассемблеру и Unreal Engine 5! Часть #93. Анимация финальных титров (Базовый курс программирования на С++) Оглавление курса на Википедии: https://ru.wikiversity.org/wiki/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9_%D0%BA%D1%83%D1%80%D1%81_%D0%A1%2B%2B 00:00 - Анимация финальных титров 00:20 - Добавим состояние титров Game_Over_Show 05:47 - Добавим обработку состояния Game_Over_Destroy 10:06 - Вынесем логику взрывающихся шариков в класс AExplosion 15:23 - Переносим код начала взрывов в Start_Explosion() 20:33 - Перенесём метод Draw_Destroying() в Draw_Explosion() 22:33 - Вынесем анимацию в метод Act_On_Explosion() 27:34 - Popcorn_part_93_1.zip: пишем код 27:47 - Вынесем класс AExplosion в свою пару файлов 30:38 - Вынесем класс AsLevel_Title 31:55 - Вынесем класс ALabel 33:53 - Вынесем класс AFinal_Letter 35:17 - Вынесем класс AsGame_Title 39:07 - Popcorn_part_93_2.zip: пишем код 39:23 - Отнаследуем финальную букву от AExplosion 44:35 - Добавим анимацию и рисование взрывов 46:31 - Смотрим в отладчике, как уничтожаются буквы 49:19 - Исправим анимацию финальных титров 53:40 - Добавим код для Is_Finished() 55:00 - Баг: Шарики не рисуются 56:11 - Баг: Шарики анимируются слишком медленно 59:10 - Баг: Шарики не закрывают буквы полностью 01:00:44 - Вынесем код в метод Destroy_Letters() 01:05:40 - Вычислим размеры буквы 01:10:05 - Баг: остаются кусочки букв 01:21:10 - Добавим состояния финальной буквы 01:23:57 - Исправим отрисовку буквы по состояниям 01:30:20 - Вынесем код в Draw_Letter() 01:32:38 - Popcorn_part_93_3.zip: пишем код Popcorn_part_93_1.zip - https://drive.google.com/file/d/1e5kY6JwZj3GCSkVjvqirEp44UgvnB1bv/edit Popcorn_part_93_2.zip - https://drive.google.com/file/d/1qdftfOYH46dGaK9sb2I5C259SGsiv5Xx/edit Popcorn_part_93_3.zip - https://drive.google.com/file/d/1geRzs_gZUhNqfvnmN5Cz6uNWUqs6Mb0b/edit

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Базовый курс С++ Часть #93. Анимация финальных титров"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Базовый курс С++ Часть #93. Анимация финальных титров" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Базовый курс С++ Часть #93. Анимация финальных титров"?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "Базовый курс С++ Часть #93. Анимация финальных титров" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Базовый курс С++ Часть #93. Анимация финальных титров"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Базовый курс С++ Часть #93. Анимация финальных титров"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.