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

Скачать "Базовый курс С++ Часть #15. Рефакторинг сложного класса"

input logo icon
"videoThumbnail Базовый курс С++ Часть #15. Рефакторинг сложного класса
Оглавление
|

Оглавление

0:00
Рефакторинг сложного класса
1:42
Форматирование ссылок и указателей
3:58
Настройка выравнивания кода в Visual Studio
6:13
Выносим сущность шарика в класс ABall
10:50
Исправляем ошибки, разделяя сущности движка и шарика
29:15
Указатель на себя this
33:44
Переносим часть членов класса ABall в приватную секцию
35:53
Popcorn_11.zip: пишем код
36:22
Выносим сущность уровня в класс ALevel
55:07
Рефакторим метод Init_Engine()
1:02:11
Статический метод
1:05:21
Popcorn_12.zip: пишем код
1:05:39
Создаём функцию инициализации ABall::Init()
1:07:57
Выносим сущность платформы в класс AsPlatform
1:29:33
Рефакторим имена членов данных платформы
1:32:38
Popcorn_13.zip: пишем код
1:32:50
Выносим сущность рамки в класс AsBorder
1:40:26
Рефакторим имена методов
1:43:00
Подводим итог рефакторинга класса движка
1:43:46
Popcorn_14.zip: пишем код
Теги видео
|

Теги видео

С++
C++
Программирование
Курсы С++
Изучаем С++
Программирование в Windows
Popcorn
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:00
[музыка]
00:00:16
мы продолжаем начинать писать нашу
00:00:19
программу сейчас мы находимся в процессе
00:00:23
преобразования прототипа нашей игры
00:00:25
написанного на языке си в собственно
00:00:28
саму программу написанную на языке си
00:00:30
плюс плюс
00:00:31
в прошлый раз мы преобразовали код
00:00:34
модуля engine в класс под названием с
00:00:37
engine у нас получился довольно большой
00:00:40
класс котором содержится множество
00:00:44
функций
00:00:45
переменных и констант этот класс сам по
00:00:48
себе довольно объемные такое обилие кода
00:00:51
в одном классе это в принципе вполне
00:00:53
нормальное явление ничего страшного в
00:00:56
этом нет но в таком классе есть другая
00:00:58
проблема на самом деле здесь кроме
00:01:00
сущности
00:01:01
движка описано еще несколько других
00:01:03
сущностей функционал которых
00:01:06
разбросом среди функций нашего движка я
00:01:09
нажму f5 чтобы запустить нашу игру
00:01:10
обратите внимание у нас есть шарик
00:01:13
платформа рамка уровня кирпичей уровня
00:01:17
как минимум эти четыре сущности не явно
00:01:19
присутствуют среди кода нашего движка
00:01:22
такой перегруженный логикой класс
00:01:24
является сигналом для того что
00:01:26
программист должен
00:01:27
а3 factory этот класс и вынести скрытой
00:01:30
сущности в отдельные классы другими
00:01:33
словами нам нужно разбить наш класс с
00:01:36
engine на несколько классов каждый из
00:01:39
которых будет описывать свою собственную
00:01:40
сущность
00:01:41
но прежде чем мы это сделаем я хочу
00:01:44
немножко настроить нашу visual studio я
00:01:47
заметил что в прошлый раз когда я
00:01:49
переносил функции заголовочный файл
00:01:51
visual studio сама за меня выполнила
00:01:54
некоторое форматирование и
00:01:56
изменила код таким образом который на
00:01:58
мой взгляд является не самым лучшим я
00:02:00
продемонстрирую это на примере давайте
00:02:02
возьмем какую-нибудь функцию которой
00:02:03
есть параметры ну например вот эту дробь
00:02:06
free я скопирую ее отсюда
00:02:10
и вставлю здесь после последней функции
00:02:14
чтобы показать как visual studio
00:02:16
автоматически форматирует код я
00:02:18
вставляют в пустых строчки вставляю эту
00:02:20
строку обратите внимание здесь в
00:02:23
объявлении параметра paint перри у нас
00:02:26
идет имя типа
00:02:27
rect потом пробел потом амперсанд потом
00:02:31
имя переменной если я поставлю точку
00:02:33
запятой the visual studio исправляет этот кот
00:02:36
так как на ее взгляд кажется правильно
00:02:38
хотя на самом деле все эти правила
00:02:41
прописаны в самой вижу в студию и мы
00:02:43
можем их поменять на самом деле я считаю
00:02:45
что лучше когда наш код остается ход в
00:02:49
таком виде я поясню это на другом
00:02:51
примере представьте что у нас есть
00:02:53
переменная которая называется а
00:02:55
а также я могу объявить еще одну
00:02:58
переменную которая называется б и
00:03:00
является ссылкой на значение типа int
00:03:03
так вот с точки зрения си плюс плюс мы
00:03:05
можем написать так а можем написать
00:03:08
например вот так оба написания вполне
00:03:11
допустимы и во втором случае амперсанд
00:03:15
который пишется вместе с именем типа
00:03:17
говорит нам о том что эта ссылка на
00:03:19
целый тип но в первом случае бирсан
00:03:22
перед именем переменной тоже говорит что
00:03:23
это ссылка однако я могу объявить
00:03:26
переменная в строку например я могу
00:03:29
написать int а после этого объявить переменную b
00:03:33
который является ссылкой на целый тип
00:03:35
после этого я могу написать например
00:03:37
указатель на переменную целого типа под
00:03:40
названием c и в таком случае у нас
00:03:43
амперсанд и звездочка является уже
00:03:46
частью имени они типа поэтому я
00:03:49
предлагаю в нашем проекте и следовать
00:03:51
простому правилу ampersand и и звездочки
00:03:53
ставить в плотную к имени переменной а
00:03:56
ник имени типа ну и чтобы visual studio
00:03:59
за нас сама не форматировал а кот и не
00:04:01
делаю это так как на мой взгляд не очень
00:04:03
хорошо нам нужно настроить ее опции
00:04:06
форматирования и о другой
00:04:07
строку кода и вот эту покажу игру и
00:04:11
здесь мы заходим в меню tools дальше в
00:04:15
пункт об шанс и здесь у нас есть пункт
00:04:18
меню текстах editor в котором
00:04:21
перечислены правила по работе с кодом
00:04:24
для каждого языка вот наш си плюс плюс и
00:04:27
здесь у нас если я нажму сюда или сюда я
00:04:30
увижу одно и то же окошко котором перечислены
00:04:33
главная опция но те пункты которые нужны
00:04:36
мне находятся в подпункте formatting
00:04:39
потому что они связаны с форматированием
00:04:41
здесь я сниму галочку с этого пункта
00:04:44
которая означает нужно автоматически
00:04:46
отформатировать текст когда оставляют
00:04:48
точку с запятой так же снимаю галочку с
00:04:50
этого пункта который означает
00:04:52
автоматическое форматирование при
00:04:54
вставке закрывающей скобки и вот эту
00:04:57
галочку которая также форматирует код
00:05:00
когда я редактирую
00:05:01
эти фигурные скобочки удаляя их добавляю
00:05:04
или как-либо смещаю
00:05:05
я нажимаю ok и теперь если я вернусь
00:05:09
обратно в исходный файл возьму вот эту
00:05:11
строчку вставлю сюда
00:05:15
когда я нажму точку с запятой visual
00:05:18
studio не станет форматировать этот код
00:05:20
точно также она не станет его
00:05:21
форматирует если я здесь открою фигурную
00:05:24
скобку при этом вторую закрывающую
00:05:26
фигурную скобку
00:05:27
visual studio ставить сама если я буду
00:05:30
редактировать этот текст например
00:05:32
оставляя пустую строку то написание
00:05:34
наших параметров также не меняется я
00:05:38
уберу этот лишний год я исправлю
00:05:40
написание параметров чтобы не
00:05:41
возвращаться к этому вопросу потом
00:06:06
вот теперь выглядит правильно разумеется
00:06:09
это мое субъективное мнение и так
00:06:13
давайте попробуем вынести из нашего
00:06:15
класса одну из неявно присутствующих и
00:06:18
сущностей я предлагаю начать самого
00:06:21
маленького элемента с шарик для описания
00:06:24
шарика у нас здесь есть несколько
00:06:26
переменных
00:06:27
частности вот эти задающие позицию
00:06:29
шарика его скорости направления возможно
00:06:32
здесь есть и другие какие-то перемены
00:06:34
которые на первый взгляд сложно
00:06:35
определить но все они станут вам
00:06:38
известны в процессе переноса также здесь
00:06:40
есть пара функции 1 для рисования шарика
00:06:42
друг боб 2 для его перемещение в пол и
00:06:46
эти функции вместе с этими переменными
00:06:48
можно вынести в отдельный класс для
00:06:50
этого я здесь в коде перед описанием
00:06:52
класса из engine добавлю еще одну секцию
00:06:57
с комментарием и напишу класса и назову
00:07:01
его болт ну и следуя своей системе
00:07:04
обозначений я добавлю ему префикс
00:07:06
большую букву ы л и мог бы добавить сюда
00:07:10
еще и префикс с который означает что он
00:07:12
должен быть в единственном экземпляре
00:07:14
но а шарик может быть во множестве
00:07:17
экземпляров есть игровая ситуация в которой шарик
00:07:20
может расстроиться превратившись в 3
00:07:22
шарик таким образом нашей программе
00:07:24
подразумевается множество объектов
00:07:26
такого класса поэтому пересек свое
00:07:28
просто а я ставлю пара фигурных скобок и
00:07:33
вот у нас появился наш новый класс это
00:07:35
так называемый пустой класс все что у
00:07:38
нее есть только имя и это вполне
00:07:39
допустимая сущность в нашей программы но
00:07:42
я перенесу сюда функция из нашего душка
00:07:45
я сразу сделаю здесь открытую секцию
00:07:48
напишу свой паблик и прямо в ней нас
00:07:51
будут размещены все функции и данные а
00:07:53
позже мы перенесем в приватную секцию те
00:07:55
методы и данные которые не должны быть
00:07:58
доступна снаружи я беру функцию друг боб
00:08:06
и переношу сюда а также сбу
00:08:09
а также вот эти переменные
00:08:18
а теперь я беру имя этого класса и
00:08:20
объявляю объект типа шарик в нашем
00:08:24
движке я его поставлю например вот здесь я пишу
00:08:29
имя класса
00:08:30
имя объекта и вот теперь вся
00:08:33
функциональность шарика должна будет
00:08:35
находиться внутри класса и болт и быть
00:08:38
доступна через экземпляр этого класса
00:08:41
объект по имени боб
00:08:43
ну разумеется этого недостаточно и
00:08:45
теперь мне нужно перенести пару этих
00:08:47
методов из класса из engine в класс болт
00:08:51
для этого я кликаю правой клавишей мышки
00:08:54
и выбираю пункт туди финише но или
00:08:58
просто нажимаем в 12 и перехожу к коду
00:09:00
этой функции для того чтобы эта функция
00:09:03
перешла из одного класса в другой мне
00:09:04
здесь вместо имени
00:09:06
с engine нужно написать имя этого
00:09:08
другого класса то есть ball вот теперь
00:09:13
метод друг пол стал методом другого
00:09:15
класса тоже самое я делаю и со вторым
00:09:18
методом нажимаем f12 и пишу здесь имя
00:09:22
нового коз но так эти методы окажутся
00:09:25
разбросанные среди методов класса с
00:09:28
engine и честно говоря это плохое
00:09:30
оформление кода у нас заголовочные файлы
00:09:32
класс и бог находится над боссом из
00:09:36
engine поэтому будет вполне логично если
00:09:39
кот самих методов также будет
00:09:41
расплываться выше методов класса из
00:09:43
кenji
00:09:44
поэтому я нажимаю f12 и вырезаю весь
00:09:49
этот метод отсюда и вставляю его
00:09:54
перед первым методом класса снг
00:09:57
вот здесь когда я размещаю в одном
00:10:00
исходном файле несколько классов
00:10:02
я разделяю их между собой четырьмя
00:10:05
последовательными правильными строками
00:10:10
кто позволяет не при прокрутке легко
00:10:13
находить место где заканчивается 1 класс
00:10:15
и начинается другой теперь сюда перенесу
00:10:17
и второй метод я перехожу
00:10:19
заголовочный файл нажимаем f12 и
00:10:22
вырезать отсюда метод move пол и
00:10:29
вставляю его в начале файла вот так если
00:10:35
я сейчас нажму компиляцию у нас будет
00:10:37
море ошибок потому что такое изменение в
00:10:39
коде довольно сильно нарушает его
00:10:41
структуру и нам придется нести довольно
00:10:44
много изменений чтобы код снова
00:10:45
компилироваться
00:10:50
компилятор нам нашел 84 ошибки это
00:10:54
конечно много причем не все из них
00:10:56
являются ошибками компиляции то есть
00:10:59
ошибками
00:11:00
обозначенными вот таким крестиком в
00:11:02
кружочке здесь также присутствует
00:11:04
множество синтаксических ошибок
00:11:06
помеченных вот этим символом и би си и
00:11:09
visual studio сваливается эти ошибки в
00:11:11
общую кучу хотя запросто может
00:11:13
получиться так что исправив одну строку
00:11:15
кода я сразу убираю множество чуть ли не
00:11:17
десяток ошибок потому что эти ошибки во
00:11:20
многом связаны между собой но все что
00:11:22
нам остается это двигаться либо по
00:11:24
списку этих ошибок
00:11:25
либо по самому коду глядя на эти
00:11:29
подчёркнутые символы и мы можем начать
00:11:32
прямо отсюда тот ошибка означает что
00:11:34
переменная b гпн не определена и
00:11:37
действительно в классе к богу у нас нет
00:11:41
переменной с таким именем
00:11:42
потому что эта переменная до сих пор
00:11:44
остается в классе с engine
00:11:46
если я нажму f12 то я перейду в
00:11:49
определения переменной внутри класса с
00:11:52
angel
00:11:53
эта переменная описывает карандаш для
00:11:55
рисования фона и эта переменная нужно не
00:11:58
только шарику но и другим функциям
00:12:00
в этом же классе поэтому забирать и
00:12:02
отсюда эту переменную как те другие
00:12:04
нельзя она здесь должна остаться
00:12:07
следовательно мы должны нашем шарике
00:12:09
иметь копию этой переменной или
00:12:11
предоставить доступ к общее для этих
00:12:14
двух классов в переменной но пока мы
00:12:16
пойдем по простому пути и просто
00:12:18
скопируем я возьму тип hp
00:12:21
добавлено сюда возьму имя переменной bgp
00:12:26
и добавлю я сюда
00:12:29
теперь если я перейду в исходный файл на
00:12:31
одну ошибку стало меньше и у нас здесь
00:12:33
подобная ошибка не известный символ pg
00:12:36
браш
00:12:37
потому что этот браш описан другом
00:12:40
классе он здесь тоже нужен поэтому
00:12:42
забрать его нельзя я его скопирую и
00:12:47
добавлю в наш класс небо стало немножко
00:12:51
легче хотя все еще много ошибок
00:12:53
следующее что не нравится вижу у студии
00:12:55
это то что мы обращаемся к
00:12:57
неопределенному идентификатор упоров
00:12:59
боунрекс если я нажму и в12 the visual
00:13:03
studio мне найдет в классе с engine и
00:13:07
действительно вот эта структура и вот
00:13:09
это они описывают предыдущие и текущее
00:13:12
положение шарика и вполне уместно если я
00:13:15
заберу отсюда эти структуры и
00:13:18
определю их в классе был там где они и
00:13:21
должны существовать потому что является
00:13:23
частью
00:13:24
описания сущности шарик теперь здесь это
00:13:29
подчеркивание ушло и мы можем перейти к
00:13:31
следующему имя ball pen не определено нажимаем f12
00:13:36
и снова попадаю в определении нашего
00:13:38
класса и сендер здесь этот карандаш и
00:13:41
соответствующая кисть нужны только для
00:13:43
рисования шарик поэтому отсюда я могу
00:13:45
забрать это имя и перенести его наш
00:13:51
класс то же самое с кистью r12 отсюда
00:13:58
забираем и сюда
00:14:01
переносим
00:14:04
смотрим дальше я даже нажмём f7 но и
00:14:10
ошибок стало немного меньше было 80 с
00:14:13
чем-то теперь 58
00:14:15
теперь разберемся с претензиями к
00:14:18
следующей функции здесь у нас есть имя
00:14:21
ball says которая является статической
00:14:24
константой в классе с engine
00:14:27
но и вполне логично что если константа
00:14:29
описывающая размер шарика будет
00:14:32
находиться в classic описывающий шарик
00:14:34
поэтому я отсюда и забираю и сюда
00:14:37
вставляю классе был смотрим на следующую
00:14:43
проблему макс expose это та же константа
00:14:46
но это константа
00:14:48
уже не может быть частной собственностью
00:14:49
шарика потому что максимальное значение
00:14:52
по иксу нужно и другим сущностям нашей
00:14:54
программе следовательно забирать отсюда
00:14:57
из класса с engine
00:14:58
эту константу нельзя тут пользоваться
00:15:01
нам надо и в другом кофе мы можем это
00:15:04
сделать достаточно просто за счет того
00:15:06
что это константа
00:15:08
она статическое и она существует ни у
00:15:11
объекта класса из engine а у класса
00:15:14
следовательно мы можем обратиться к этой
00:15:16
константе не через указатель или ссылку
00:15:19
на объект а указав имя класса то есть не
00:15:23
нужно взять имя класса виз энджи и
00:15:26
поставить его перед именем этой
00:15:28
константы вот так теперь правда вижу в
00:15:32
студии другая претензия на говорит что
00:15:34
это константа недоступна это потому что
00:15:37
константа
00:15:38
макс expose находится в приватной секции
00:15:41
вот
00:15:42
вот в этой поэтому должен взять эту
00:15:45
константу и перенести в публичную секцию
00:15:48
и вполне логично будет если я
00:15:49
перенося макс expose перенесу imax y
00:15:53
пост потому что они логически тесно
00:15:55
между собой связаны
00:15:56
отсюда вырезаем и вставляем в публичные
00:16:00
секции в том же самом курсе вот теперь
00:16:03
это константа здесь доступно хотел
00:16:06
visual studio появились претензии к этим
00:16:09
константам так как они используют
00:16:11
значение других неописанных еще здесь
00:16:13
констант они описаны ниже
00:16:16
следовательно мне нужно перенести и эти
00:16:18
константы из приватной секции публично и
00:16:20
хотя мне нужна только одна это но она
00:16:23
идет в паре с вот этой поэтому я забираю
00:16:26
обе строки и добавляю их здесь тоже
00:16:29
самое касается константа сел white
00:16:32
сжимаем контра рф и забираю ее
00:16:36
и парную ей константу и переношу сюда
00:16:42
теперь ошибка связанная с константой bow
00:16:45
says константа bow says здесь не
00:16:48
известно потому что теперь это константа
00:16:50
принадлежащие другому классу поэтому я
00:16:53
беру имя другого этого класса и ставлю
00:16:56
его здесь вот так в пони естественным
00:17:01
образом константы
00:17:02
мигрировали из приватной секции в
00:17:04
публично нажимаем f12 и переношу
00:17:11
константу отсюда в публичную сетку и
00:17:17
добавляю имя класса возможно мне где-то
00:17:23
еще это константа используется
00:17:24
нет больше не используется теперь
00:17:29
смотрим на это имя f12 и забирают сюда
00:17:32
пару этих констант и переношу публичную
00:17:35
секцию
00:17:44
а те константа может быть тоже где-то
00:17:46
еще используется нет тоже
00:17:48
а вот здесь
00:17:56
уже лучше f12
00:18:02
ах ну да не хватает имени косо
00:18:14
f12
00:18:17
это константа
00:18:20
12 и вот тут нам придется менять тактику
00:18:24
дело в том что я не могу написать вот
00:18:27
здесь имя класса потому что платформ
00:18:30
expose это не константа эта переменная
00:18:33
это переменная присутствует у объекта
00:18:36
типа с engine это значит что для доступа к
00:18:39
такой переменой
00:18:40
не здесь нужен объект типа нашего движка
00:18:43
то есть функции муж ball
00:18:45
я должен обратиться к объекту с engine
00:18:47
для того чтобы обратиться к его
00:18:49
переменной платформ expose но эта
00:18:52
проблема решается довольно просто я беру
00:18:55
имя этого класса с engine и передаю в
00:19:00
нашу функцию переменную типа из
00:19:03
рейнджера я пишу класс я пишу звездочку
00:19:06
который означает что это будет указатель
00:19:08
на объект такого типа и пишу имя этой
00:19:11
переменной engine то есть 10 я функцию
00:19:17
мозгу передаю указатель на наш движок
00:19:20
но и если я поменял формат функции всей
00:19:24
цепи файле я должен поменять его же
00:19:27
и заголовочный файл и вот здесь чтобы
00:19:31
эти описания были идентичными
00:19:33
и теперь я беру имя объекта типа нашего
00:19:37
движка и здесь пишу это имя знак минус
00:19:43
знак больше
00:19:44
чтобы получилось стрелочка и теперь я
00:19:47
могу обратиться к этой переменной
00:19:49
продал visual studio все равно ставится
00:19:51
претензия она говорит что это переменная
00:19:53
недоступно
00:19:54
но это уже другая проблема они доступны
00:19:56
это переменная потому что она находится
00:19:58
в приватной секции следовательно не
00:20:01
нужно вынести эту переменную с приватной
00:20:03
секции и разместить ее в публичный вот
00:20:06
здесь кстати уберу эту пустую строку
00:20:09
между статическими консультантами вот
00:20:13
кремом пользоваться переменной нашего
00:20:15
движка и везде где это имя встречается я
00:20:18
перед ним поставлю имя объекта и
00:20:21
стрелочку теперь посмотрим какая
00:20:24
проблема с под каким именем а это
00:20:29
статическая константа я здесь забыл
00:20:32
поставить имя класс интересно она еще
00:20:34
где-то используется до чего здесь пока
00:20:39
все и вот это еще я f12 это тоже
00:20:44
переменная
00:20:45
тоже есть приватной секции нашего движка
00:20:48
поэтому я переношу из приватной секции в
00:20:51
публичке и ставлю перед ней имя
00:20:55
указателя и стрелочку остается еще
00:20:59
немного подчеркиваний вот этот global
00:21:02
скейл это статическая константа
00:21:06
я ее заберу отсюда и поставлю здесь в
00:21:09
публичной секции класса с engine и
00:21:12
поставлю перед этой константы имя и
00:21:17
везде где она используется исправлю
00:21:26
теперь у нас есть еще претензия к
00:21:29
переменной h внд которая находится в
00:21:33
приватной секции и я раскрою ещё и эту
00:21:36
переменную то есть перенесу и из
00:21:37
приватные секции в публичную чтобы вы
00:21:40
могли через указатель на наш жук
00:21:45
обратиться к этой переменной
00:21:52
остается претензия касательно функций
00:21:55
потому что эта функция чек лего брик хит
00:21:57
если нажмем f12 то я найду эту функцию в
00:22:03
приватные секции класса с engine
00:22:07
поэтому я могу эту функцию вынести
00:22:09
отсюда из приватной секции и поместить
00:22:12
ее в публичную секцию но здесь поставить
00:22:16
имя указателя
00:22:20
остается еще один момент так как эта
00:22:22
функция у нас в классе следует сразу
00:22:25
после функции он таймер то логично было
00:22:27
бы ожидать и в коде что на файле си плюс
00:22:30
плюс также расположена после функции вон
00:22:32
таймер хотя сейчас это не так поэтому я
00:22:35
нажимаю клавишу f12 перехожу к коду этой
00:22:38
функции
00:22:39
вырезаю отсюда возвращаюсь к классу f12
00:22:44
и ставлю после таймера
00:22:48
вот теперь чуть лучше нажимаем f7 и
00:22:53
ошибок особо меньше не стало
00:23:01
но по крайней мере вы прошли эти методы
00:23:03
класса и бомб и
00:23:06
у них больше нет ошибок казалось бы
00:23:09
такой маленький шарик сколько там в нем
00:23:12
тех функций а так много действие
00:23:14
приходится предпринять чтобы вынести его
00:23:17
в отдельную сущность
00:23:18
но давайте продолжим у нас в
00:23:21
конструкторе нашего движка есть четыре
00:23:23
ошибки
00:23:24
связанных с тем что мы здесь
00:23:26
инициализируем переменные которых уже
00:23:28
больше нет в этом классе
00:23:30
теперь эти перемены находятся в другом
00:23:32
классе следовательно инициализации этих
00:23:36
переменах должна происходить в другом
00:23:38
глазе а именно в конструкторе другого класса
00:23:41
bull у нас еще нет этого конструктора
00:23:43
поэтому нам нужно его написать я иду в
00:23:48
начало файла и добавляю здесь еще одну
00:23:53
функцию функция будет называться хайбол
00:23:57
водой . и бог и представлять себя
00:24:02
конструктор но так как муж заголовочные
00:24:05
файлы его еще не описали the visual
00:24:07
studio сразу же предъявила претензию я
00:24:11
отсюда копирую это имя и вставляю вот
00:24:15
здесь
00:24:18
обратите внимание я форматирую текст
00:24:21
нашего класса разбивая его на логические
00:24:24
группы правильными строками начале у
00:24:27
меня все дойдет конструктор и у
00:24:29
классовой может быть много конструкторов
00:24:31
поэтому это отдельная секция кода потом
00:24:33
у меня идут методы
00:24:35
нашего класса потом переменные причем
00:24:38
так как переменных у нас много
00:24:40
то я их разбил на две группы переменные
00:24:42
простых типов и переменные
00:24:44
сложных типов а потом идет секция с
00:24:47
константами такое разбиение кода
00:24:49
облегчает поиск информации потому что
00:24:51
именно поиском информации по коду мы в
00:24:54
основном занимаемся когда пишем
00:24:56
программу так вот вернемся к конструктора шарика я
00:24:59
создал конструктор и теперь перенесу в
00:25:02
него
00:25:04
инициализацию переменной отсюда мы
00:25:07
заберем и сюда добавим нажимаю
00:25:16
компиляцию f7
00:25:20
здесь visual studio подсвечивает нам
00:25:22
очередную проблему
00:25:23
хотя функция мув был написано правильно
00:25:27
претензия заключается в том что этот тип
00:25:30
с engine он неизвестен вот здесь в тот
00:25:34
момент когда visual studio анализирует
00:25:36
заголовочный файл дело в том что вот
00:25:38
этот тип он определен потом ниже и в
00:25:42
момент компиляции вот этой строки кода
00:25:44
visual studio не знает что значит имя с
00:25:48
engine для того чтобы устранить такую
00:25:50
ошибку я должен подсказать visual studio
00:25:52
что это квас я не могу перенести
00:25:54
описании вот этого класса
00:25:56
выше перед и ball потому что нам ибо у
00:26:00
мужчин в самом этом классе вот здесь в
00:26:03
таком случае я должен сделать так
00:26:05
называемое предварительное объявление
00:26:07
или по английски форвард declaration
00:26:10
я беру имя класса который мне нужен
00:26:12
ранее и ставлю его вот здесь отдельной
00:26:17
строкой пишу квас имя и точку с запятой
00:26:22
такая запись означает что я пометил имя
00:26:26
из engine как класс
00:26:27
но еще не описал you visual studio
00:26:30
ожидают что описание будет где-то дальше
00:26:32
но теперь я могу пользоваться этим
00:26:34
именем
00:26:35
visual studio будет правильно его
00:26:37
трактовать как имя класса я нажимаю
00:26:42
компиляцию и что-то у нас этого
00:26:45
подозрительно мало ошибок всего лишь 13
00:26:48
я перехожу к первому пункту дентифик
00:26:51
атор ball pen не определен
00:26:53
эта функция и нет engine которая создает
00:26:57
нам пару карандаш и кисть для нашего
00:27:01
шарика и записывают их соответствующие
00:27:03
переменные
00:27:04
ну так как эти переменные теперь
00:27:05
вынесены в отдельный класс нам нужно
00:27:08
здесь указать имя объекта которому
00:27:10
принадлежат эти переменные то есть у нас
00:27:13
есть объект bolt
00:27:16
я могу здесь написать бомб .
00:27:20
был бен вот так следующая ошибка paul
00:27:27
frank не определен и эта ошибка у нас
00:27:30
возникает функции дров фрейм нашего
00:27:32
движка и решить мы могли бы просто
00:27:35
написал 10 имя объекта bolt а функция
00:27:39
драббл тоже должна вызываться в этого
00:27:42
объекта богу но это не совсем хороший
00:27:46
подход потому что здесь функция
00:27:48
принимать решения рисовать или нет шарик
00:27:51
что вообще-то является ответственностью
00:27:53
шарика другими с вами нужно позволить
00:27:55
самому шарику решать может он себя
00:27:58
рисовать или не поэтому я возьму вот эту
00:28:00
проверку условия заберу отсюда я нажимаю
00:28:04
в 12 и самой функции сделаю эту проверку
00:28:09
но туда мне здесь нужно обратное условие
00:28:12
что есть ли пересечении нет ничего и не
00:28:17
делаем не здесь не хватает
00:28:18
прямоугольника пересечении нажимаю
00:28:20
control of и перехожу по f3 на другую
00:28:26
функцию где он определен копирую
00:28:29
возвращаюсь сюда и вставляем когда я мог
00:28:33
бы написать
00:28:34
ну и здесь уже не нужно имени объекта
00:28:38
так как мы внутри класса ball имеем
00:28:40
прямой доступ к нашим переменам и
00:28:44
осталось немножко подправить строчку с
00:28:46
вызовом то есть убрать лишнюю табуляцию
00:28:50
так код выглядит более аккуратно и мы с
00:28:53
пиратами внутри функции draw
00:28:55
функционал по отрисовке шарик нажимаем
00:28:58
комбинацию всем и смотрим на следующую
00:29:01
ошибку
00:29:02
идентификатором у в пол неопределен да
00:29:05
потому что эта функция раньше называлась
00:29:07
как метод класса
00:29:09
engine а теперь это метод класса ебал я
00:29:11
могу вызвать его у объекта но наша
00:29:15
функция ему в бок должна принимать
00:29:18
указатели на движок
00:29:20
а здесь нет переменной которая является
00:29:22
указателем
00:29:24
экземпляр классных снг то есть другими
00:29:26
словами в методе
00:29:28
движка он таймер при вызове функции ball
00:29:32
этот объект должен был передать
00:29:33
указатель на себя и для этого все плюс
00:29:36
плюс есть специальное ключевое слово
00:29:38
которая называется виз которая
00:29:42
обозначает указатель на объект метод
00:29:46
которого описан в этом коде
00:29:47
данном случае на с engine возможно вам
00:29:50
будет не совсем понятно что значит
00:29:52
ключевое слово из во всяком случае мне
00:29:55
когда-то это было понятно не сразу но в
00:29:57
принципе тут ничего сложного не нажимаю
00:29:59
компиляцию то всем и в методе движка чек
00:30:05
лего брик хит мы модифицируем переменную
00:30:08
bull direction которая теперь находится
00:30:10
в классе и бог в этом я здесь пишу имя
00:30:13
объект этого класса и теперь мы можем
00:30:18
менять эту переменную f7 и внезапно
00:30:23
программа скомпилировалось
00:30:25
попробуем запустить ну даже как-то
00:30:28
работает хотя этот след от шарика
00:30:31
означает что фон перерисовывается
00:30:34
неправильно а именно похоже что фоновая
00:30:37
кисть и карандаш не содержат правильных
00:30:39
значений и действительно вот наш класс
00:30:43
пол вот у него есть б г н и б г браш
00:30:49
которую мы используем в методе друг боб
00:30:52
но эти переменные в этом классе не были
00:30:55
пронизали zero ван и так как в этой
00:30:57
функции у нас нет указателя на движок то
00:31:00
следовательно мы и не можем использовать
00:31:02
переменные которые есть у движка самым
00:31:05
простым решением в данном случае будет
00:31:07
просто добавить сюда указатель на наш
00:31:09
движок а именно передать его как
00:31:11
параметр в эту функцию и воспользоваться
00:31:14
значениями из движка то есть я уберу в
00:31:18
классе
00:31:19
вот эту переменную b гпн и вот этот бег
00:31:22
опрашиваемого будем использовать из
00:31:24
нашего движка и я возьму имя класса и
00:31:29
добавлю сюда еще
00:31:31
один параметр указатель на наш движок
00:31:35
здесь раз мы поменяли здесь имя метода
00:31:39
то надо поменять его исправить и здесь и
00:31:43
тогда я возьму этот показатель лишь его
00:31:47
имя стрелочку и обращусь к переменной ну
00:31:53
чтобы эта переменная была доступна я
00:31:55
тогда возьму ее отсюда и перенесу ее из
00:32:02
приватной секции класса engine в
00:32:07
публичную секцию и то же самое сделаю
00:32:09
для броши
00:32:16
да заберем сюда добавим
00:32:19
посмотрим что получается в 7 вот здесь
00:32:26
функции дров фрейм при вызове функции
00:32:29
друг пол не хватает 3 параметр указатель
00:32:33
на движок то есть так как это метод классно из
00:32:36
engine не хватает указателя на себя
00:32:38
поэтому и пишу в x
00:32:41
компилируем компилируется запускаем и
00:32:46
все работает и это хорошо ну чтобы еще я
00:32:53
исправила так это имя метода которые мы
00:32:55
вызываем у нас здесь написано балу .
00:32:58
друг ball и честно говоря это слово
00:33:01
второй болт она немного лишь но вот так
00:33:04
считалось бы лучшим богу дро
00:33:06
поэтому я нажимаю в 12 приду к этому
00:33:10
методу еще раз l12 перейду в класс и
00:33:13
уберу отсюда эти лишние слова я нажимаю
00:33:17
alt и левую кнопку мыши и корректирую
00:33:20
сразу по имени а здесь убираю этот
00:33:26
кусочек и вот этот
00:33:29
нажимаем f7 и корректируйте места где
00:33:34
вызываются эти методы запускаем работает
00:33:43
и так что у нас получилось мы вынесли из
00:33:47
довольно большого класса he's engine
00:33:50
который явно содержал себе несколько
00:33:52
сущности мы вынесли из этого класса
00:33:56
отдельную сущность описывающий наш шарик
00:33:59
и описали ее отдельным классом я хотя и
00:34:03
такой класс вполне нормально смотрится
00:34:04
на мой взгляд нём довольно много
00:34:06
элементов находится в публичной секции
00:34:09
не все эти переменные нужны чтобы ими
00:34:12
пользоваться снаружи то есть менять их у
00:34:14
объекта типа
00:34:15
болт другими с вами большинство
00:34:17
переменных и констант этого класса
00:34:19
должны быть приватными потому что
00:34:21
является деталями реализации этого
00:34:23
класса но так как эти методы мы вызываем
00:34:26
объекта то вот насчет переменных я не
00:34:28
уверен давайте им попробуем все
00:34:30
остальное поместить в приватную sex я
00:34:33
попробую скомпилировать и получил кучу
00:34:37
ошибок связанных с использованием этих
00:34:40
элементов в частности ball says нам
00:34:43
нужно в кофе с engine ball pen мы
00:34:48
модифицируем когда создаем карандаша
00:34:50
кисть direction мы меняем из функций
00:34:56
принадлежащий движку
00:35:02
поэтому я попробую эти элементы вынести
00:35:04
в публичную секцию компилирую direction
00:35:16
f12 вот стало с direction перенести в
00:35:21
публичную секцию компилируем вот теперь
00:35:29
этот класс выглядит лучше теперь те
00:35:31
элементы которыми мы пользуемся у
00:35:33
объекта типа apple доступны в публичной
00:35:37
секции а те элементы которыми мы не
00:35:39
пользуемся которые используют методы
00:35:42
этого класса
00:35:43
они остались в приватной секции вот
00:35:46
теперь можно считать что мы вынесли
00:35:49
функциональность шарика в отдельный
00:35:52
класс был на этом мы сделаем паузу
00:35:55
теперь попробуйте вы вынести из вашего
00:35:58
движка шарик в отдельный класс это может
00:36:01
оказаться не так просто возможно вообще
00:36:04
все разломайте но если что у вас уже
00:36:06
должны быть навыки и способности как
00:36:08
вернуть проект в предыдущее состояние и
00:36:11
если вы все разломайте просто попробуйте
00:36:13
заново
00:36:14
этот опыт который вы приобретете вынося
00:36:16
код в отдельный класс вам здорово
00:36:18
пригодиться потом в вашей работе мы
00:36:22
продолжаем рефакторинг класс нашего
00:36:25
игрового движка этот класс все еще
00:36:27
сложный внутреннего все еще находятся
00:36:30
несколько других сущностей и наша задача
00:36:33
вынести эти сущности в отдельные классы
00:36:35
так чтобы в каждом классе была описана 1
00:36:38
сущность и следующий кандидат на
00:36:40
отдельный класс
00:36:41
я думаю будет наш уровень я запускаю
00:36:44
программу клавиша f5 вот этот массив
00:36:48
кирпичей в нашем проекте и называется
00:36:51
уровень и для описания уровня в этом
00:36:53
классе у нас есть несколько констант вот
00:36:55
эти вот ли вы white-level хейт либо love
00:36:59
set а также вот это ширина и высота
00:37:02
ячейки
00:37:03
нас есть функции которые
00:37:06
относятся к этой сущность рисование
00:37:08
кирпича
00:37:09
рисование буквы и функция друг левов
00:37:12
которое рисует сам уровень
00:37:13
а также возможно какие то переменные
00:37:16
являются частью этой сущности сейчас не
00:37:19
очевидно какие именно должны попасть наш
00:37:21
класс но по мере того как мы будем выносить
00:37:23
код и данные из этого класса в другой
00:37:25
visual studio нам подскажет своими
00:37:28
ошибками те места в коде которые нам
00:37:30
следует исправить для того чтобы вынести
00:37:32
сущность описывающего уровень в
00:37:34
отдельный класс
00:37:35
я вот здесь перед классом engine создам
00:37:39
еще один класс так как вас описывает
00:37:43
уровень талии война за руб по-английски
00:37:45
левого и поставлю префикс и означающую
00:37:50
что это имя косо
00:37:52
я сразу поставлю сюда публичную секцию и
00:37:55
в неё перенесу все данные и все функции
00:37:58
а потом те из них которая кажется
00:38:00
служебными элементами мы перенесем в
00:38:03
приватную секцию я возьму вот эту пару
00:38:07
константы и вот эти пары константа
00:38:10
перенесу сюда
00:38:15
я возьму вот эту функцию даже вот эти
00:38:20
четыре функции и перенесу их сюда а
00:38:25
также есть ещё вот эта функция которая
00:38:29
обрабатывает столкновение шарика с
00:38:30
кирпичом
00:38:31
так как это пробки рпи что значит это
00:38:34
должно быть в этом классе
00:38:36
ну и теперь осталось перенести эти
00:38:38
методы
00:38:39
из класса офис-менеджер в класс к лего
00:38:42
кстати я здесь пришел и левом они и
00:38:46
слева потому что подразумевает что в
00:38:49
этой я может быть много игровых уровней
00:38:51
и опять же я не уверен в этом я всего
00:38:53
лишь предполагаю что будет много игровых
00:38:56
уровней
00:38:57
но если потом окажется что класс
00:38:59
описывающий уровень должен быть в
00:39:01
единственном экземпляре
00:39:02
я просто поменяю его имя но пока будет
00:39:05
такое копируем это имя нажимаю f12 и
00:39:10
перехожу к этому методу
00:39:12
и переношу этот метод другой кос
00:39:16
а заодно я возьму отсюда этот код вырежу
00:39:21
и вставлю его перед первой функции
00:39:26
класса с engine так как у нас
00:39:30
заголовочные файлы коз и левого
00:39:32
находится над классом из engine в
00:39:35
исходном файле мы тоже здесь вы
00:39:37
разместим перед кодом этого класса я
00:39:41
вставляю 4 пустых строки
00:39:43
метод и комментарии а также когда я в
00:39:50
одном файле располагая несколько классов
00:39:52
я их ещё подписываю отдельным
00:39:55
комментариям которые немного повышает
00:39:58
стабильность кода
00:40:11
ну и продолжаем переносить остальные
00:40:13
методы друг брик после него идет с бри
00:40:23
клитор курс вот этот а потом дроу брик
00:40:29
лектор
00:40:31
следующий прямой метод и / lego
00:40:38
вот эти четыре метода в этом исходном
00:40:42
файле также идут один забираем поэтому
00:40:44
сразу все выделяю и переношу сюда
00:40:56
осталось только поменять имена классов
00:41:00
так так и вот так но в принципе можно
00:41:10
компилировать
00:41:11
нажимали всем я получаю целую кучу
00:41:16
ошибок и я могу в принципе начать с
00:41:19
этого списка могу переключиться исходный
00:41:22
файл и пройтись здесь по всем
00:41:24
подчёркиванием с которыми мы здесь
00:41:26
столкнемся
00:41:28
мне кажется что по списку будет идти
00:41:31
наверное проще
00:41:32
итак перво ошибка класс из engine не
00:41:36
имеет члена левого хайд потому что
00:41:39
теперь это принадлежит другому классу
00:41:41
вот он вот это константа вот этот хвост
00:41:45
поэтому поменяв здесь ведь именно я
00:41:49
исправляю ошибки а также
00:41:53
следующая ошибка снг не имеет теперь
00:41:57
такой констант да так и есть а вот эта
00:42:04
функция должна теперь вызываться нему
00:42:06
движка а у уровня но к этой ошибки я
00:42:09
предлагаю вернуться чуть позже а пока
00:42:12
разобраться с чем-нибудь штука прыща
00:42:15
например с такой ошибкой я нажимаю f12
00:42:20
и мы переходим к описанию перемены brick
00:42:24
red пэн которая находится в классе с
00:42:27
engine
00:42:28
а это переменная описывает карандаш для
00:42:31
рисования кирпичей
00:42:32
но очевидно что этот карандаш должен
00:42:35
находиться уже в другом гость поэтому я
00:42:37
копирую тип hp и вставляю его здесь
00:42:44
brick red band
00:42:46
я думаю и брик blue пэн отсюда заберем
00:42:51
ну и скорее всего с кистями
00:42:56
точно также нужно поступить
00:43:12
нажимаю компиляцию f7 ошибок стало
00:43:16
поменьше и можно продолжить дальше идти
00:43:18
по этому списку так это ушакова позже
00:43:22
рассмотрим эту пожалуй тоже позже потому
00:43:25
что она связана с нашим шариком а эту
00:43:28
ошибку будет проще исправить потому что
00:43:30
она касается только констант нажимаем
00:43:32
f12 и обнаруживают константу голгофский
00:43:36
внутри класса с engine
00:43:38
а мы обращаемся к этой константе из
00:43:42
класса левы
00:43:44
следовательно так как это статическая
00:43:47
константа мне достаточно указать имя
00:43:51
класса я могу обратиться к этой
00:43:55
константе
00:43:56
и везде где у нас используется это
00:44:01
константа
00:44:02
я поставлю перед ней
00:44:04
имя класса получается довольно большая
00:44:09
строка кода но иногда строки бывают
00:44:13
большие здесь
00:44:19
я мог бы использовать автоматическую
00:44:20
замену но у нас в этом файле находится
00:44:23
несколько классов и такая автоматическая
00:44:27
замена
00:44:28
может оказаться неудачным решением
00:44:32
или даже привести к дополнительным
00:44:34
ошибкам поэтому лучше если я все это
00:44:37
сделаю вручную
00:44:45
ну вот
00:44:47
как то так компилируем и следующая
00:44:52
проблема
00:44:53
идентификатор бриклайт не определен
00:44:59
я нажимаю e и надцать и действительно
00:45:02
вот эти две статических константы
00:45:04
находятся в классе с engine
00:45:07
хотя они описывают кирпич который
00:45:09
является элементом сущности нашего
00:45:13
уровня поэтому я сюда их перенесу
00:45:15
и хотя кирпич сам по себе тоже сущность
00:45:20
но пока пусть будет элементом сущности
00:45:23
уровень а для нас это значит что нам
00:45:26
позже надо будет вынести из сущности
00:45:29
уровень сущность кирпич
00:45:32
если конечно это поучиться в отдельный
00:45:35
класс компилируем от 7 ошибок стало еще меньше
00:45:39
и вот еще одна синтаксическая ошибка
00:45:42
константа so white я бывает в движке уже
00:45:48
не известно это потому что они
00:45:50
мигрировали
00:45:51
другой класс поэтому я здесь поставлю
00:46:01
компилируем все синтаксических ошибок
00:46:04
пока нет остались ошибке компиляции и
00:46:08
посмотрим что мы можем с ними сделать
00:46:10
так шарики пока оставлю на потом ошибка
00:46:14
имя для т.н. неизвестно в функции draw
00:46:21
брик литр
00:46:25
переменной литр пэн неизвестная нажимаем
00:46:28
f12 я перехожу к определение это
00:46:30
переменные в другом классе с engine
00:46:33
но в принципе здесь это переменная тоже
00:46:36
не нужно я заберу отсюда и помещу в
00:46:42
классе уровне так следующая ошибка
00:46:47
а вот кстати это переменная letter пэн
00:46:50
мы его создаём в функции и нет engine
00:46:53
при инициализации нашего движка
00:46:55
а так как эта переменная теперь является
00:46:57
членом класса level то я могу в этом
00:47:00
коде в нашем движке
00:47:02
использовать переменную нашего уровня но
00:47:04
для этого мы нашем движке должен быть
00:47:07
объект описывающих уровень а его пока
00:47:09
нет поэтому я возьму вот это имя класса
00:47:12
и создам здесь землян класса или
00:47:18
и тогда теперь я могу использую это имя
00:47:23
обращаться к его переменной вот так
00:47:26
соответственно и здесь
00:47:39
так ошибок стало меньше
00:47:42
вот это константа нажимаю 12 определено
00:47:46
теперь кости левой поэтому чтобы в
00:47:50
методе класса и сенсин мы могли
00:47:52
пользоваться этой константы я должен
00:47:54
поставить здесь имя класса также здесь
00:47:59
здесь здесь и здесь нажимаем f7
00:48:11
вот и осталось совсем немного ошибок дро
00:48:15
либо не найдено потому что теперь метод
00:48:19
дро лего является не методом класса
00:48:22
движка а методам класса левого поэтому я
00:48:25
здесь и напишем .
00:48:28
мы вызовем этот метод у объекта а заодно
00:48:32
и поступлю аналогично тому как мы
00:48:34
поступили с рисованием шарика если я
00:48:36
нажму на в 12 том перейду на метод до
00:48:41
нашего шарика и вот здесь внутри этого
00:48:43
метода мы проверяем пересекается ли та
00:48:47
область которая изменилась на экране с
00:48:50
самим шариком если не пересекается то мы
00:48:53
ничего не рисуем аналогичным образом я
00:48:56
поступлю здесь я возьму этот код
00:48:58
проверку эту и перенесу внутрь функцию
00:49:02
вот сюда но условие будет уже другой
00:49:07
если не пересекается to return
00:49:12
осталось только добавить определения вот
00:49:15
этого rectangle а
00:49:20
и передать сюда вот этот прямоугольник
00:49:24
я нажимаю control of перехожу туда где
00:49:27
вызывается функция
00:49:28
вот этот параметр здесь я передаю
00:49:36
а здесь принимаю я даже мойшу 1 of 12
00:49:40
чтоб перейти в заголовочный файл
00:49:42
вставлю здесь здесь этот параметр
00:49:46
и осталось немножко исправить он
00:49:51
нажимает компиляцию в 7 и вот эта ошибка
00:49:56
левый rect
00:49:57
говорит о том что в классе хоть леву
00:50:00
нету такой структуры потому что она
00:50:03
находится в квасе сны поэтому я отсюда я
00:50:07
тоже забираю и переношу сюда
00:50:14
компилируем
00:50:18
и получаем такую ошибку которая говорит
00:50:21
о том что наши движок теперь не может
00:50:24
использовать эту переменную
00:50:26
потому что это переменная структурная
00:50:29
является частью класс заливал я нажимаю
00:50:32
alt отделяю вертикальную полосу и
00:50:36
вставляю сюда имя этого объекта а также
00:50:40
сюда и сюда
00:50:44
компилируем вот и осталось две ошибки
00:50:49
которые откладывать времена потом первая
00:50:51
связана с функцией 2 связанная с шарика
00:50:54
это ошибка связана с тем что мы функции
00:50:58
человек лего брик хит который находится
00:51:01
в классе левую должны изменить значения
00:51:03
переменной принадлежащие шарику это
00:51:06
значит что мы должны были бы передать
00:51:08
сюда
00:51:09
указатель на шарик чтобы могли
00:51:11
обратиться к его переменной
00:51:13
но мы можем сделать проще мы можем
00:51:14
передать указатель на саму переменную
00:51:16
бог direction или даже не указатель а
00:51:19
ссылку а именно я возьму это имя
00:51:24
нажмем f12 чтобы найти эту функцию в
00:51:27
заголовочные файлы опять а в 12 вот
00:51:30
возьму это имя и добавлю сюда параметр
00:51:32
так как был direction у нас имеет типу
00:51:35
добытая на биржу надо бы имя поменяю и
00:51:42
поставлю ampersand то есть передам в эту
00:51:45
функцию ссылку на направление шарик
00:51:54
и тогда здесь буду использовать эту
00:51:57
переменную и наш класс может теперь
00:52:01
вообще ничего не знать про шарик и это
00:52:05
хорошо тем меньше информации нужно для
00:52:07
того чтобы этот класс работал тем лучше
00:52:10
но правда теперь у нас будет ошибка
00:52:12
связанная с вызовом этой функции я
00:52:14
нажимаю компиляцию и вот мы получаем
00:52:19
такую ошибку что у движка нету такой
00:52:22
функции теперь эта функция находится у
00:52:25
другого класса теперь это метод класса и
00:52:28
его
00:52:29
следовательно здесь нам нужно обратиться
00:52:32
не к движку окурок а значит что там где
00:52:35
а перед и указатели на движок
00:52:37
вот здесь я могу передать и указатель на
00:52:39
наш уровень то есть добавить еще один
00:52:41
параметр функцию хлеба звездочка там где
00:52:48
эта форма обьявляется
00:52:50
часы двенадцать из работает я ставлю
00:52:53
курсор на имя класса нажимаем f12
00:52:56
перехожу к описанию класса от функция
00:52:59
муж сюда я добавил левого и тогда я могу
00:53:04
вот здесь вызывать эту функцию cos али
00:53:08
его нет на что и не хватает а чудного
00:53:10
параметра направлении шарика вот вот от
00:53:15
этого теперь провода будет еще одна
00:53:17
ошибка всем
00:53:21
которое будет говорить о том что на
00:53:23
момент компиляции
00:53:25
класса и ball мы ничего не знаем про
00:53:27
лего потому что он описан ниже
00:53:31
но мы опять же можем это исправить
00:53:33
добавить здесь предварительное
00:53:35
объявление класса
00:53:38
его и эта ошибка уйдёт когда я добавляю
00:53:44
предварительное объявление класса на
00:53:46
самом деле это как бы логически и
00:53:48
костыль наличие таких предварительных
00:53:51
объявлений
00:53:52
это вот этого говорит о том что
00:53:54
архитектура нашего проекта не совсем
00:53:56
прекрасно в правильной архитектуре не
00:53:59
должно быть таких предварительных
00:54:00
объявлений и все должно замечательно
00:54:02
компилироваться поэтому для нас на
00:54:04
будущее это те места в коде которые
00:54:07
нужно улучшить то есть реорганизовать
00:54:10
структуру наших классов так чтобы нам не
00:54:12
пришлось заранее девать эти
00:54:13
предварительные объявление но эту
00:54:16
проблему мы исправим позже а пока я
00:54:17
нажимаю и вся и остается последняя
00:54:21
ошибка функциям of не принимает один
00:54:24
аргумент
00:54:25
она принимает 2 1 это engine верни
00:54:30
указатель на объект типа энджи и слова
00:54:33
виз является этим указателям
00:54:35
а второй аргумент это указатель на
00:54:37
уровень уровень у нас есть вот он этот
00:54:40
объект
00:54:41
левую поэтому здесь мне нужно написать
00:54:44
имя этого объекта а так как нужен
00:54:47
указатель то я ставлю перед именем
00:54:49
амперсанд и таким образом это становится
00:54:52
указателем на объект типа
00:54:54
лего компилируем всем скомпилировать
00:54:59
запускаем ну а надо же как-то работает
00:55:04
и это хорошо в этом коде осталась одна
00:55:09
проблема даже несколько проблем на
00:55:12
которой хотел бы обратить внимание вот
00:55:14
здесь у нас есть функция
00:55:15
как инициализации нашего движка 12
00:55:21
перехожу к коду и вот здесь в функции
00:55:24
инициализации мы инициализируем члены
00:55:27
данных других классов вот здесь вот
00:55:31
здесь и вот здесь на самом деле это не
00:55:35
совсем правильно дело в том что этот
00:55:38
класс engine честно говоря не должен
00:55:40
вообще переживать о том как правильно
00:55:42
про ниц и ализе ровать элементы других
00:55:44
классов наоборот другие классы должны
00:55:48
сами позаботиться о том чтобы их
00:55:50
переменной были правильно
00:55:51
проинициализирована это значит что вот
00:55:54
этого кода не должно быть в этом классе
00:55:57
этот код должен быть в классе лево и там
00:56:00
производить инициализацию своих
00:56:02
элементов
00:56:03
следовательно нам нужно сделать
00:56:05
инициализацию нашего уровня для этого я
00:56:08
иду наш класс уровня и добавляю сюда ещё
00:56:12
одну функцию инициализации так как это
00:56:14
как бы особенная функция хотя на самом
00:56:16
деле обычная функция этого класса но
00:56:18
смысл не особенно она должна вызываться
00:56:21
один раз начали то я размещу эту функцию
00:56:24
тоже в начале описания класса и разовую
00:56:26
просто и нет сокращение от инициализация
00:56:30
остается только эту функцию описать там
00:56:34
где находится код класса я нажимаем f12
00:56:37
и перехожу на
00:56:43
то есть это не конструктор эта функция
00:56:46
инициализации в принципе инициализации
00:56:49
должен заниматься конструктор но объект
00:56:52
уровня будет конструировать до того как
00:56:55
будет создана окно в нашей программе и
00:56:56
до того как нам станут доступны и
00:56:58
графические элементы этой программы
00:57:00
поэтому в программе на windows вполне
00:57:02
нормальная ситуация когда мы выполняем
00:57:04
так называемую отложенную инициализацию
00:57:07
то есть мы инициализируем объект после
00:57:10
того как он уже был создан для чего
00:57:12
придуманный функции инициализации в
00:57:14
общем я иду наш движок
00:57:17
функцию и нет engine и забирают сюда вот
00:57:21
этот код и переношу его в функцию
00:57:28
инициализации так как лего бы это было
00:57:32
имя объекта то здесь она не нужна
00:57:39
мы остается добавить имя класса для
00:57:41
константы
00:57:42
габов скилл которые находятся в движке
00:57:57
но и нужно вызвать теперь эту функцию не
00:57:59
социализации при инициализации нашего
00:58:02
движка м12 вот здесь теперь при
00:58:11
инициализации движка вызовем
00:58:13
соответствующих функцию которая
00:58:15
и выполнят правильную инициализацию
00:58:17
уровня ну раз мы уже сделали функцию
00:58:19
инициализации для уровня то по-хорошему
00:58:21
и все остальные строчки кода которые
00:58:24
занимаются инициализации тоже нужно куда
00:58:26
же перенести я могу принимать вот это
00:58:28
собрать в 12 сюда поставить
00:58:34
f3 перешел на следующие символы то есть
00:58:38
вернулись функцию и нет engine и вот эти
00:58:43
две строки отсюда забираем f12 сюда
00:58:48
вставляем вот так было бы правильно я
00:58:52
убираю имя хлеба потому что теперь это
00:58:55
уже части класса этот код но у нас
00:58:59
возникают другие ошибки и связаны с тем
00:59:01
что я обращаюсь к элементам частности к
00:59:04
функции объявлены в другом классе
00:59:06
если для константы гоблов скилл не
00:59:09
достаточно поставить имя класса то для
00:59:13
инициализации
00:59:14
уровня мне чтобы обратиться к функции
00:59:18
вот этой crate paint браш который
00:59:20
объявлено на самом деле в классе нашего
00:59:25
движка
00:59:29
мне в функцию инициализации нашего
00:59:32
уровня надо было бы передать указатели
00:59:34
на движок
00:59:35
но это не совсем правильно дело в том
00:59:38
что наш движок
00:59:40
имеет член даны под названием level и
00:59:43
это означает что наш движок
00:59:45
владеет объектом типа лево и передавать
00:59:48
в этот объект указателей на движок
00:59:50
чтобы наш уровень не мог пользоваться
00:59:52
функционал движка
00:59:53
не совсем правильно потому что у нас
00:59:55
получается зацикленная зависимость класс
00:59:58
a stranger должен знать про левым
01:00:03
a-level про с engine такие логические
01:00:07
зацикливания источник самых серьезных
01:00:10
проблем в программах и надо всячески их
01:00:12
избегать мы должны все достроить
01:00:14
иерархические зависимость то есть один
01:00:17
класс должен знать про другой этот
01:00:20
другой ничего не должен знать про тот
01:00:22
кто им владеет частью для решения этой
01:00:25
проблемы все плюс плюс есть еще одна
01:00:28
замечательная особенность
01:00:29
еще раз у нас есть класс и клевал у
01:00:33
которого есть метод инициализации и нам
01:00:35
нужно воспользоваться функцией другого
01:00:38
кваса и при этом нам нужно не передавать
01:00:41
сюда указатель на другой класс в таком
01:00:44
случае мы могли бы воспользоваться
01:00:46
статическим методом другого класса как
01:00:50
вы помните у нас класса с engine
01:00:54
есть статические константы которые
01:00:58
являются особым видом данных эти
01:01:01
статические константы всегда
01:01:03
присутствуют в единственном экземпляре в
01:01:05
программе а кроме статических элементов
01:01:08
данных у класса могут быть статические
01:01:10
функции ну или другими с вами
01:01:13
статические методы вот эти методы не
01:01:15
статически это обычные методы класса и
01:01:18
для того чтобы их вызвать не нужен
01:01:20
объект
01:01:21
у которого можно вызвать эти методы но
01:01:23
также я могу иметь
01:01:24
статические методы и тогда мне не нужен
01:01:27
объект недостаточно просто самого класса
01:01:31
давайте я попробую показать это на
01:01:33
примере нам нужна функция кредит paint
01:01:36
браш дать ему возьму эту функцию
01:01:38
во-первых вынесем ее в публичную секцию
01:01:41
а во-вторых напишем перед ней ключевое
01:01:45
слово static
01:01:46
и теперь эта функция становится
01:01:50
статической то есть для того чтобы
01:01:52
вызвать такую функцию не нужно ни объект
01:01:55
в виде ссылки или указателя а имя класса
01:02:01
вот так нажимаем компиляцию и проектом
01:02:09
пилер из обратите внимание мы здесь
01:02:12
взяли и функцию из нашего движка сделали
01:02:16
статической но не всякий метод можно
01:02:19
взять и сделать статическим дело в том
01:02:21
что этот метод клей paint браш
01:02:23
он не использует элементов данных
01:02:27
класса с engine он вообще не обращается
01:02:29
к членам данных этого класса а значит он
01:02:33
и может стать статическим например вот
01:02:35
этот метод он таймер я не могу сделать
01:02:37
статическим потому что он обращается к
01:02:40
ключевому слову виз который подставляет
01:02:44
указатель на объект или например вот
01:02:47
этот метод ядро платформ я тоже не могу
01:02:50
сделать статическим потому что он
01:02:52
оперирует данными и нажимаем 12 которые являются
01:02:56
членами класса и только вот этот метод я
01:03:00
могу сделать статический потому что он
01:03:02
принимает параметры и возвращает данные
01:03:05
в параметрах наверное я не очень удачно
01:03:08
объясню что такое статические методы
01:03:10
возможно не все из вас смогут понять как
01:03:13
ими пользоваться но я надеюсь что со
01:03:16
временем на примере других статических
01:03:18
методов в нашем проекте вы поймете как
01:03:20
ими пользоваться и сможете применять эту
01:03:23
особенность классов там где это будет
01:03:25
действительно нужно но так как мы вот
01:03:27
этот метод перенесли и теперь он у нас
01:03:30
находится
01:03:33
публичной секции после метода он таймер
01:03:36
в исходном коде он должен быть после
01:03:39
метода он таймер а он значит переносить
01:03:42
не надо ну и еще одна проблема которая
01:03:45
хотела бы обратить внимание это то что у
01:03:48
нас все элементы находятся в публичное
01:03:50
секции и теперь стоит перенести в
01:03:52
приватную секцию то что не
01:03:54
использоваться
01:03:55
снаружи он функцию е нет ну точно
01:03:58
снаружи используем а насчет остального
01:03:59
не уверен поэтому я объявляю приватную
01:04:04
секцию и все что ниже него автоматически
01:04:06
становится приводным нажимаю компиляцию
01:04:09
и смотрим на ошибки требовал x love set
01:04:14
the theatre константа стали недоступны в
01:04:17
копьях с engine значит они должны быть в
01:04:20
публичной секции это вот это и вот это я
01:04:30
думаю что эту пару константин то это
01:04:32
все-таки нужно оставить в публичный
01:04:35
сектор и всем
01:04:40
вот этот метод тоже используются снаружи
01:04:43
называется у объекта типа a level
01:04:47
нажимаю e и надцать еще раз в 12 и
01:04:50
переношу его есть при водкой секция
01:04:54
публично
01:04:55
а также до левого тоже вызывается
01:05:00
объекта типа
01:05:01
и клевал в12 в 12 отсюда забираем туда
01:05:06
переносим x7 скомпилировалось без ошибок
01:05:11
вот таким естественным способом мы
01:05:15
распределили
01:05:16
члены класса лево по двум секциям
01:05:20
приватный и публичный
01:05:21
ну что ж на этом месте мы опять сделаем
01:05:23
паузу теперь когда мы вынесли второй
01:05:26
курс из нашего движка
01:05:27
наш код довольно сильно поменялся и я
01:05:30
думаю вам стоит тоже вынести этот квас
01:05:34
из своего движка и сравнить с тем
01:05:36
результатом которые я вывожу по ссылке
01:05:39
кстати раз можем унесли инициализацию
01:05:42
уровня в отдельную функцию то подобным
01:05:45
образом нам следовало поступить из
01:05:47
инициализация шарика вот здесь метод
01:05:50
init engine занимается инициализации
01:05:53
членов данных другого класса что с точки
01:05:56
зрения программирования на о.п.
01:05:58
неправильно поэтому нам стоит вынести
01:06:01
вот эту одну строку кода в отдельную
01:06:04
функцию инициализации у шарика вызвать
01:06:07
эту функцию инициализации в этом методе
01:06:10
у класса был я сделаю по аналогии с
01:06:14
методом и нет f12 и прям возьму его
01:06:17
отсюда и там где наш шарик
01:06:23
у нас есть конструктор после него
01:06:27
вставлю этот метод вот сюда
01:06:37
и изменю им вот я скопипастил этот
01:06:42
инициализация
01:06:49
и в этот метод я перенесу код из другого
01:06:53
контролем нажимаю f3
01:06:56
f3 я перехожу функция не стилизация
01:07:00
движка забираем отсюда эту строчку и бф3
01:07:04
перехожу обратно в нашу новую функцию
01:07:08
вставлю а так как этот метод
01:07:10
теперь является эстетический методом
01:07:13
классно с engine то мне здесь нужно
01:07:15
написать имя этого класса и таким
01:07:21
образом я могу вызвать эту функцию
01:07:24
ну соответственно имя объекта мы убираем
01:07:26
потому что мы уже в этом методе
01:07:28
модифицируем свои собственные переменные
01:07:32
ну ей осталось вызвать эту функцию
01:07:35
нажимаем f3
01:07:37
f3 и вот здесь копирастам
01:07:45
компилируем компилируется успешно
01:07:50
запускаем и она работает вот теперь
01:07:55
получается более правильно ну давайте
01:07:59
вынесем из нашего движка еще одну
01:08:01
сущность я предлагаю вынести
01:08:03
сущность платформы платформа описывается
01:08:07
переменными платформ expose под from
01:08:10
white
01:08:11
вот этими двумя методами ну и возможно
01:08:15
еще какими-то методами общем я создам
01:08:19
еще один класс назову его платформ ну и
01:08:25
поставлю префикс и
01:08:27
и сразу что добавлю публичную лекцию вот
01:08:33
пустой класс в котором мы переносим
01:08:35
функционал платформа вот эти две
01:08:37
переменных вот эти два метода
01:08:50
и вот эту вот константу
01:08:59
упс не туда вот ну и теперь я поменяю
01:09:06
имя класса
01:09:08
у метода рыдал платформ и возьму этот
01:09:14
метод а из дества 1 меня и возьму эти
01:09:18
два метода
01:09:20
отсюда мы их вырезаем и вставляем перед
01:09:26
первым методом нашего движка потому что
01:09:30
коз платформа идет перед классом движкам
01:09:34
34
01:09:41
и для красоты пишу все эти методы
01:09:44
комментарии компилируем и получаем
01:09:51
очередную сотни ошибок я пожалуй
01:09:54
пройдусь по этим красным подчёркиванием
01:09:57
нажимаем f12 и вот эти две структуры
01:10:02
описывающие позицию платформа забираем
01:10:04
из класса из engine и переносим коз
01:10:09
платформы вот этот глобус киев
01:10:13
нажимаем f12 он определенно у нас в
01:10:16
инженер чтобы мы могли пользоваться из
01:10:20
класса а и платформы и оставлю здесь имя
01:10:25
класса и 22 и ключи
01:10:33
и кстати по поводу имени класса в нашей
01:10:41
игре может быть только одна платформа не
01:10:44
подразумеваем множество платформ то есть
01:10:47
объект типа
01:10:48
и платформ нужен быть один поэтому я
01:10:50
помечу его префиксом s
01:10:53
который подскажет мне что объект этого
01:10:56
типа должен быть в единственном
01:10:57
экземпляре и теперь нажимаем f12 и вот
01:11:06
эту константу забираем из класса и сын
01:11:10
джон переносим ее сюда я нажимаю всем ошибок
01:11:17
стала слегка минджи и здесь у нас есть
01:11:20
вызов функции инвалиды и трек с
01:11:23
неизвестной переменной h внд
01:11:26
а мы уже недавно подобным строку кода
01:11:29
как-то менять и самый лучший вариант
01:11:31
будет посмотреть как же мы это делали я
01:11:33
нажимаю control of и пв3 перехожу на все
01:11:36
места кода где встречается вызов этой
01:11:39
функции вот как мы решили эту ситуацию в классе
01:11:43
шарик мы передавали указатель на наш
01:11:46
движок и у него брали переменную аж в
01:11:52
н.д. возможно это не лучшее решение но
01:11:54
она уже работает нашей программе поэтому
01:11:57
я его и продублирую берем отсюда этот
01:12:00
параметр и переходим к тому месту в коде
01:12:04
где мы только что были и добавляю сюда
01:12:08
этот параметр но если его добавлю то
01:12:12
тогда половив 12 я уже не могу
01:12:13
переключиться на
01:12:14
заголовочный файл где описана этот метод
01:12:17
поэтому я сначала переключает на
01:12:20
заголовочный файл чтобы
01:12:23
найти где-то этот находится и потом
01:12:27
вставляю сюда параметр
01:12:28
и сюда а здесь через стрелочку обращаюсь
01:12:36
к переменной h войны также мы где-то уже
01:12:43
похоже решали эту проблему
01:12:45
когда вызова или функцию select a jet и
01:12:48
как-то разруливать эту ошибку я нажимаю
01:12:50
контру ф да и таких конечно мест был и в
01:12:54
коде довольно много но если твой
01:12:57
offtrack пробежаться по ним то я вот на
01:13:00
еду в кафе с engine это не том вот в
01:13:05
классе
01:13:06
бог опять же передавать сюда в качестве
01:13:09
параметра
01:13:10
указатели на движок и брали у него эту
01:13:14
переменную давайте такой же метод а
01:13:16
здесь от пользу contra отце так я перехожу по f12 к
01:13:23
нашей функции вот здесь и там где мы
01:13:26
рисовали платформу я передам сюда еще
01:13:29
этот параметр нажимаю f12 и вставляю
01:13:34
сюда этот параметр
01:13:41
а у него уже беру эту перемена
01:13:50
честно говоря мне не нравится этот
01:13:51
подход когда мы должны везде передавать
01:13:54
указатель на наш движок
01:13:55
дело в том что наш движок владеет
01:13:57
экземпляром платформы и следовательно
01:14:00
платформа уже не должна ничего знать про
01:14:02
движок поэтому вот такая передача
01:14:04
параметра чтобы взять из него
01:14:06
карандаша кисть это временное решение мы
01:14:09
его пока используем для того чтобы хоть
01:14:11
как-то разделить сложный классно простой
01:14:14
и остается другие ошибки если я нажму
01:14:18
f12 ту найду в классе с engine
01:14:23
карандаш для рисования шарика платформа
01:14:26
а также внутренней части платформы
01:14:28
ну и разумеется эти элементы лучше
01:14:32
перенести в саму платформу
01:14:41
то же самое касается и кистей нет вот
01:14:45
эти ход копирую
01:14:50
здесь удаляю и сюда вставляем
01:15:00
габов скилл эта константа из класса с
01:15:05
engine
01:15:08
но это довольно много придется замен
01:15:10
сделать поэтому я сделаю авто замену я
01:15:14
заменю
01:15:15
это слово я нажимаем control аж и у меня
01:15:20
в этом окне описано какое слово мы меняем а здесь на
01:15:23
какое я сюда вставляю имя класса 2 :
01:15:28
копирую это имя и теперь я вот это
01:15:33
эту строку заменю на вид но чтобы это
01:15:35
было не по всему коду
01:15:37
я выделю вот эту часть здесь нажму
01:15:42
selection и теперь все изменения по коду
01:15:46
произойдет только в том месте где я
01:15:48
выделил я нажимаю замену всех элементов
01:15:52
visual studio red я поменяла код в
01:15:55
двадцати двух местах остается вот эта
01:16:03
претензия f12 и константа circles
01:16:08
оказывается имеет отношение к платформе
01:16:12
мы ее переносим в класс от формы
01:16:17
а инвайт и платформ x степ это
01:16:22
переменная который я заберу из класса с
01:16:25
бенджен
01:16:26
и поставлю в классе с платформ и еще у
01:16:31
нас есть highway pen это карандаш
01:16:34
которым мы рисуем подсветку на шарике
01:16:36
блэка верней на шарике
01:16:38
я ее перенесу воду в класс с платформ
01:16:43
нажимаем f7 и у нас все еще много ошибок
01:16:48
и вот эти ошибки говорят о том что здесь
01:16:51
в конструкторе мы инициализируем
01:16:54
переменное которые уже не являются
01:16:56
членами данных этого класса потому что
01:17:00
мы их перенесли в другой класс нашу
01:17:02
платформу вот эти четыре переменных
01:17:05
поэтому мне нужно эту не цели зации
01:17:08
сделать уже в другом классе я возьму
01:17:11
прямо весь этот метод скопирую
01:17:15
перейду в коде к первому методу нашей
01:17:18
платформа нажму и в12 и вставлю
01:17:21
весь конструктор ясно что остается
01:17:23
поменять имя класса и выровнять церковь
01:17:28
и кажется правильно
01:17:31
ну и объявить этот конструктор в
01:17:34
описании коз вот здесь
01:17:41
остается только вернуться к конструктору
01:17:44
нашего движка про их 12 и выбрать отсюда
01:17:47
вот эту проблему
01:17:49
ну стало немножко лучше f7 и из-за того
01:17:55
что некоторые константы переехали в
01:17:58
другой класс у нас появились
01:17:59
дополнительные ошибки но это нормально я
01:18:03
беру имя класса и вот эту константу
01:18:07
платформы горит поз помечаю уже другим
01:18:10
именем
01:18:11
соответственно и здесь а это а здесь нам
01:18:18
уже нужно обратиться к переменной из
01:18:20
платформы они из движка в методе умов у
01:18:26
шарика мы передавали сюда весь движок
01:18:29
чтобы взять у него переменной
01:18:31
относящаяся к платформе и к окну
01:18:35
аж венда следовательно теперь мы здесь
01:18:37
должны передать указатели на объект типа
01:18:40
нашей платформы поэтому я
01:18:45
1212 поэтому я здесь передам параметр
01:18:48
нашей платформы форум
01:18:53
под фуру
01:19:09
и у этого указателя уже возьму и теперь
01:19:13
они и
01:19:16
вот так я думаю что теперь когда мы
01:19:24
вынесли функционал платформа в отдельный
01:19:26
класс
01:19:27
нам нужно создать экземпляр этого класса
01:19:30
то есть объект внутри нашего движка вот
01:19:34
здесь я после уровня добавлю объект типа
01:19:38
платформа чтобы мы могли вызывать его
01:19:42
функции и обращаться киева до на нажимаю
01:19:46
в 7 ошибок все еще довольно много ордер
01:19:53
xs-12 и visual studio меня перебрасывает
01:19:57
на платформ expose они но это имя
01:20:01
но это слегка включат уже visual studio
01:20:04
такое бывает я могу просто нажать
01:20:06
control shift и нажать find all и найти
01:20:11
все места в коне и есть этот border x
01:20:14
офсет вот это константа
01:20:17
которое определено движке этом я беру
01:20:21
имя движка и ставлю здесь чтобы указать
01:20:25
откуда это константа но и здесь
01:20:31
и всем
01:20:36
и мы снова приходим к нашей функции
01:20:38
инициализации движка которое
01:20:41
инициализирует переменные
01:20:42
переехавшие уже в другой класс поэтому я
01:20:45
здесь просто по аналогии добавлю еще
01:20:47
одну функцию для инициализации
01:20:58
и я по аналогии с другими функциями
01:21:00
перейду например по f12 на эту функцию
01:21:03
но она сильно большая f3 например на вот
01:21:08
шарика f12 он тут небольшая функция я
01:21:13
его всю скопирую и копипастом создам ее
01:21:17
но для платформы вот здесь после
01:21:20
конструктора я нажимаем f12 и вставляю
01:21:24
сюда этот код вот у меня появилась
01:21:28
функция инициализации пустая пока что но
01:21:32
она уже вызывается где-то в этом клубе
01:21:35
так я добавлю сюда заголовочный файл вот
01:21:41
нажимаем f3 и перехожу туда где вызываем
01:21:45
эту функцию я забираю вот эту строчку кода в 12
01:21:51
вставляю сюда f3 забираю отсюда вот эти
01:21:56
две строки
01:21:58
f12 вставляют сюда ev3 но в принципе на
01:22:05
этом инициализация платформы
01:22:06
заканчивается это мы уже ее используем
01:22:08
поэтому я здесь поставлю
01:22:10
имя объекта у которого вызова функций у
01:22:13
ядра платформ осталось только исправить
01:22:15
эту функцию инициализация так как я
01:22:18
вызываю статические методы берешь кроту
01:22:22
я могу поставить имя класса и таким
01:22:26
образом ошибка уходит и всем компиляция
01:22:32
собак стала слегка меньше и переходим к
01:22:37
функции дробь фрейм но здесь мы уже
01:22:40
просто действуем по аналогии мы забираем
01:22:43
это та строку нет мне заберем чуть позже
01:22:45
мы вот эту функцию дропу от формы
01:22:48
вызовем у объекта платформы а эту
01:22:54
проверку
01:22:55
перенесем внутрь этой функции 12 вот
01:23:00
сюда и поменяем условия если не
01:23:05
пересекается
01:23:07
to return добавим сюда добавим сюда
01:23:16
interception ред и передадим сюда point
01:23:20
доверия я нажимаю control п.ф.
01:23:24
перехожу к за в этой функции по клавишу
01:23:26
f3
01:23:28
чтобы взять параметр p and heavy f12 в
01:23:34
12 и добавляю его сюда
01:23:43
вот так f3
01:23:46
и здесь у нас для рисования платформы мы
01:23:49
вызываем функцию передаем ей две
01:23:51
переменных которые уже находятся в
01:23:54
платформе поэтому я их просто не буду
01:23:57
здесь передавать в 12 и здесь
01:24:04
соответственно эта функция больше не
01:24:06
принимает переменные снаружи она будет
01:24:09
пользоваться
01:24:10
переменными которые являются членами коз
01:24:12
то есть везде где у нас использовался x
01:24:15
а он тут много используется y тоже
01:24:19
я буду использовать эти две перемены вот
01:24:24
это и константа
01:24:26
но чтобы не увеличить объем кода
01:24:29
которого тут и так много я сделаю вот
01:24:32
так я введу переменную x
01:24:36
которая будет имеет значение вот этой
01:24:40
переменной и переменную y
01:24:43
которая будет иметь значения от этой
01:24:46
константы
01:24:49
таким образом код здесь не придется
01:24:52
менять и все будет работать так же как
01:24:56
раньше всем и все еще машина что-то у
01:25:02
нас под форма тяжело отделяется от
01:25:05
движка так как эти переменные теперь
01:25:09
является частью платформы
01:25:11
т.е.
01:25:14
то я поставлю перед их именем имя
01:25:17
объекта у готового я возьму эти
01:25:19
переменные здесь так здесь он так
01:25:42
f7
01:25:47
и вот здесь ошибка который говорит
01:25:50
слишком мало аргументов для вызова
01:25:53
мы здесь должны были передать указатель
01:25:55
на движок
01:25:56
а так как этот кот находится внутри
01:25:58
метода с engine по указателям на прыжок
01:26:01
будет в лес то есть на себя всем и здесь
01:26:08
тоже не хватает указателя на движок то
01:26:12
есть на себя и принтере и всем
01:26:23
здесь добавляем из
01:26:30
а здесь не хватает платформа а платформа
01:26:34
этого нас теперь описывается объектом
01:26:36
платформ поэтому я ставлю здесь
01:26:39
платформу и ampersand
01:26:41
который берет адрес этого объекта и
01:26:44
делают из него указатель на платформу и
01:26:47
в семь и мы сталкиваемся с такой же
01:26:54
проблемой с которой уже сталкивались на
01:26:56
момент компиляции
01:26:58
заголовочные файлы вот этой строки кода
01:27:00
неизвестно что значит имя из платформ
01:27:03
поэтому я сделаю предварительное
01:27:06
объявление их этого класса и это тоже
01:27:10
логический костыль которую мы потом
01:27:12
исправим и всем и внезапно осталась одна
01:27:17
ошибка здесь не хватает
01:27:22
дэс потому что указателем на вижу будет
01:27:26
dm7
01:27:28
все
01:27:30
остается предупреждение что вот эта
01:27:32
переменная не используется потому что
01:27:35
весь код мы перенесли соответствующей
01:27:37
функции
01:27:38
поэтому я здесь убираю запускаем вот
01:27:47
форма ездит значит она перерисовывается
01:27:50
правильно шарик отбивается значит она
01:27:53
работает правильно следовательно перенос
01:27:55
кода
01:27:56
прошел правильно но и осталось
01:28:00
разобраться с приватной секция для этого
01:28:03
класса так как и нет функция точно
01:28:06
вызывается объекта платформа
01:28:07
то я могу здесь написать про и вот и
01:28:10
посмотреть что же действительно нужно
01:28:12
что нет платформ y paz нам нужен а также
01:28:20
expose и ширина эти два параметра
01:28:26
платформе expose и платформ white
01:28:32
переходят в публичную секцию f7 платформ
01:28:38
y paz переходит тоже в публичную лекцию
01:28:44
в 7
01:28:47
red дыру под форму поверх 12 перехожу на
01:28:52
эту функцию а также дроп платформ оба
01:28:55
этих метода
01:28:56
нужны будут в публичной секции в 7
01:29:04
так это не кот форме x
01:29:11
публичную и все и у нас получился еще
01:29:18
один класс описывающие уже нашу
01:29:20
платформу после чего класс нашего движка
01:29:24
стал совсем уже небольшой хотя в нем все
01:29:27
еще присутствует еще одна сущность
01:29:29
copies его еще аромку нашего уровня
01:29:32
перед тем как вынести функционал рамки я
01:29:36
бы хотел сделать еще небольшое улучшение
01:29:38
для класса платформы если я нажму
01:29:41
например на этой переменной control
01:29:44
shift f то я найду место в коде где
01:29:49
используется эта переменная и например
01:29:51
здесь у нас получается текст вида
01:29:54
платформ .
01:29:55
platform expose получается некоторые
01:29:58
тавтологию и вот в таком виде
01:30:01
это читалось бы немного лучше платформ .
01:30:04
expose соответственно с другими именами
01:30:08
тоже смотрелась бы немного лучше поэтому
01:30:11
я и исправлю и теме на для этого я
01:30:14
ставлю курсор на той переменой который
01:30:16
хочу поменять нажимаем kontrol shift
01:30:18
аж и появляется окно которое позволяет
01:30:22
произвести массовую замену
01:30:24
текста в исходном коде здесь я в этом
01:30:27
окошке указываю что поменять это строка
01:30:30
сюда автоматически попала из-под курсора
01:30:32
а здесь я указываю на что поменять
01:30:35
оставлю эту же строку и удаляю лишнее
01:30:39
при этом важно чтобы вот эти две галочки
01:30:43
были установлены 1 означает что и жол
01:30:46
studio должна обращать внимание на
01:30:48
регистра символов и не путать большие
01:30:50
буквы с маленькими автора
01:30:52
означает что строка платформ expose
01:30:55
должна заменяться только если
01:30:57
встречается целиком если это является
01:31:00
частью какого-то другого слова тут такие
01:31:02
строки будут пропускаться
01:31:04
при нажимаю reprise
01:31:07
visual studio говорит чтобы иметь
01:31:10
возможность отмены этого действия все
01:31:13
файлы в которых будет найдено и тосола
01:31:15
останутся открытыми для редактирования
01:31:18
вы потом можете сохранить или отменить
01:31:21
изменение в каждом файле ну я обычно
01:31:23
нажимай уезд
01:31:25
visual studio сделала 12 замен то же
01:31:30
самое с другим элементам кондрашев h
01:31:34
здесь я меняю
01:31:37
уже на другое имя 4 замены если перейду
01:31:46
сам класс то здесь у нас есть еще
01:31:48
платформ y поз и от уже могу поменять
01:32:04
и вот эту переменную
01:32:16
и вот эту константу
01:32:21
а
01:32:28
компилируем всем скомпилировалось
01:32:33
запускаем все работает и это хорошо
01:32:40
я предлагаю сделать паузу и теперь ваша
01:32:44
очередь вынести сущность платформы из движка в
01:32:47
отдельный класс ну и теперь осталось
01:32:51
вынести функциональность рамки в
01:32:54
отдельный класс
01:32:55
у нас есть два метода дроп партер и
01:32:58
дробь bounce который имеет отношение как
01:33:00
раз к рисованию рамки 10 источник
01:33:04
карандаши и кисти может быть еще что то
01:33:06
вот это все его неси я создаю здесь
01:33:09
много квас назову его border оставлю
01:33:16
префикс kay
01:33:17
ну и так как рамка в нашей игре будет
01:33:20
всегда одна то поставляющей префикс с и
01:33:27
сюда мы переносим вот эти две константы
01:33:36
вот эти два метода и четыре переменных
01:33:44
ну вроде бы всё осталось поменять имя
01:33:47
коса у этих методов нажимаем f12 /
01:33:53
border друг bounds и забираю их отсюда и
01:34:00
так как у нас коз border находится перед
01:34:04
классом engine ты по из 12 перехожу на
01:34:08
первый метод engine вставляют четыре
01:34:10
строки и наши методы
01:34:20
вот так ну осталось все исправить
01:34:23
нажимаем компиляцию получаем очередную
01:34:28
кучу ошибок но мы уже знаем что с этим
01:34:31
делать global скилл это константа из
01:34:34
нашего движка и в принципе везде в этом
01:34:43
коде
01:34:47
даже в этом методе я произведу массовую
01:34:49
замену я выделяю код этого метода
01:34:54
нажимаю control хаш вставляю сюда
01:35:01
имя вот этой константы а сюда правильное
01:35:06
имя константы
01:35:07
так что ты это выделение текста слетела
01:35:09
еще раз выделяю и нажимаю замену 24
01:35:16
замены
01:35:18
компилируем
01:35:22
вот этот bgp эта переменная из нашего
01:35:26
движка и в прошлый раз мы этого шутка
01:35:29
устранили
01:35:30
добавив в качестве параметра указатель
01:35:32
на наш движок
01:35:33
нажимаем f12 в 12 и вставляю сюда из
01:35:41
энджи энджи и теперь я могу пользоваться
01:35:53
переменные по указателям
01:35:59
лепсе
01:36:04
и иду по списку ошибок класс engine не
01:36:08
имеет члена border x
01:36:11
а все потому что теперь это константа
01:36:14
находится в классе с бардак и вот это
01:36:24
константа тоже
01:36:29
дилерам следующая ошибка это компилируем
01:36:43
функция drop border ожидает больше
01:36:46
параметров да здесь не хватает указателя на движок
01:36:50
следовательно нужно передать сюда
01:36:52
качестве параметра указатель на движок
01:36:56
я возьму вот этот вот параметр
01:36:59
и добавлю этот
01:37:05
дробь bounce чтобы передать его
01:37:09
вот здесь контроллера и приходим к тому
01:37:20
что у нас должен быть метод
01:37:22
инициализации нашей рамки в котором мы
01:37:24
пропишем вот этих параметр
01:37:26
я сделаю по аналогии но у нас еще нет
01:37:34
такого объекта
01:37:35
такого члена данных поэтому не нужно
01:37:37
здесь взять имя этого класса и добавить
01:37:41
еще один член да ну вот так ну а у
01:37:47
самого классах с border нет у метода
01:37:50
инициализации
01:37:51
я его опять возьмем копипастом например
01:37:54
отсюда ту шарика
01:38:00
индус первый метод нашего бургера и
01:38:04
вставляю сюда
01:38:05
то что я скопипастил это добавление
01:38:19
и теперь в этот метод переносим 2 эти
01:38:23
функции
01:38:28
а так как этот метод является
01:38:30
статическим методом у класса с хен джин
01:38:34
то есть ход а то мне надо поставить имя
01:38:39
класса 2 гбайт .
01:38:42
нажимаем компиляцию и ошибок стало
01:38:46
совсем немножко / bounce дентифик отара
01:38:50
не найден потому что теперь это метод
01:38:55
класса с border доступного через
01:38:59
переменную border и этому методу
01:39:03
нужен и указатель на движок а так как мы
01:39:06
вызываем этот метод в методе движка то
01:39:09
значит указатель на себя
01:39:14
и вот здесь border x офсет теперь это
01:39:18
константа
01:39:19
классе с бургер и значит здесь нужно
01:39:24
написать этого класса компилируем и
01:39:31
скомпилировалось запускаем и она даже
01:39:34
работает шарик отражается от рамки ну
01:39:38
это же вообще прекрасно так теперь нам
01:39:42
нужно спрятать в приватную секцию те
01:39:44
методы и данные которые не вызываются
01:39:46
снаружи я пишу
01:39:48
прайвет но мне-то ты не точно вызывается
01:39:51
снаружи а у насчет этих 6 посмотрим и
01:39:53
всем так border i have set и
01:40:00
игроков сайт нам нужны и снаружи а
01:40:02
именно из метода класса кобол поэтому
01:40:08
отсюда мы их собираем всем
01:40:14
и метод друг bounce и в12 он тоже должен
01:40:21
быть публичным компилируем отлично
01:40:25
скомпилировалось
01:40:26
и я честно говоря немножко бы изменил
01:40:29
имя этого метода я же мог поиск этого
01:40:34
имени по коду вот так у нас вызывается
01:40:37
этот код но если мы обратим внимание на
01:40:40
остальные вызовы
01:40:42
то можно было бы изменить и остальные
01:40:44
методы чтобы она смотрелась единообразно
01:40:47
то есть не / bounce а просто метод дробь
01:40:50
тогда было бы бюро др др о бок друг
01:40:54
то есть вот этот метод я нажимаю kontrol
01:40:57
шик аж и меняю по всему коду
01:41:01
дробь на дробь
01:41:08
компилируем
01:41:11
получилось нормально и вот здесь вот эти
01:41:14
методы у других классов
01:41:15
дроппод форм я тоже заменю на
01:41:19
просто друг
01:41:34
а вдруг либо тоже она просто друг
01:41:41
и уже на этом этапе мы можем заметить
01:41:45
что у нас вырисовывается некое
01:41:48
единообразное поведение у наших объектов
01:41:51
а именно метод дрон который принимает
01:41:54
параметр hdc
01:41:55
paint ария и указательный движок и
01:41:59
возможно в будущем мы сможем объединить
01:42:02
эти методы общее функциональностью но
01:42:05
пока это не очевидно и поэтому пока мы
01:42:08
это не будем делать ну и раз мы меняем
01:42:13
имена у функции я бы поменял еще и это
01:42:16
имя потому что у класса border метод /
01:42:20
border не рисуют рамку
01:42:22
рисует элемент рамки и изменю это имя на
01:42:26
дров border element или даже проще
01:42:29
на дробь элемент
01:42:43
раньше я такую замену мы не сделали
01:42:45
потому что мы не оперировали сущностью
01:42:48
борту для которой у нас теперь появился
01:42:50
новый класс
01:42:51
теперь же когда мы добавили новое имя то
01:42:54
вполне нормально если мы немножко
01:42:56
исправим именно методов у этого класса
01:42:59
ну вот мы и а3 factory ли большой и
01:43:02
сложный квас из engine сложный потому
01:43:05
что он содержал в себе несколько других
01:43:07
сущностей и разбили этот класс на 5
01:43:10
класса вот здесь у нас есть список сущности
01:43:15
которые использоваться в этом файле
01:43:16
здесь можно обнаружить название этих
01:43:20
классов и этот класс с engine стал
01:43:24
совсем небольшой все что у него есть по
01:43:27
сути это объекты других типов и
01:43:29
некоторые методы которые обеспечивают
01:43:32
работу нашего игрового движка
01:43:34
кода у нас получилось довольно много
01:43:37
в одном исходном файле у нас there
01:43:39
содержится много сущности и это та же
01:43:42
проблема и эту проблему мы решим немного
01:43:44
позже а пока что я предлагаю сделать
01:43:47
очередную паузу постарайтесь завершить
01:43:49
ри factory класса движка и вынесите
01:43:53
функционал рамки в отдельный класс и
01:43:55
сравните с тем результатом который
01:43:57
получился у меня

Описание:

Часть #15. Рефакторинг сложного класса. (Базовый курс программирования на С++) Самые лучшие бесплатные курсы по C++, Ассемблеру и Unreal Engine 5! Все части в плейлисте: https://www.youtube.com/playlist?list=PLlheCABZdy3OZoIh9VwlYUbTSCWwDUee6 Оглавление курса на Википедии: 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 - Рефакторинг сложного класса 01:42 - Форматирование ссылок и указателей 03:58 - Настройка выравнивания кода в Visual Studio 06:13 - Выносим сущность шарика в класс ABall 10:50 - Исправляем ошибки, разделяя сущности движка и шарика 29:15 - Указатель на себя this 33:44 - Переносим часть членов класса ABall в приватную секцию 35:53 - Popcorn_11.zip: пишем код 36:22 - Выносим сущность уровня в класс ALevel 55:07 - Рефакторим метод Init_Engine() 01:02:11 - Статический метод 01:05:21 - Popcorn_12.zip: пишем код 01:05:39 - Создаём функцию инициализации ABall::Init() 01:07:57 - Выносим сущность платформы в класс AsPlatform 01:29:33 - Рефакторим имена членов данных платформы 01:32:38 - Popcorn_13.zip: пишем код 01:32:50 - Выносим сущность рамки в класс AsBorder 01:40:26 - Рефакторим имена методов 01:43:00 - Подводим итог рефакторинга класса движка 01:43:46 - Popcorn_14.zip: пишем код Popcorn_11.zip https://drive.google.com/open?id=1eXtYryEBoauBjJXsL-tgI3G92smqqwzS Popcorn_12.zip https://drive.google.com/open?id=1txBSML3A1G6My_xdoqaYK6I7uEIBuAsF Popcorn_13.zip https://drive.google.com/open?id=1UfHvgeoV8hvOQfehlK0VU4mG56oMnWaV Popcorn_14.zip https://drive.google.com/open?id=17k7rLh-yEYs8HCAzkHAZSQOuS-iVRUfg

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

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

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

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

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

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

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

mobile menu iconКакой формат видео "Базовый курс С++ Часть #15. Рефакторинг сложного класса" выбрать?mobile menu icon

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

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

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

mobile menu iconКак скачать видео "Базовый курс С++ Часть #15. Рефакторинг сложного класса" на телефон?mobile menu icon

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

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Базовый курс С++ Часть #15. Рефакторинг сложного класса"?mobile menu icon

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

mobile menu iconКак сохранить кадр из видео "Базовый курс С++ Часть #15. Рефакторинг сложного класса"?mobile menu icon

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

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

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