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

Скачать "A'21-MK3. The Cpp Skies"

input logo icon
Теги видео
|

Теги видео

C++
GameDev
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:01
так давайте попробуем разобраться в чем
00:00:06
мы будем сегодня заниматься нам надо
00:00:08
сделать несколько вещей я все таки хочу
00:00:11
сделать
00:00:13
baci рендеринг про который я говорил в
00:00:16
прошлый раз
00:00:18
так вот он наш проект
00:00:20
общей идеи заключается вот в чем что
00:00:23
когда мы
00:00:25
рендерим картинку
00:00:31
мы на каждый символ вызываем системный
00:00:35
вызов текст out это не очень хорошо ну и
00:00:37
в целом когда
00:00:41
рендерит что-то стараются минимизировать
00:00:45
количество системных вызовов и
00:00:48
переключение состояния а если у нас
00:00:50
внимательно посмотреть на вот эту нашу
00:00:52
реализацию render screen у нас
00:00:55
получается так что для каждого символа
00:00:57
мы вызывает переключение состояния
00:01:00
рендерера да хотя render.ru нас принципе
00:01:03
тривиальной к дайны но тем не менее то
00:01:05
есть мы вызываем текст color & bk color
00:01:08
даже когда этого делать не нужно и это
00:01:11
тоже лишний системный вызов это тоже
00:01:13
лишняя нагрузка которая в целом не нужно
00:01:16
ну и далее у нас есть вызов текст out но
00:01:19
тоже это делаем на каждый символ
00:01:21
соответственно это тоже не очень хорошо
00:01:23
поэтому мы бы хотели минимизировать
00:01:25
количество системных вызовов и
00:01:27
переключений состояния за счет того что
00:01:29
мы будем объединять символы с одними и
00:01:32
теми же атрибутами в башню то есть
00:01:34
какой-то буфер и
00:01:36
будем переключать контекст в уточнении
00:01:39
контекст и переключать состоянии
00:01:41
контекста вот этого рисования только в
00:01:43
тот момент когда у нас действительно это
00:01:45
нужно то есть появляются новые атрибуты
00:01:47
и то же самое мы будем вызывать текста у
00:01:50
только один раз они много раз все таки я
00:01:52
хочу а ты взял далее кстати обратил
00:01:54
внимание что
00:01:56
возможно даже невозможно совершенно
00:01:59
точно у меня все ресурсы на фпс сжирает
00:02:02
кодирование дух видеопотоков то есть
00:02:04
если я запускаю
00:02:05
нашу штучку без
00:02:08
обвеса и без дискорда у меня получается
00:02:11
как раз 60 fps так что в целом все не
00:02:13
так плохо но заодно посмотрим вот эта
00:02:15
оптимизация даст нам что-нибудь или нет
00:02:17
так далее это вы сейчас очень быстро
00:02:20
сделан тут проблем не далее пока его тут
00:02:22
писал использую всякие прикольные фичи и
00:02:25
из sea дрозд ринке о том сделал очень
00:02:28
хороший бак причем я даже про него
00:02:31
написал в ту ду я хотела спросить что
00:02:34
это за баг но я сам папа написал поэтому
00:02:37
сейчас мы все-таки выясним в каких
00:02:40
ситуациях этот баг может быть мы его
00:02:44
пофиксим ну и плюс ко всему надо сразу
00:02:46
сделать клиппинг то есть чтобы у нас
00:02:49
получается если строка слишком длинные
00:02:51
на какой-то строке она будет
00:02:53
переноситься на следующую вот в этом
00:02:55
самом screen буфере
00:02:57
это тоже не очень хорошо поэтому сейчас
00:03:00
тоже поправим сделаем обрезание по
00:03:02
границе x так ну и кроме того тоже было
00:03:07
бы неплохо
00:03:08
так это у меня где-то было в драйвере на
00:03:11
все таки занести вот эту вот самую штуку
00:03:13
в счетчик fps of я тут тоже не писал
00:03:16
туду это можно сделать сейчас может
00:03:18
делать потом но в принципе то же время
00:03:20
немного незаметно заодно можно сразу же
00:03:22
сделать счетчик для дельты
00:03:25
которым мы будем передавать в gamestop
00:03:28
для того чтобы вызывать апдейт так это
00:03:32
первая половина наших планов вторая
00:03:34
половина наших планах надо уже сделал
00:03:36
загрузку игрового мира мы как раз
00:03:38
подумаем как бы мы хотели этот самый
00:03:40
игровой мир хранить
00:03:42
просто для того чтобы было его удобно
00:03:44
представлять и чтобы его можно было что
00:03:48
то с ним делать дальше играть в игру так
00:03:52
поехали давайте сначала сделаем
00:03:54
matching потом сам вот этот неприятную
00:03:58
проблему надо будет исправить так как
00:04:02
будет выглядеть бочонку нас
00:04:10
значит мы будем все точно также получать
00:04:15
атрибуты pg pg но помимо этого нам
00:04:18
потребуются атрибуты текущие кстати
00:04:21
поскольку мы выводим это делать их стал
00:04:23
там в одну строку то получается так что
00:04:27
в любом случае на
00:04:30
строки у нас так или иначе будет
00:04:34
вызываться текст out но возможно не
00:04:36
будет вызываться переключение контекста
00:04:38
если она не нужно да а
00:04:41
ну по столбцам соответственно этот batch
00:04:44
надо собирать так ладно сейчас
00:04:46
что-нибудь напишем как бы это выглядело
00:04:49
итак нам нужны две переменные
00:04:52
назовем его курсы gbb
00:04:55
в начале цикла мы естественно возьмем их
00:04:59
из левого верхнего угла буфера
00:05:03
таким вот образом
00:05:05
так г и б.г.
00:05:23
так вот так и здесь
00:05:26
б.г. далее
00:05:29
б.г.
00:05:32
далее
00:05:35
что мы делаем вот здесь так здесь мы
00:05:39
пока ничего не делаем а вот здесь мы
00:05:42
делаем следующее мы получаем точно также
00:05:47
следующие атрибуты кстати нам бы надо их
00:05:51
еще и установить да потому что мы будем
00:05:53
переключать только в случае если они
00:05:55
будут
00:05:57
меняться поэтому изначально мы установим
00:06:01
до цикла то может быть это можно сделать
00:06:04
и
00:06:09
на самом деле можно то есть вот это дело
00:06:12
мы можем инициализировать в какой-нибудь
00:06:15
значение которое совершенно точно не
00:06:17
будет у нас вот так так к стенам здесь
00:06:19
мы сделаем минус 1 и минус 1
00:06:23
здесь мы сделаем вот так далее мы их
00:06:26
получим в г и п г и теперь мы делаем так
00:06:30
это понятно сорта оставляем теперь
00:06:33
делаем переключение контекста так если
00:06:36
значит
00:06:37
кур б-г не равно п.г.
00:06:43
тогда сет baco color
00:06:52
не обновить
00:06:57
тоже самое делаем со в г
00:07:02
если
00:07:07
г.г.
00:07:14
тогда текст color
00:07:19
соответственно кур
00:07:21
присвоить фгм
00:07:24
так теперь нам нужно собрать этот самый
00:07:27
батч
00:07:29
так для хранения бача мы будем
00:07:32
использовать буфер у нас будет какая-то
00:07:35
максимальная длина мы ее сделаем 255
00:07:38
всегда делаю когда не знаю какую длину
00:07:42
сделал 255 на самом деле можно этот
00:07:44
буфер там как-нибудь динамически за
00:07:47
аллоцировать но мы этого делать не будем
00:07:48
мы просто будем знать что у нас есть
00:07:51
максимальная длина бача кстати как там
00:07:55
константа объявлял tefal нами или как
00:07:58
или как опять по-разному или конском
00:08:00
через комп то мы писали то есть что то
00:08:04
такое
00:08:08
макс патч
00:08:12
255 так вот
00:08:16
здесь у нас будет буфер
00:08:27
в принципе мы его для этого символа вот
00:08:30
я тут тоже написал что мы можем раз у
00:08:32
нас есть тут вот этот padding on юст мы
00:08:35
можем тогда просто символ сделать 2
00:08:37
байтовые и в принципе это будет наверное
00:08:40
лучше да
00:08:42
мы все равно будем использовать младший
00:08:45
байт но тем ни менее так что про это
00:08:47
дело можно тоже подумать
00:08:50
ладно пока тип для чего это важно потому
00:08:54
что сейчас я там начнут писать везде эти
00:08:56
типы и для того чтобы
00:08:58
потом в случае чего если вдруг решим
00:09:01
изменить тип не переправлять его везде
00:09:03
можно сделать сверху т.д. то есть типа
00:09:05
pdf
00:09:07
чар какой-нибудь с чарте да и везде его
00:09:11
использовать
00:09:19
либо можно воспользоваться синтаксисом
00:09:22
using это новый синтаксис все + +
00:09:25
означает примерно тоже самое так
00:09:29
через черт м
00:09:32
таким вот образом это будет типа
00:09:38
тот код символа который нам нужен
00:09:45
так вот значит бат и размер этого baci у
00:09:50
нас макс batch
00:09:59
куда я нашел
00:10:02
так теперь он нужен сайт этого бачок
00:10:11
часа из пока ничего нет так и начинаем
00:10:16
накапливать и
00:10:19
так и так
00:10:23
переключаем контекст сейчас подумают в
00:10:26
какой-то момент надо будет этот матч
00:10:29
сбрасывать так почитай за знать почесали
00:10:33
снуда принципе этого нам достаточно то
00:10:35
есть его сбрасывать надо будет очевидно
00:10:37
вот здесь и очевидно после того ну
00:10:40
вернее до того как мы там что ты
00:10:42
переключились надо будет еще и вывести
00:10:44
то что есть в буфере сейчас я пока
00:10:47
напишу ну как бы тривиально да потом мы
00:10:50
это дело приведем адекватное состояние
00:10:52
так значит что мы сделали давайте мы
00:10:56
сразу же будем добавлять в буфер
00:11:00
тот символ который есть так значит в
00:11:04
patch
00:11:07
патч
00:11:09
says
00:11:12
вот тут можно плюс плюс сразу написать
00:11:15
так вот плюс плюс присвоить
00:11:19
символ из буфера
00:11:23
вот наш символ
00:11:26
kontrol ц control-d так
00:11:31
теперь
00:11:33
пока
00:11:36
значит у нас совпадают
00:11:41
размеры так не размер потому совпадают
00:11:44
атрибуты нам больше ничего делать не
00:11:45
надо мы там перейдем в следующий
00:11:57
к следующему символу а
00:12:01
выводить нам нужно случае когда у нас
00:12:09
так
00:12:12
выводить нам нужно вот в каком случае
00:12:15
давайте вот здесь этом напишу итак если
00:12:19
у
00:12:22
нас не совпадает background курбе g6
00:12:28
похоже там ладно так если кур богини
00:12:31
рагну б.г.
00:12:34
они все будет хорошо или то есть у нас
00:12:38
сменился атрибут и соответственно мы
00:12:40
будем устанавливать новый атрибут так
00:12:43
кур fg не равно и в год и
00:12:48
все вот это вот дело
00:12:53
я значит вот так вот его объединю и
00:12:58
что-то в бочче есть
00:13:01
больше нуля тогда надо этот самый батч
00:13:05
напечатать
00:13:09
процесс
00:13:11
контроля
00:13:12
так выводим значит ах тыж какой провал
00:13:17
надо еще помнить но мы знаем что бачу
00:13:20
нас по строке поэтому же нас устроит но
00:13:22
вот и нам нужно запоминать да с какой
00:13:26
позиции мы начали
00:13:29
этот самый патч поэтому мы напишем
00:13:34
ботекс
00:13:36
присвоить 0
00:13:40
так
00:13:42
значит когда мы начнем новый патч мы
00:13:45
заполним
00:13:47
все значит мы выводим
00:13:50
наши патч
00:13:54
выводим его baci союзом
00:14:00
таким вот образом
00:14:02
далее после того как мы что-то вывели
00:14:05
нам нужно
00:14:10
сбросить batch says
00:14:15
почесали сбросить батик
00:14:22
не установить этот самый бэд пигс
00:14:25
и вот так вот
00:14:32
и
00:14:38
[музыка]
00:14:39
дальше начинать накапливать новый
00:14:42
батчатом мы как раз записываем этот
00:14:44
самый символ у которого уже другие
00:14:46
атрибуты
00:14:47
далее мы
00:14:50
переключаем bk color если надо
00:14:52
переключаем текст color и продолжаем
00:14:55
этот самый батч
00:14:57
накапливать вот это вот текст out нам не
00:14:59
нужен но
00:15:02
нам нужно проверить что после того как
00:15:05
мы завершили строчку мы
00:15:08
не должны ничего вывести а может быть
00:15:12
даже не строчку а стал так мы все это
00:15:16
делаем по строкам да значит мы будем до
00:15:19
выводить именно строку потому что у нас
00:15:21
может получиться так что
00:15:23
мы
00:15:25
дошли до конца строки атрибуты не
00:15:28
сменились но нам все равно надо эту
00:15:30
строчку допечатать потому что следующий
00:15:32
следующий в следующей строке у нас будет
00:15:34
начинаться новый патч то есть после того
00:15:36
как мы прошлись по этому циклу мы должны
00:15:38
допечатать остатки а остатки мы можем
00:15:42
узнать вот таким вот образом
00:15:43
если бы от часа из больше нуля тогда
00:15:46
надо сделать текст аут все
00:15:53
так и теперь сбрасывать нам его не нужно
00:15:56
потому что мы период началу блока и тут
00:15:58
у нас все сбросится так единственное
00:16:01
здесь есть подстава связанные с тем что
00:16:04
у нас есть ограничение этого буфера если
00:16:06
у нас будет слишком большой экран мы
00:16:08
точно так же вылетел за его пределы и
00:16:10
поэтому там нужно поставить вот такой
00:16:13
вот условие и значит почесать больше
00:16:17
гулять или
00:16:19
бориса из
00:16:35
только не тут
00:16:38
это первая половина условия то есть мы
00:16:41
должны выводить в случаях когда у нас
00:16:43
сменились атрибуты и есть что-то в бача
00:16:46
либо абсолютно без каких-либо
00:16:50
дополнительных условий если у нас буфер
00:16:53
готов переполнится
00:16:55
если б щас аес равен но я обычно кстати
00:17:00
в случаях когда он равен пишу больше ибо
00:17:02
равно хотя знаю что он всегда раввину
00:17:04
так вроде как
00:17:06
типа надежнее
00:17:09
вот так вот то есть когда размер baci
00:17:12
будет больше чем мог спать ну либо когда
00:17:15
вот вся вот эта вот история
00:17:17
надо подумать нельзя ли за
00:17:19
оптимизировать это логическое выражение
00:17:21
но наверное как то можно
00:17:24
по применять логические законы подумать
00:17:28
над чем-нибудь
00:17:30
так ничего выглядит вроде логично
00:17:38
давайте посмотрим как это все не
00:17:41
работает
00:17:44
запускаюсь
00:18:14
так
00:18:16
начинаем рендеринг
00:18:26
что есть ощущение что поставку отключили
00:18:29
аппаратную скорее нет стола все
00:18:30
тормозить еще больше
00:18:33
так вот тебе его секрет для сколько их
00:18:36
там так у нас есть какие-то
00:18:39
атрибуты для foreground ип игра undo на
00:18:42
самом деле дефолтные атрибуты
00:18:45
окей так смотрим сейчас починит и можно
00:18:50
посмотреть буфер в котором это batch
00:18:51
хранится вот он он заполнен каким-то
00:18:53
мусором на самом деле этот мусор вот это
00:18:55
буква н нам составляет туда
00:19:00
грубо говоря отладчик они грубо говоря
00:19:02
но до башни конфигурация там
00:19:04
генерируется код который инициализирует
00:19:06
буфер вот таким мусором чтобы можно было
00:19:08
его
00:19:09
более удобно отслеживать до что это
00:19:13
действительно инициализированная память
00:19:15
так но и всем и значит трассируем бочче
00:19:17
нет ничего не происходит мы начинаем
00:19:19
накапливать в этот патч символы и вот
00:19:22
тут вот видно но как бы видно ног плохо
00:19:24
что первый символ которую мы поместили
00:19:27
это символ пробела потому что у нас в
00:19:30
буфере хранится символ пробела
00:19:32
сделать нагляднее вот таким вот образом
00:19:35
ну собственно вот этот символ пробела с
00:19:37
кодом 20 как раз лег в память буфера до
00:19:41
по которой на который выделен под борщ
00:19:44
но и вот этот самый цвет и так далее да
00:19:47
это как раз нам отладчик но или точнее
00:19:50
набожная конфигурация заполняет этот
00:19:52
буфер чтобы мы могли действительно
00:19:55
убедиться что это память мы еще и и
00:19:58
никаким образом не инициализировали не
00:19:59
потрогали так теперь устанавливаем цвет
00:20:03
фона устанавливаем цвет текста и
00:20:08
начинаем накапливать символы в баччан
00:20:12
так я наверное с mamrie опять
00:20:14
переключусь в
00:20:16
блок хаус лучше
00:20:19
так поехали трассируем значит наше
00:20:23
сердце все стоит накапливаем символы но
00:20:25
мы их будем накапливать на самом деле ты
00:20:28
позеленение потому что первая строка у
00:20:30
нас там по моему стоит то ли 100 или 120
00:20:34
символов вся ширина этого на и
00:20:37
первая строка это целиком пробел поэтому
00:20:40
просто будем наш буфер накапливать
00:20:42
пробелы и при этом до мы не будем
00:20:45
вызывать системные не какие вещи для рисования то
00:20:48
очень хорошо то есть мы сразу же
00:20:50
поставим point на текст out и
00:20:55
посмотрим что у нас есть в буфере а в
00:20:58
буфере у нас ну вот тут видно энное
00:21:01
количество пробелов да далее у нас есть
00:21:04
батч x этаноле у нас есть длина этого
00:21:08
бача 10
00:21:11
что почему 10
00:21:15
что там действительно 10 пробелов
00:21:20
так кто memory
00:21:25
что есть ощущение что это не 10
00:21:28
почему-то 10
00:21:37
загадка сейчас будем разбираться почему
00:21:40
10-ом оба час где-нибудь трогаем нет не
00:21:43
трогаем
00:21:51
vpx ладно сейчас посмотрим странная
00:21:55
история
00:21:56
так все не печатали этот самый текст
00:22:00
сбросили бочки с
00:22:04
бочче x и
00:22:08
опять пошло накопление символов а
00:22:13
кстати мы можем посмотреть чем у нас нет
00:22:16
и равно тоже 10
00:22:17
так и в какую строчку эту так сейчас у
00:22:21
меня же равно
00:22:25
да все правильно потому почему так
00:22:29
произошло кто-нибудь может объяснить
00:22:34
есть идеи
00:22:44
почему меня вот на этом бред pointy на
00:22:47
котором я сейчас остановился
00:22:50
было значение 10 для буфера хотя я
00:22:53
ожидал там вы видитесь другое значение
00:22:55
там уже дал увидеть значение 120 час я
00:22:57
покажу откуда что взялось и
00:22:59
так размеры окна мне кажется мы их
00:23:03
задаем в
00:23:05
вот здесь окно стон на 80 то есть первый
00:23:09
матч поскольку у нас размер бача 255 ну
00:23:12
понятно что будет
00:23:15
это число меньше чем 10 55 поэтому вся
00:23:19
первая строка сразу попадет в первый
00:23:21
матч она вся будет с одинаковыми
00:23:23
атрибутами ну и для того чтобы было
00:23:25
понятнее рассуждать надо знать чем мы
00:23:28
рисуем рисуем вот такую штуку в строке
00:23:31
10 10 мы пишем строчку с каюсь . 10
00:23:34
потом начиная там с 12
00:23:37
12 строки томска кого-то столбца с 10 ну
00:23:40
на самом деле с 11 из 10 мы печатаем
00:23:43
таблицу символов и
00:23:45
я когда вот это дело
00:23:48
трассировать так вот здесь вот да я
00:23:52
ожидал что я здесь увижу длину что
00:23:55
потому что типа batch накопился да но
00:23:58
увидел длину 10 есть идея почему 10 они
00:24:03
100
00:24:12
тишина единит дело в том что поскольку у
00:24:15
нас вся первая строка была одними и теми
00:24:18
же атрибутами на самом деле первая
00:24:20
строка бываю и
00:24:21
соответственно вот этот эта ветка просто
00:24:24
не выполнялось да и вся первая строка
00:24:26
выводилось вот этими текстами и сюда мы
00:24:30
попали только в тот момент когда
00:24:32
осуществилась изменение атрибутов до
00:24:34
переключились атрибуты а атрибут у нас
00:24:37
действительно переключились только в 10
00:24:40
строке начиная с 10 там столбца ну
00:24:43
точнее с 11 до и поэтому там вирусу
00:24:45
количество символов 10 которые мы
00:24:47
накопили не в котором было вот это вот
00:24:50
сказать другой вопрос а почему в буфере
00:24:54
то 100 символов
00:24:58
откуда вот эти 100 символы взялись в
00:25:01
буфере
00:25:10
а 100 символов буфере взялись очевидно
00:25:13
из
00:25:15
предыдущей итерации цикла поскольку мы
00:25:17
этот буфер не перетираем но компилятор
00:25:19
такого разместил и все время мы с этим
00:25:22
будь то есть мы вы не перенесли зиру и
00:25:24
мда каждый раз и мы все время работаем с
00:25:25
одним и тем же буфером у нас получилось
00:25:28
что мы на первом проходе накопили вот
00:25:30
эти вот символы пробелов ну собственно
00:25:32
они там так и остаются вы же управляем
00:25:34
только размером как бы текущем
00:25:38
так окей продолжаем
00:25:44
трассировать и так что настал получается
00:25:47
установили цвет бэкграунда установили
00:25:50
цвет текста то посту сменился и цвет
00:25:53
background ведь цвет текста это вот
00:25:56
видно вот отсюда собственно да мы
00:25:58
печатаем вот bright yellow
00:26:00
помогите
00:26:02
прекрасный дизайн естественно да вот эту
00:26:04
строчку скайс так смотрим
00:26:11
так
00:26:13
сейчас мы будем накапливать в патч эту
00:26:17
строчку вот тут видно что уже появился
00:26:19
символ 53 появился символ 6b давать
00:26:22
посмотрим на них более адекватно вот они
00:26:25
с к и
00:26:26
так далее я дальше трассировать не буду
00:26:29
до следующей остановки здесь и вот здесь
00:26:32
я на как раз накопил строчку обратите
00:26:34
кстати внимание тоже как выглядит этот
00:26:36
буфер да то есть действительно то что я
00:26:39
сказал что у нас постоянно содержимое
00:26:41
остается от предыдущих итераций и
00:26:43
действительно она остается но печатать
00:26:45
мы будем только столько сколько нам
00:26:47
нужно да нам нужно 8 символов это вот
00:26:50
эта строчка сказать . 1 и так далее
00:26:53
можно для проверки вот поставить брак
00:26:56
point сюда и посмотреть
00:26:58
что там будет а будет все хорошо да то
00:27:01
есть мы печатаем собственно вот этот вот
00:27:05
буфер но тут видно вот в такую позицию
00:27:08
ножи у нас есть почитать у нас вон какой
00:27:11
большой да это собственно сколько 82 это
00:27:15
минус 100 минус 10 до и минус 8 то есть
00:27:19
минус 1 batch которой первые 10 probe в
00:27:22
минус большой который написан scaife
00:27:24
все оставшиеся пробелы которые идут
00:27:27
одним и тем же цветом
00:27:29
так
00:27:30
conti мы
00:27:34
вроде бы работает
00:27:37
все отлично и кстати заметьте как сразу
00:27:40
заросла производительность тогда то есть
00:27:42
если в прошлый раз у меня была на стриме
00:27:46
когда там включены все эти кодирование
00:27:48
видео и так далее там каких-то 14 fps
00:27:51
дата вот сделал в бочонке я сразу
00:27:54
поднялся down the вашей он не понятно
00:27:57
откуда у 65 fps что экономический там
00:27:59
завлечь мониторе всяких но тем ни менее
00:28:01
до
00:28:03
производительность просто выросла в
00:28:05
разные теперь мы можем чувствовать себя
00:28:08
мастерами оптимизации datsun сразу
00:28:12
делаем вывод какой что количество кода
00:28:14
который мы подписали на самом деле она
00:28:16
абсолютно никак не коррелирует с
00:28:18
производительностью казалось бы мы
00:28:20
раньше делали меньше действий сейчас мы
00:28:22
делаем действия там просто на порядок
00:28:23
больше да но за счет того что мы снизили
00:28:25
количество системных вызовов и системный
00:28:28
вызов он сам по себе очень дорогой но
00:28:30
тут правда надо разбираться насколько он
00:28:33
дорогой да то есть может оказаться что
00:28:35
есть переключение контекста из юзеров
00:28:38
kernal а может оказаться что его общем
00:28:40
то тут и нет да то есть часть гадая
00:28:42
работает в user моде но это надо читать
00:28:44
документацию погадай я подозреваю что
00:28:47
она все-таки есть потому что вот как они
00:28:49
пишут документации что у них bitmap и
00:28:51
находится типов апертурной память
00:28:54
видеокарта и соответственно вам в любом
00:28:56
случае когда вы что-то там с этим bitmap
00:28:58
он делает надо в какой-то момент перейти
00:29:00
в режим бедра чтобы в эту память что-то
00:29:03
записать ну из то есть сам по себе этот
00:29:06
вызов дорогой да ну и естественно
00:29:09
процедуры в саванне дорогая да и
00:29:11
поскольку мы вот так вот уменьшили
00:29:13
количество системных вызовов и уменьшили
00:29:15
количество процедур рисования мы
00:29:16
соответственно очень хорошо вы играли в
00:29:19
производительности так теперь давайте
00:29:21
пофиксим вот этот баг
00:29:24
кто-нибудь может сказать что это за баг
00:29:26
и что вообще такое зовут за выход за
00:29:29
границы массива
00:29:34
мы вы ели допустим массив на 100
00:29:38
элементов определенного размера
00:29:40
пишем допустим 101 так и еще не
00:29:44
исключение может выпасть
00:29:47
когда мы будем писать 909 даже элемент
00:29:50
то есть все может быть нормально пока мы
00:29:52
там пишет даже
00:29:53
101 102 и 103 потом будет ошибка смысле
00:29:58
очень долгое время и к чему это может
00:30:01
привести к
00:30:04
падению программ и это в лучшем случае о
00:30:07
худшем
00:30:09
записать что-то вредное туда куда не
00:30:11
стоит а в самом худшем случае это
00:30:17
кодекс акишин дата есть если у нас худых
00:30:21
запиши на здесь не будет по той простой
00:30:22
причине что у
00:30:24
нас этот буфер лежит в динамической
00:30:27
памяти и мы просто порушим динамическую
00:30:29
память и нашу программу так или иначе
00:30:31
упадет потому что руб когда менеджер
00:30:33
динамической памяти там начнется не
00:30:35
как-то работать он будет работать уже с
00:30:38
неправильными структурами это такая
00:30:39
большая проблема а
00:30:41
если бы мы распределили в буфер на стыке
00:30:44
то тогда на стыке хранится помимо вот
00:30:48
локальных данных функций до этого то что
00:30:50
мы вчера с вами рассматривали на стыке
00:30:52
еще хранится адрес возврата если вы
00:30:54
локальные данные функции запишите
00:30:56
какой-то код кнута есть коды инструкции
00:30:59
до процессора и перетрете адрес возврата
00:31:01
таким образом чтобы возврат осуществился
00:31:05
не туда куда нужно а вот в этот код
00:31:07
который вы понаписали там тоже с этим
00:31:09
есть определенные проблемы но тем не
00:31:11
менее это возможно сделать да вот тогда
00:31:13
у вас будет еще и кодек execution с
00:31:16
проблемами там есть то что у
00:31:22
процесса есть механизма защиты и вы
00:31:24
можете сказать какая память будет пройти
00:31:26
был какой арина была какая экзо пьют обл
00:31:28
если вы попробуйте сделать возврат на
00:31:31
них zacuto был память соответственно вас
00:31:33
ничего не получится вы получите там
00:31:35
системно исключение но
00:31:36
разными хитрыми методами да вот windows
00:31:39
и можно я напрямую менять защиту у
00:31:41
страниц если у вас есть к ним доступа
00:31:44
вот наверно доступ будет через virtual
00:31:45
protect ну и так далеко ли смысл такой
00:31:47
что это супер неприятный баг это супер
00:31:51
уязвимость и надо всеми средствами с ней
00:31:55
бороться и кстати вот вся эта история с
00:31:58
контейнерами stels с операторами фуры
00:32:01
что мы всеми прочими это одна из попыток
00:32:04
с этим побороться потому что вы
00:32:07
перестаете вручную управлять размерами
00:32:09
буферов вы перестаете вручную управлять
00:32:12
границы этих буферов да и как-то коли
00:32:15
вероятность совершить ошибку меньше я
00:32:17
тут супер на выпендривался синтаксисе
00:32:20
плюсов да это кстати одна точнее даже
00:32:23
это чистый си скорее чем плюсы но тем не
00:32:25
менее и это вот одна из причин так
00:32:27
никогда не делайте писать всегда
00:32:29
максимально вдумчивые правильно да и вот
00:32:33
эту проблему я
00:32:35
словил а в каком случае она у меня будет
00:32:37
проявляться она кстати будет появляться
00:32:39
не всегда а только в каком-то конкретном
00:32:43
есть идея vk.com
00:32:52
когда-нибудь встреч не терминальный
00:32:54
символ
00:32:55
нет терминальным и да мы считаем что
00:32:58
строка у нас терминальный символ понятно
00:33:01
то есть если нам передадут неправильную
00:33:02
строку да это будет беда но мы считаем
00:33:05
что нам строку передали правильно
00:33:12
тут для того чтобы это понять надо
00:33:14
представить как вообще выглядит экранный
00:33:16
буфера у нас
00:33:18
я нарисую вот у нас есть
00:33:25
корсет рисовал экранный буфер до
00:33:30
штуку да вон его рисовал
00:33:36
эту который города чем дико тормозит и
00:33:39
нам придется
00:33:42
ее
00:33:43
сменить так вот кран и буфер выглядит у
00:33:46
нас вот таким вот образом причем мы его
00:33:48
в явном виде храним линейно на самом
00:33:51
деле там можно было попытаться сделать
00:33:52
эти подвальную массив и его
00:33:54
индексировать по двум индексом он бы
00:33:57
точно также бы хранился линейно по
00:33:58
строкам но мы решили это сделать вручную
00:34:01
и мы там использовали как я сказал типа
00:34:04
схему гор города для вычисления индексов
00:34:06
может не сказал но говорю так и у нас
00:34:09
получается так что в памяти у нас этой
00:34:12
штуки лежит вот таким вот образом
00:34:13
сначала лежит первая строка за ней то
00:34:16
есть вот она первая строка сразу за ней
00:34:18
лежит вторая строка потом лежит третья
00:34:21
строка и так далее и как мы начинаем
00:34:23
что-то в этот буфер выводить мы просто в
00:34:25
соответствующей ячейке этого буфера да
00:34:28
вот например начинаем печатает строчку
00:34:30
хеллоу и теперь то что я сказал что
00:34:33
хотел сделать и там под горячую руку
00:34:35
забыл соответственно у нас есть у этого
00:34:38
буфера вот это не писал до ширина и
00:34:41
высота и как я хочу чтобы когда символы
00:34:45
когда строка которую мы вводим перестала
00:34:48
умещаться по широте чтобы вывод
00:34:50
прекратился сейчас этого не происходит а
00:34:53
поскольку у нас буфер лежит в памяти вот
00:34:54
так вот линеарис ово на по строкам мы
00:34:56
просто будем продал вводить символы
00:34:58
следующую строку то есть тут будет
00:35:00
выведен пробел тут будет выведен world и
00:35:03
в принципе это проблема не является до
00:35:06
тех пор пока длина строки и позиция
00:35:09
печати данный пример я строчку hello
00:35:11
world за хочу напечатать вот здесь
00:35:13
начиная с этой ячейки не окажется
00:35:17
слишком близко к концу да и вот эта
00:35:19
строка не станет длиннее чем где навсего
00:35:21
буфера и вот когда это произойдет
00:35:23
соответственно там символы хлоя
00:35:24
напечатаю правильно ну там был о а вот
00:35:29
пробелы world уже начнут перетирать то
00:35:32
что находится за моим буфером и вот это
00:35:34
вот и есть буфер или ram напишем это
00:35:37
красным и поставим !
00:35:45
бунт все это очень большая проблема так
00:35:50
делать естественно никогда не надо и
00:35:51
поэтому сейчас вот эту проблему решим
00:35:54
кардинально кардинально это значит
00:35:57
так
00:36:02
просто легко заметить что проблема
00:36:06
обрезания по широте она автоматически
00:36:09
решит и проблему теперь перетираем этого
00:36:12
буфера до поэтому одно и то же решение
00:36:15
она нам
00:36:16
все сделает так и
00:36:19
[музыка]
00:36:20
как мы ее решим ковались какие den
00:36:30
ну первая идея вот так конечно писать
00:36:33
круто но не надо да лучше написать так
00:36:38
чтобы было понятно
00:36:39
я сейчас думаю стоит лет менять не стоит
00:36:44
такая себе история давайте мы это все
00:36:46
таки поменяем и так как мы это значит
00:36:50
будем делать не будем
00:36:52
50 действий объединять в одно и так
00:36:58
чар c присвоить разыменования р и далее
00:37:03
мы все наши указатели будем
00:37:07
увеличивать
00:37:09
по отдельности мы увеличили это буфер с
00:37:12
увеличили это
00:37:14
понятно что и еще нам нужно иметь
00:37:19
ну что-то для переменной x поскольку x
00:37:23
мы здесь передали по значению я имею
00:37:27
права и и здесь менять то как мы это
00:37:29
делали и буду продолжать это делать до и
00:37:32
так x тоже
00:37:35
плюс
00:37:36
присвоить
00:37:38
чего плюс присвоить один и
00:37:44
здесь мы поставим условиям и так если
00:37:47
чар цех
00:37:50
но понятно не 0 и
00:37:53
x меньше а меньше строго да потому что
00:37:58
вид сам
00:38:01
вот таким вот образом все
00:38:04
стало чуть-чуть попроще стала менее
00:38:11
выворотно
00:38:13
по-английски фэнси да но стала зато
00:38:16
сильно понятней но на самом деле можно
00:38:18
было все это записать естественно типа
00:38:22
как в одну строку а можно поскольку у
00:38:24
нас тут происходит несколько вещей
00:38:26
давайте мы все таки полухин сила пишем
00:38:29
скажем так опалу пенсии будет это
00:38:32
выглядеть
00:38:33
как-то так и так
00:38:36
черт c присвоить с больше не цитировать
00:38:40
ничего не надо ставим точку запятой
00:38:43
условия выхода
00:38:53
c&c не равно
00:39:02
нулю это как раз 0 терминатору строке и
00:39:06
x меньше чем ktx вид и все вот эти вот
00:39:11
штуки надо перенести в
00:39:17
конец так значит
00:39:21
плюс тут можно и так не писать + + + + +
00:39:29
да что ж такое-то + + s ii plus + x
00:39:36
помните мы говорили до что for это та же
00:39:39
самый файл только записаны вот так вот
00:39:42
теперь надо подумать а вообще нужен ли
00:39:44
нам символ c на самом деле похоже что не
00:39:47
нужен поэтому мы можем сразу же
00:39:49
манипулировать и сам да поэтому я сделаю
00:39:52
вот так вот control его скопирую сюда
00:39:55
весь инициализатор я удалю нам на
00:39:58
инициализации похоже делать ничего не
00:40:00
нужно и здесь мы перепишем вот в таком
00:40:03
вот виде
00:40:05
так
00:40:08
но вроде бы не знаю насколько стало
00:40:12
лучше с точки зрения понятности но вроде
00:40:15
бы проблему с переполнением буфера мы
00:40:17
исправили давайте мы это проверим
00:40:19
поскольку у нас там 100 символов я
00:40:21
подвину skype на
00:40:24
какую на примерно
00:40:27
90 шестую позицию до чтобы что-то там
00:40:31
удалилась так 96 позиция
00:40:35
запускаемся
00:40:55
но
00:40:56
похоже на правду да то есть вот моей
00:41:00
скайс собственно четыре символа я вижу
00:41:04
но оставшиеся символы туда уехали из ели
00:41:07
с буфером отлично так последнее усилие
00:41:11
которое надо сделать вот это был супер
00:41:14
неприятный баг очень опасный дает всегда
00:41:16
надо следить за размерами жиров и за тем
00:41:18
что происходит мы для производительности
00:41:22
большинство проверок делаем moser домену
00:41:25
поскольку мы считаем что то там да но
00:41:27
некоторые вещи мы должны также делать и
00:41:32
фронтально то вот такие такие проверки
00:41:35
например но хотя что-то тут тоже можно
00:41:37
наверно перенести в рандом пока делать
00:41:40
не будем далее что мы хотим пофиксить мы
00:41:43
хотим пофиксить счетчик fps я тут в
00:41:45
принципе дар уже набросал какую-то идею
00:41:47
для этого
00:41:48
мы будем считать наверное не каждый раз
00:41:54
вот эти вот фреймы да а один раз
00:41:56
посчитаем
00:41:57
[музыка]
00:42:00
правил фрейм ну и далее по
00:42:05
тому что нужно так делаем значит
00:42:10
я вынесу наверх
00:42:14
он смотрю свой комментарии пойтить не
00:42:17
могу что я там хотел сделать когда это
00:42:19
писал так у
00:42:22
нас будет
00:42:26
почему ты решил их переделать на фрейм
00:42:29
старт и freemind
00:42:31
можно мне кажется и так оставить так все
00:42:35
тут значит мы просим фрейм старт теперь
00:42:38
что происходит в цикле тут уже ничего не
00:42:40
происходит когда фрейм заканчивается мы
00:42:42
просим фрейм and дальше делаем все как
00:42:45
мы делали раньше выводим но и вот он да
00:42:48
прав равно and то есть после того как
00:42:53
произошло вот это все
00:42:57
мы присваиваем
00:43:02
самом деле мне кажется это можно сделать
00:43:04
прекрасные вот здесь
00:43:11
потому что здесь действие по факту
00:43:13
никаких не было дам так что мы делаем мы
00:43:17
делаем
00:43:18
фрейм старт присвоить freemind посмотрим
00:43:21
что из этого получится
00:43:23
старт присвоить flame and
00:43:29
take запускаемся
00:43:44
но так на первый взгляд ничего не
00:43:47
изменилось наверное
00:43:53
хорошего короче оставляем в таком виде а
00:43:56
дальше мы уже кстати забавно да что
00:44:01
частота кадров стала сильно падать когда
00:44:03
я стал сильно дергать мышкой
00:44:06
очевидно происходит это потому что
00:44:08
теперь мы учитываем обработчик мыши и
00:44:11
обработчик сообщений вот в этом времени
00:44:13
это тоже хороший вопрос насколько это
00:44:16
корректно но как минимум это показывает
00:44:18
более
00:44:19
адекватно да то что происходит ладно
00:44:22
оставляем в таком виде и
00:44:25
так
00:44:27
теперь на всяком случае вот это намного
00:44:30
более точно да когда мы будем считать
00:44:33
время для апдейта
00:44:34
таким образом это время будет подсчитана
00:44:36
более точно потому что мы учитываем мы
00:44:38
как бы все процессы которые там
00:44:40
происходят а вот именно для подсчета fps
00:44:42
а может быть ну как бы и не имеет смысл
00:44:44
потому что имеет ладно теперь вот это я
00:44:49
стираю и самое
00:44:52
дельта будем делать когда она нам будет
00:44:54
нужно так самое интересное вот эти вот
00:44:58
вице height по большому счету я тоже бы
00:45:00
хотел отсюда убрать сейчас объясню
00:45:02
почему и
00:45:04
поэтому нам как раз вот game и нет
00:45:07
выглядит так что это имеет делать до
00:45:10
того как мы будем создавать windows и
00:45:12
гей будет как раз и показывать ну
00:45:14
вот эту ширину и высоту так давайте
00:45:17
обсудим то как мы вообще хотим подойти к
00:45:22
созданию игрового мира мы хотим сделать
00:45:26
следующее
00:45:32
в целом наш игровой мир
00:45:41
так
00:45:44
представляет собой
00:45:48
большую
00:45:49
прямоугольную область
00:45:53
какого-то максимального размера
00:45:56
не знаю какой подобрать но давайте мы
00:46:01
условно скажем что это будет допустим
00:46:04
1024 на 1024 в целом нам это абсолютно
00:46:10
не важно сейчас нам это неважно
00:46:12
абсолютно точно но в будущем нам может
00:46:15
быть имеет будет иметь смысл
00:46:17
подредактировать эти величины в
00:46:20
зависимости от производительности до
00:46:23
если вдруг мы там напишем что то такое
00:46:25
что будет супер дико тормозить на такие
00:46:27
ли там супер дико зажигать память на
00:46:29
таких объемах новые этот мир уменьшим но
00:46:33
понятно что в нашем случае вряд ли вот
00:46:35
именно эти размеры это кстати будет
00:46:37
мегабайт до
00:46:38
к чему-то плохому приведу то может быть
00:46:41
и приведут надо с уже смотрите мерить в
00:46:44
любом случае наши тестовые миру будут
00:46:46
сильно меньше далее самое такое ключевое
00:46:50
замечанием прежде из исходя из которого
00:46:53
мы будем все это дело проектировать мы
00:46:56
хотим чтобы наши миры естественно
00:47:00
сохранялись отдельно от программы да
00:47:03
поэтому наш описание нашего мира но мы
00:47:06
назовем естественно левелом как же ты
00:47:09
еще можем назвать
00:47:11
так вот level должен храниться в файле и
00:47:16
так level
00:47:19
is stored
00:47:31
external файл это очевидно ключевое
00:47:35
ограничение
00:47:36
теперь мы начинаем думать так давайте
00:47:39
тоже красную рамочку заключён теперь мы
00:47:43
начинаем думать
00:47:45
какой бы такой формат файла выбрать в
00:47:49
рамках
00:47:51
наших ограничений но прежде чем подумать
00:47:54
над
00:47:55
соответственно форматом файла да давайте
00:47:57
подумаем какие же у нас есть ограничения
00:48:00
как мы говорили все дизайне ци исходя из
00:48:03
них так не буду писать красным не пишу
00:48:05
давайте синим у кого есть какие идеи по
00:48:08
поводу ограничений
00:48:13
он должен должен быть достаточно
00:48:15
непонятно чтобы нельзя быть было его
00:48:17
руками поменять тебя это на самом деле
00:48:21
прямо противоположно тому что я бы хотел
00:48:24
сделать но тут вы правы
00:48:25
на право только отчасти почему потому
00:48:29
что
00:48:33
давайте вот как скажу
00:48:35
если мы будем в идеальном мире ну или мы
00:48:39
будем разрабатывать трайбл и игру
00:48:42
действительно вы бы хотели чтобы эта
00:48:44
игра поставлялась с ресурсами который бы
00:48:48
пользователь не сумел взломать на самом
00:48:50
деле это далеко не всегда 1 как бы как
00:48:54
это первый приоритет
00:48:56
более того есть игры и соответственно
00:48:59
именно поэтому существует моддинг в
00:49:02
которых это не так и вы можете спокойно
00:49:04
расковырять любые ресурсы от игры вот
00:49:06
например 5 герои до которая там сделаю
00:49:09
100 лет назад него ловцы там все ресурсы
00:49:11
хранились в xml в png файлах ну и там
00:49:15
еще в чем то и их можно было супер легко
00:49:17
менять
00:49:19
все для производительности ну точнее не
00:49:22
то чтобы это было удобно распространять
00:49:23
удобно там как-то устанавливать это все
00:49:26
было по сжаты зипом ну то есть
00:49:28
фактически с игрой лежал гигантский zip
00:49:30
файл который вы если раскрывали там пара
00:49:32
вообще все было супер открыто мой те там
00:49:35
не хочу из извлекаете любые ресурсы
00:49:38
пожалуйста и более того движок игры
00:49:41
сначала проверяла нет ли распакованных
00:49:44
каких-то файликов файловой системе если
00:49:46
они были он сначала подхватывал их да
00:49:48
если их там не было он собственно
00:49:50
открывал их из зипа и многие игры так
00:49:52
делают многие движки так делают но и
00:49:54
собственно еще раз моддинг блага работы
00:49:57
ударяет ago но другой стороны есть
00:49:59
blizzard у которых есть все свое там
00:50:01
раньше не были файлы формата mpg который
00:50:03
потом исчез на тоже разломали и
00:50:05
появились инструменты для моддинга но
00:50:07
изначально там это было сложно но то
00:50:09
есть чему это вообще все говорю на самом
00:50:12
деле нас интересует параллельно два
00:50:14
процесса
00:50:16
сбоку на рисунок или
00:50:20
вот так
00:50:21
итак два процесса нас интересует 1 или 2
00:50:26
ситуации это вот
00:50:30
сразу при плиту май как-то надо он про
00:50:33
это тоже говорил если там очень
00:50:35
внимательно слушали так вот первая
00:50:37
ситуация это development он накладывает
00:50:41
свои требования на происходящее
00:50:47
пишет нормально
00:50:49
девелопмент
00:50:53
во время девелопмента мы что хотим от
00:50:56
наших ресурсов файлов и всего прочего
00:51:01
наоборот простота редактирования чтобы
00:51:04
было понятны и просты что там есть
00:51:06
именно так мы хотим чтобы эти файлы были
00:51:10
как вы правильно сказали понятно для
00:51:12
человека он мог любой момент туда
00:51:14
залезть и все что угодно поменять они
00:51:16
должны быть представлены в таком формате
00:51:18
чтобы их было удобно хранить в системе
00:51:20
контроля версий да то есть если вы
00:51:22
что-то поменяли вы это делал закормить
00:51:24
или систему контроля версий у вас
00:51:25
запустился build вы там все построили
00:51:27
его сохранилась истории изменений и там
00:51:30
все остальное что нам дает систем
00:51:31
контроля версий ну и так далее да на
00:51:34
штуцер должен быть какой-то чтобы ему
00:51:36
было удобно с этим форматом работ
00:51:38
бла-бла-бла короче я отсюда вытекает что
00:51:41
большинство ресурсов но как минимум
00:51:44
описательных ресурсов до которым мы
00:51:46
собираемся редактировать они будут
00:51:48
храниться в том или ином текстовом
00:51:49
формате но очевидно сейчас есть два
00:51:52
текстовых формата которые для этого
00:51:55
подходят это либо джейсон либо но тоже
00:51:58
самое только в профиль это яму а
00:52:01
почему именно эти два формата
00:52:08
компактное очень и довольно понятны это
00:52:11
так а еще одно очень важное рассуждение
00:52:15
моментов которые с ними работает да но в
00:52:18
первую очередь есть стандартный парсер
00:52:20
который умеет их читать и писать да ну
00:52:22
там понятно есть библиотеки которые с
00:52:25
ними работаю то есть еще дополнительные
00:52:27
инструменты которые тоже с ними
00:52:28
позволяют удобно работать вам там как бы
00:52:31
минимум на писательство но в нашем
00:52:35
случае поскольку я не хочу эти
00:52:36
инструменты сейчас мы про это скажем не
00:52:38
подключать да я буду пользоваться тоже
00:52:40
текстовым форматом но максимально
00:52:42
простым и мы сейчас его опишем так мы
00:52:46
вторая ситуация для полноты картины да у
00:52:48
нас есть собственно production ну или
00:52:50
там shipping или файл продукт как угодно
00:52:53
называйте я назову продакшен и
00:52:57
здесь задача этого формата абсолютно
00:53:00
другие да какие здесь задачу этого
00:53:03
формата
00:53:04
проверить
00:53:07
проверить редактировать руками и об этом
00:53:11
его нельзя было
00:53:13
ну это как я говорю там условно она да
00:53:18
это важно да давайте я напишу это secure
00:53:21
ность да он должен быть без запад именно
00:53:23
сикер то есть не сейф сэйв это типа
00:53:26
безопасной а secure это типа защищенный
00:53:29
но да он действительно должен быть
00:53:31
какой-то защищенной чтобы вас так просто
00:53:33
не поломали из ресурсы не повытаскивали
00:53:36
но это рассуждение далеко не на первом
00:53:39
месте а рассуждение которое на первом
00:53:41
месте какой будет
00:53:44
может быть performance именно то есть
00:53:47
вам надо гарантировать чтобы из этого
00:53:48
формата было удобно читать
00:53:55
стримить если вы там собираетесь
00:53:57
стримить текстурки чтобы ну и так далее
00:54:00
да
00:54:01
какая-то структура должна быть
00:54:03
достаточно простой и компактный то есть
00:54:06
возможно он будет каким-то хитрым
00:54:07
образом сжат для того чтобы ну понятно
00:54:10
почему же от потому что распаковка
00:54:12
скорее всего будет занимать меньше
00:54:14
времени чем чтение этого дела с диска в
00:54:17
случае если вы там на ssd да как сейчас
00:54:19
модно говорить будьте распространено
00:54:21
устанавливаться да возможно
00:54:24
надо мерить то распаковка будет уже не
00:54:27
так эффективно вас обычного диска может
00:54:30
быть действительно имеет смысла хранить
00:54:31
сжатом виде и при стриминге
00:54:33
распаковывать то есть все надо мерить но
00:54:35
естественно проблему перформанс от 1 то
00:54:37
есть их не проблема требований
00:54:38
performance at 1 требование к этому
00:54:40
формат но второе второе требование это
00:54:43
естественно размер этого формата сайт
00:54:46
потому что если вы будете пользователя
00:54:48
просить каждый раз скачать патч по 100
00:54:50
гигабайт причем кстати часа ты уже
00:54:52
никого не останавливает но в целом это
00:54:54
свинство да все таки надо стараться
00:54:56
чтобы
00:54:57
размеры ваших ассетов они как-то
00:54:59
все-таки были упакованы но понятно что
00:55:01
вы мобильных платформах там размер
00:55:04
все-таки уже начинает намного большую
00:55:06
роль играет чем на настольных системах
00:55:07
но это же самое у вас может оказаться
00:55:09
чтобы просто не
00:55:10
ложки своего на blu-ray когда будет там
00:55:13
распространять ее для какого-то
00:55:15
консольного рынка ну и потом вот этот
00:55:17
безопасность и так далее то есть мы
00:55:19
видим что на самом деле требования
00:55:20
абсолютно разные да именно поэтому у нас
00:55:23
для девелопмента есть свой набор
00:55:25
форматов и для продакшена свой в
00:55:27
конечном итоге когда у вас есть build
00:55:28
конвейер где-то в bell конвейере все
00:55:30
ваши файлики сливаются специальными
00:55:33
инструментами обрабатываются
00:55:34
компрессируются и все остальное вы уже
00:55:37
получаете готовый билд и в билде там все
00:55:39
лежит в таком виде в котором нужно это
00:55:41
как в идеальном мире у нас мир не
00:55:45
идеальный поэтому у меня есть
00:55:47
ограничение и вот так как надо сделать я
00:55:50
естественно сделать не смогу ну а почему
00:55:53
не смогу потому что can trains и какие у
00:55:55
меня constraints
00:55:59
человек то есть у меня проблема в
00:56:03
ресурсах как правильно это называется да
00:56:07
я один у меня мало времени
00:56:12
ну и соответственно меня нет возможности
00:56:14
построить весь этот конвейер так еще
00:56:18
каким есть ограничения
00:56:27
ну да давайте назовем это условно
00:56:32
тех я написать могу все что угодно но
00:56:36
не буду этого делать потому что ресурсы
00:56:39
да и поэтому у меня есть очень и очень
00:56:41
маленький набор возможных вещей которые
00:56:46
я бы мог использовать для работы с этим
00:56:48
файлом уровня а
00:56:51
если там как бы быть более точным
00:56:54
единственное что я могу для этого
00:56:55
использовать этот стандартный ввод вывод
00:56:57
который есть в плюсах
00:56:59
потому что он уже там есть и мне не
00:57:02
нужно там ничего подключать ничего
00:57:04
искать не каким образом с этим делом
00:57:07
работы да то есть и пластмассового вот
00:57:10
так вот за вот так но можно придумать
00:57:13
еще но собственно самое главное мы
00:57:15
назвали отсюда мы делаем вывод какой
00:57:17
формат должен быть очень простой он
00:57:20
должен быть с одной стороны
00:57:24
ну хоть как то пусть не супер удобно но
00:57:27
хоть как-то подходить для ручного
00:57:28
редактирования потому что я буду и
00:57:30
забивать естественно все эти файлики
00:57:32
руками и у меня не будет времени чтобы
00:57:34
писать какой-то красивый редактор в
00:57:35
котором я могу этот мир редактировать
00:57:37
хотят конечно такая сверхзадачи которую
00:57:39
вы в неплохо было сделать вместе с на
00:57:40
этого не будет а
00:57:43
с это с одной стороны а с другой стороны
00:57:45
он должен очень легко читаться
00:57:47
стандартным выводом си плюс плюс
00:57:49
желательно всеми вот этими
00:57:50
перегруженными операторами ввода выводы
00:57:53
которые у нас есть то есть
00:57:54
он будет состоять только из формат
00:57:58
только из простых там чисел строк но и
00:58:01
собственно сюда с
00:58:04
потому что вот так скажу я их смогу хоть
00:58:08
но опять же стандартными операторами
00:58:10
чтение с потоком так и никого не щелкает
00:58:16
в голове что-нибудь каким бы мог быть бы
00:58:19
этот формат или на основе
00:58:22
какого формата я буду разрабатывать свой
00:58:25
файл и
00:58:28
не жмите может быть
00:58:31
но property нет потому что его парсить
00:58:34
надо а парсить это значит ну то есть вот
00:58:37
такой property да это там проб name
00:58:42
равно проб всё это дело нужно парсить
00:58:47
потому что я буду считать считывать
00:58:49
строки ну и так далее то есть это мне не
00:58:51
подходит
00:58:52
так а второе предложение какое было и на
00:58:56
посажу проблем да да да то есть мне
00:58:58
нужен какой-то формат файла который не
00:59:00
нужно парсить
00:59:02
текстовый формат файла который не нужно
00:59:05
парсить и который будет читаться
00:59:06
стандартными читателями
00:59:11
нет файла тоже парсить надо
00:59:15
любой
00:59:17
нет ну точнее до но
00:59:21
файлы если они как бы не которого
00:59:25
специального формата или подготовлены
00:59:27
вник в соответствии с некоторыми
00:59:29
соглашениями можно парсить стандартными
00:59:32
операторами воды в плюсах но можно свое
00:59:36
соглашение какое-то придумывается и и
00:59:39
через какой-нибудь разделитель писать
00:59:42
данные допустим какой нибудь если остров
00:59:45
это полигон то количество . точки дальше
00:59:48
располагать их последствиях читать так
00:59:51
именно этому и будем делать
00:59:54
это тоже файл в котором значение
00:59:57
разделенных запятыми то есть ну там
01:00:01
какой-то в1 , в2 , в3 его тоже надо
01:00:05
парсить вы будете читать строки
01:00:07
разбивать его по запятыми так далее то
01:00:09
есть у нас разделители будут стандартные
01:00:11
а мы вчера говорили стандартный
01:00:13
разделители это пробел и
01:00:17
ну символ
01:00:19
перевода строки да кстати надо
01:00:22
посмотреть мне кажется можно поставить
01:00:24
из и разделитель запятую но тогда он не
01:00:27
будет обрабатывать эту саму запятую это
01:00:30
все не точно досмотрели документацию с
01:00:31
ничего себе пиво чет я , никогда не
01:00:34
используют в качестве разделителя задрав
01:00:36
операция но чтобы этого не делать мы
01:00:38
будем делать пробелы ладно к чему я вас
01:00:41
тут пытаюсь склонить никто никому как бы
01:00:45
эта идея голову не пришло у нас есть
01:00:48
люди которые занимались олимпиаду
01:00:49
программированием
01:00:51
все вот эти семь contest и и все
01:00:53
остальное
01:00:56
был один неудачливого вот никогда не
01:00:59
задумывались почему вам вы сем contest
01:01:02
ах вот вывод дают именно в таком формате
01:01:04
в котором дают
01:01:08
то есть и там всегда есть такая штука
01:01:10
что вход или там входные данные
01:01:13
находятся файл input.txt ну либо в ств
01:01:18
и студии нет ну то есть стандарт на
01:01:21
вводе да и они там выглядят вот таким
01:01:23
вот образом сначала там первое число в
01:01:25
этом файле говорит допустим сколько
01:01:27
строк у вас будет матрица потом
01:01:30
последовательно идут символы там числа в
01:01:34
этой матрице разделенные пробелами
01:01:36
количество строк равно тому числу
01:01:38
которое у вас здесь указано это этот
01:01:41
формат выбран именно вот по тем
01:01:43
соображением по которым мы сейчас
01:01:45
которым мы сейчас пришли то есть должно
01:01:48
быть что-то очень простое
01:01:49
что можно читать стандартными средствами
01:01:52
библиотек вот выводы языков
01:01:54
программирования и что не требует
01:01:56
никакого дополнительного парсинга то все
01:01:59
это вот четко то что нам нужно то есть
01:02:01
мы будем свой левел файл делать исходя
01:02:04
вот из этих соображений но единственно
01:02:06
что нам нужно нам придется этот формат
01:02:08
точно так же вот как в олимпиадных
01:02:11
задачах специфицировать то есть мы
01:02:13
где-то будем записывать иначе мы потом в
01:02:15
этом файле ничего не поймем это такой
01:02:18
компромисс с одной стороны его ну не
01:02:20
супер удобно редактировать потому что
01:02:22
вам надо помнить формат да где какую
01:02:24
циферку вы поменяли но с другой стороны
01:02:26
его редактируют все-таки можно его самое
01:02:29
главное можно просто читать все так
01:02:32
теперь возвращаемся к формату нашего
01:02:34
файла мы сейчас все будем делать
01:02:37
оперативно да сначала мы начнем с
01:02:39
простого файлика или там с простой его
01:02:41
части и по мере того когда будет что-то
01:02:44
появляться мы будем его до
01:02:45
специфицировать так что у нас будет
01:02:48
происходить короче соответственно первая
01:02:50
строка нашего файла и кстати я думаю над
01:02:53
это сразу записывать будет размер окна
01:02:57
давайте с этого начнем то есть на самом
01:03:00
деле сейчас мы будем писать все в одном
01:03:02
файле но по хорошему надо бы завести
01:03:04
несколько файлов то есть надо сделать
01:03:06
файл с настройками mirada или с
01:03:08
настройками игры и сделать файл
01:03:10
какой-нибудь и кстати можно и два файла
01:03:12
чё нет то типа game txt и там у нас
01:03:16
будут храниться настройки общие для игры
01:03:19
в том числе там будет храниться например
01:03:21
размер окна до
01:03:23
первые 2 sim первые два числа это размер
01:03:27
окна астана 80 ну и далее все что нам
01:03:30
нужно и что будет общее для всех уровней
01:03:32
в том числе имя файла с первого уровня
01:03:35
да где то тут тоже будет храниться это
01:03:38
можно сделать прямо сейчас либо пока все
01:03:40
писать в одном файле потом в какой-то
01:03:42
момент их разделить абсолютно ничего не
01:03:44
изменится далее непосредственно сам
01:03:47
файлик с данными до level to extend и
01:03:52
вот здесь первые два числа которых будут
01:03:55
это будет собственно размер игрового
01:03:57
мира да то есть это будут например ну
01:04:00
давайте возьмём что-нибудь
01:04:02
небольшую для начала 20 на 20 и
01:04:09
далее следующие символы именно чары там
01:04:14
есть проблемы сенсорами сейчас мы тоже
01:04:15
видим
01:04:17
будут собственно представлять игровой
01:04:19
мир
01:04:20
самое сложное игровой мир у нас будет
01:04:23
состоять из тайлов
01:04:26
аккуратней сказал поаккуратней и сам все
01:04:31
смазал
01:04:32
так над мне как-то поудобней планшет
01:04:35
положить вот так вот а
01:04:39
я же какая-то функция штаба ровный леди
01:04:42
черти есть да но мне она не нравится тут
01:04:46
на самом деле есть такая галка тип snap
01:04:48
to grid и когда я буду там дорисовать
01:04:51
неровную линию он будет их выпрямлять но
01:04:53
нет это не очень нравится поэтому я буду
01:04:55
пытаться рисовать прямые линии может
01:04:57
быть через пару лет у меня они уже будут
01:05:00
прямые в конце концов ну ладно
01:05:04
так короче если
01:05:08
хоккею там он крал зажатый топ shift x
01:05:12
играть кстати не знаю мне кажется на
01:05:15
он говорит консул он вообще перестает
01:05:19
рисовать
01:05:23
вот сальто он что-то рисует но ничего не
01:05:26
меняется ни мне кажется когда просто не
01:05:28
рукописный вот он был такой там на самом
01:05:30
деле в настройках
01:05:32
где то вот здесь вот можно включить вот
01:05:37
по моему вот это вот штука и нгту шейп и
01:05:39
тогда он будет или daring тушит и тогда
01:05:42
он будет
01:05:43
то что вот я рисую а кто вот криво вот
01:05:47
таким вот образом
01:05:48
преобразовывать а может и а может и не
01:05:50
будет посмотрим
01:05:55
короче как-то он там должен это делать
01:05:57
но возможно и слишком криво рисую чтобы
01:06:01
у него эта работа над на видео на ln
01:06:03
джон они тоже на доске рисует они как-то
01:06:06
в двух режимах иногда криво
01:06:09
надо разбираться короче у меня была
01:06:12
такая штука нам не супер не нравилось я
01:06:14
ее отключил и буду пытаться
01:06:18
работать над собой учиться рисовать так
01:06:21
давайте вернемся короче
01:06:24
наш игровой мир состоит из style of
01:06:27
чертом говорил tools и один тайл у нас
01:06:32
подразумевает две вещи первую вещь
01:06:34
которую подразумевает тайл что в нашей
01:06:38
аске системе один тайл это один символ
01:06:41
то есть таймс вот так напишу 1 тайм
01:06:46
это один чар и это будет нам помогать за
01:06:52
одно это дело рендерить там потому что
01:06:54
мы будем сейчас придумаем чудилось так а
01:06:58
второе у нас один тайм будет
01:07:03
занят или являться одним gem объектом
01:07:09
денги копчик вот таким вот образом
01:07:14
далее будем придумывать дальше мы хотим
01:07:19
чтобы вот эту штуку можно было удобно и
01:07:22
рисовать в файл с данными ну и
01:07:24
соответственно отображать поэтому мы
01:07:27
сделаем вот такое техническое допущение
01:07:30
но все gem объекты будут обладать своим
01:07:34
индексом для того чтобы мы к ним могли
01:07:36
обращаться так у каждого дима объекта
01:07:39
будет то едем это его ключевая штука вот
01:07:42
напишу и
01:07:43
каждый айди будет
01:07:47
по факту нас это никто не заставляет
01:07:50
делать но мы так сделаем кодом символа
01:07:53
которой этот ген облик придаст
01:07:57
представляет вот так вот и так это
01:07:59
соответствующий чартков
01:08:01
дальше поскольку
01:08:06
поскольку у меня
01:08:09
чар кодов может быть
01:08:12
точнее так поскольку меня может быть
01:08:14
много gem объектов за некоторые занимают
01:08:16
ну какую-то клетку с одним и тем же чар
01:08:19
кодом мы подумаем что с этим делать
01:08:23
есть какая-то идея что с одной стороны
01:08:26
хочется
01:08:28
разделить с другой объединить поэтому мы
01:08:31
можем сделать либо аделаиде который
01:08:34
будет чар код но в любом случае это
01:08:37
наверно так сказал много слов и застрял
01:08:42
идея такая у каждого гейма объекта будет
01:08:46
21
01:08:47
давайте вот так
01:08:49
итак у каждого гейма объекта будет
01:08:55
сейчас я правильность просто свою мысль
01:08:58
сформулирую будет 2 или 1 это его той
01:09:02
пойди
01:09:03
той леди той пойди это собственно
01:09:08
идентификатор типа game объекта ну если
01:09:11
сравнивать его читая в апреле забуксовал
01:09:15
как эта штука называется а в unity эта
01:09:17
штука называется префаба то есть вы
01:09:21
можете описать game object видео там
01:09:23
файл с данными да и потом целиком
01:09:26
воткнуть куда-то на сцену и у вас будет
01:09:29
с одной стороны префаб который другим
01:09:32
объект описывать но по факту это
01:09:33
описание класса или это класс и у вас
01:09:36
будет инстанция этого game объекта и ту
01:09:38
же вот конкретная штука которая где-то
01:09:40
лежит поэтому у нас будет значит
01:09:44
идентификатор game объекта который будет
01:09:47
его чар кодом такие идентификатор типа
01:09:50
гимор джек то который будет его чар
01:09:51
кодом для tac toy пойди что
01:09:55
это его чар код вот так вот чар и
01:10:00
все становится очень просто а второе у
01:10:04
него будет уже непосредственно иди
01:10:06
конкретного game объекта и это будут его
01:10:09
координаты x и y и
01:10:11
вопрос ну то есть нужен ли нам этот айди
01:10:14
или нет открыт скорее всего нам не нужен
01:10:17
потому что мы его будем напрямую
01:10:20
идентифицировать их с игреком а вот той
01:10:22
пойди который чарку от но нам
01:10:23
соответственно так что нам вот такой
01:10:26
дизайн позволяет сделать во первых он
01:10:29
нам позволяет размещать энное количество
01:10:32
экземпляров game обликов в тех местах
01:10:34
которые нам нужны это вот как я сейчас
01:10:36
разместил например 3 решетки а решетки у
01:10:39
нас будут означать границы островов
01:10:42
далее
01:10:46
если это нам позволяет
01:10:51
выделять эти решетки какими-то общими
01:10:53
свойствами да ну например для каждого
01:10:58
гейма факта которым нужен и так для
01:11:01
каждого гейма объекта
01:11:06
мы можем описывать свойства свойствам
01:11:09
будем описывать далее по тексту
01:11:12
такие как параметр рендеринга да в том
01:11:16
числе мы можем описать
01:11:18
там render компонент
01:11:21
с придумаем как это сделать рендер
01:11:24
компонент
01:11:28
свойствами которого будут являться цвет
01:11:34
только пожалуйста
01:11:37
черном цвет бэкграунда цвет foreground
01:11:42
и непосредственно символ рисования если
01:11:45
мы вдруг захотим его а вернуть если не
01:11:48
захотим захотим для
01:11:51
спецификации формата можно как бы
01:11:53
заставить это оставить это жестко кстати
01:11:56
давайте кому знаете вот что сделаем мы
01:11:58
сделаем код этого символа потому что
01:12:00
если посмотреть на то что я уже закрыл у
01:12:03
нас есть еще символы которые мы бы
01:12:06
хотели использовать это там всем было из
01:12:08
верхней половиной таблицы который не
01:12:10
очень приятно водители из нижней
01:12:12
половины таблицы до который не очень
01:12:14
приятно вводить в текстовые файлы руками
01:12:15
поэтому мы будем вводить код символа
01:12:17
непосредственно ну например это будет
01:12:20
кот не знаю 12 до посмотрим кочует
01:12:23
зосима
01:12:24
до
01:12:27
важная вот опишу другой концепции вот
01:12:32
этого хранения уровне вы скажете почему
01:12:34
это плохо напишите но вот что у нас есть
01:12:38
да разве уровня дальше идет not как в
01:12:42
том же олимпиадам программирование
01:12:43
разбил островов и потом но вот по но
01:12:48
поэтому н на каждой строчке идет как
01:12:50
описание уровней ну острова то есть
01:12:52
координаты его центру словно
01:12:56
потом сид по которому чтобы мы не
01:12:59
задавали форма оставаться просто приседу
01:13:02
какой-нибудь функции просто генерале
01:13:05
формы этих островов типовые какие-то и
01:13:08
плюс там
01:13:09
параметры острова условно там как эти
01:13:12
паста у него ну вот на это уже чуть
01:13:15
дальше в день дизайну пэт а параметры
01:13:18
рендеры они уже будут одни для всех
01:13:21
островов которые мы просто вот вы кем
01:13:23
тексты будем описывать чтобы мои не
01:13:26
особо парились этим у нас острова разные
01:13:29
но у вас там получится что вы
01:13:34
но если вы ситх отите задавать что
01:13:36
каждый раз банов генерировалось
01:13:38
одинаково
01:13:41
ну в целом
01:13:44
описания островов
01:13:48
просто вот здесь короче чем мне нравится
01:13:51
этот подход тут все максимально просто
01:13:53
на самом деле
01:13:55
единственное что ну и полный контроль у
01:13:57
вас да то есть вы сможете задавать карту
01:14:01
как бы редактировать ее в полу
01:14:03
визуальном стиле то есть вы сможете и
01:14:04
рисовать
01:14:05
прямо в текстовом файле описывая вот эти
01:14:09
вот острова ну и так далее символами и
01:14:11
потом это дело у вас будет отображаться
01:14:13
сразу целиком как бы весь этот уровень в
01:14:16
игре да а если вы будете просто
01:14:19
описывать острова но естественно это
01:14:22
сократит размер файла и сократит даже
01:14:25
размер работы но
01:14:27
мне кажется их тяжелее будет с такими
01:14:30
картами как бы редактировать и общаться
01:14:32
и вам надо будет задавать какие-то
01:14:34
странные параметры генераторов и всего
01:14:37
прочего для того чтобы у вас каждый раз
01:14:39
при загрузке этого уровня получался один
01:14:41
и тот же результат
01:14:45
то есть в таком подходе проще вообще
01:14:48
сделать типа процедурную генерацию
01:14:49
уровня но мне эта идея не очень нравится
01:14:52
потому что это совершенно отдельные
01:14:54
истории там куча алгоритмов надо для
01:14:56
этого писать но это можно будет там как
01:14:59
тоже сверхзадачу себе поставить и
01:15:01
сделать
01:15:04
вот просто сейчас я бы предложил сделать
01:15:07
ну как с максимально простой вариант вот
01:15:10
такой то есть проще чем вот это мне
01:15:12
кажется сложно что-то придумать а потом
01:15:14
можно попробовать эту модель каким-то
01:15:16
образом расширить ну просто вот в этом
01:15:19
варианте не очень понятного для
01:15:23
сколько там два в 11 должны каждую
01:15:27
клеточку описать быть в этом да куда
01:15:29
деваться
01:15:32
но у нас есть пробелы и мы можем ставить
01:15:36
пробелы пожалуйста любом случае просто
01:15:39
тут ведь какая ситуация что на самом
01:15:41
деле игровой мир будет скорее всего
01:15:43
очень плотно заполнен и у вас не будет
01:15:47
там какого-то гигантского расстояния
01:15:49
между островами но может быть будет но
01:15:51
если будет мы их в общем-то возьмем
01:15:53
подвинем ничего страшного в этом нет
01:15:56
хотя может быть действительно имеет
01:15:58
смысл их хранить как-то вот
01:15:59
компрессировал короче давайте мы вот что
01:16:02
сделаем сейчас начнем вот с этого а
01:16:03
потом если нам покажется что
01:16:05
действительно это неудобно просто надо
01:16:07
попробовать опять же я никогда такого не
01:16:10
делал до надо посмотреть что получится
01:16:12
если мы вдруг увидим что но нас этой
01:16:16
истории не устраивает мы собственно
01:16:18
переключимся на вашу идею и будем делать
01:16:20
каждый остров отдельно потом их каким-то
01:16:22
образом крупного то есть сейчас мне
01:16:25
кажется чуть более важно это придумать
01:16:28
каким образом мы будем описывать gem
01:16:30
объекты и каким образом мы будем
01:16:32
компоновать на карте и вот в таком
01:16:35
подходе у нас выглядит так что но это
01:16:39
сделать достаточно просто у нас есть
01:16:42
описание
01:16:46
но каждого гейма объекта да потому что
01:16:49
мы сказали или каждого типы game объекта
01:16:52
потому что вы сказали что у нас есть его
01:16:56
вот такой вот той пойди у нас дима
01:17:00
объекты на самом деле располагаются в
01:17:03
так или иначе каждый димончик
01:17:05
располагается своем тайна но и это нам
01:17:08
сильно сильно упростит различные
01:17:10
рассуждения
01:17:14
может и не простит кто его знает а мы
01:17:18
вот эти вот префаба условно заранее
01:17:21
зададим а потом будем карту я чистые
01:17:24
хадиш коми рисовать или мы для каждого
01:17:26
будем брендах компонент указывать именно
01:17:28
нашем файле ниже ну вот в этом и идея в
01:17:33
том что у нас будет от у каждого вот
01:17:37
этого
01:17:39
типа гема у никто свой код ну то есть
01:17:42
сейчас я попробую это дело изобразить
01:17:45
какая у меня была мысль
01:17:49
давайте сразу - создадим тут всяких
01:17:52
папок и всего прочего
01:17:57
так я создам вот сюда у меня уже есть
01:18:01
папка и буду пользоваться почему-то
01:18:04
шрифт болтается так значит надо
01:18:07
создавать кучу всяких файлов давайте это
01:18:10
сделаем так
01:18:12
new file
01:18:22
так текстовый файл ok значит нам нужны
01:18:26
такие файлы как
01:18:35
game txt это собственно файл со всеми
01:18:38
общими штуками он будет читаться и
01:18:43
обрабатывается первым его тут мы задаем
01:18:45
размер окна до как минимум рутовать
01:18:48
сделаем 120 на
01:18:50
80 вот таким вот образом и сразу же нам
01:18:55
нужен файл описание формат abs abs и нет
01:18:58
нет нет
01:19:06
дайте кнопку для new file зачем мне new
01:19:09
project в тулбаре спрашивается
01:19:12
так далее
01:19:16
этот файл мы назовем game формат так
01:19:20
сразу его тоже сохраним его кстати можно
01:19:23
сохранять уже и не ваксы него сетах а
01:19:25
непосредственно здесь потому что это
01:19:27
файл который
01:19:29
не относится к игре он просто относится
01:19:32
к нам дан итак у нас первый параметр это
01:19:35
вин window
01:19:38
with и
01:19:41
винду и
01:19:46
таким вот образом
01:19:49
будем хотя бы описывать переменные
01:19:52
который в этом в этих файлах встречаются
01:19:54
так далее нам нужен новый файл который
01:19:57
будет собственно level
01:20:04
так сохраняю и
01:20:09
это у нас будет по сетах давайте он
01:20:13
завел и володин
01:20:18
вот так вот и
01:20:21
нам нужен еще один файлик который будет
01:20:23
level формат
01:20:28
тоже его сразу сохраню
01:20:42
все так ну здесь у нас понятно сразу же
01:20:46
будет размер этого уровня мы сначала
01:20:48
выберем маленький размер допустим 24 на
01:20:51
24 так а дальше будет описание так зачем
01:20:55
я это формате пишу спрашивается
01:20:57
так вот сюда будут писать а здесь у нас
01:21:02
будет
01:21:03
просто лучше улице heights в целом
01:21:05
понятно
01:21:07
hits
01:21:09
так теперь то есть какая была у меди мы
01:21:14
описываем наш уровень видя но
01:21:17
непосредственно рисуя карту дальше
01:21:19
татьян рисует 24 символа этом счетчик то
01:21:22
внизу
01:21:26
так вот я сколько 14 нарисовал вот так
01:21:29
24 символа и
01:21:32
так
01:21:34
24 выглядит много
01:21:36
ладно
01:21:39
начнем с маленького 24 на 12
01:21:45
control
01:21:48
c4
01:22:01
ну вот в таком духе то есть мы рисуем
01:22:03
вот такую сетку и дальше на этой сетки
01:22:06
мы непосредственно начинаем рисовать
01:22:09
наши острова да как-то вот таким вот
01:22:11
образом
01:22:14
мы можем там их
01:22:20
как-то раскрасить
01:22:23
вот для больших островов но надо
01:22:26
подумать что будет кстати тут лучше их
01:22:29
сразу рисовать
01:22:33
но как то вот так вот
01:22:36
вот так вот так здесь который сейчас
01:22:40
зарисую их внутренности
01:22:45
то есть вот у нас есть два острова и
01:22:48
когда у нас на острове появляется
01:22:50
какой-то trade пост мы его обозначаем ну
01:22:53
например заглавные буквы да вот так вот
01:22:57
допустим а и b
01:23:00
вот какая у этого подхода
01:23:04
хорошая штука то что вы ну во-первых
01:23:08
можем очень быстро это все дело рисовать
01:23:11
очень все прогнозируемо получается мы
01:23:14
прямо в файле с данными по факту видим
01:23:16
как выглядят наши карты целиком да и
01:23:18
можно вот на взгляд например оценить но
01:23:20
можно тут вообще про лезть куда-то и так
01:23:23
далее но недостаток понятным что когда
01:23:25
станет очень много точнее очень большой
01:23:29
размер карты ну чуть-чуть сложнее за
01:23:30
этим будет следить
01:23:32
вот если же рисовать строго по йоге
01:23:36
статут проблем на самом деле заключается
01:23:37
в том что надо придумать такой формат
01:23:40
дим объекта чтобы нам не убиться но мы
01:23:42
это сделаем
01:23:44
виде вот том котором я сказал у нас
01:23:47
будут типа статические объекты которые
01:23:50
будут помечаться что они статические да
01:23:52
и они будут занимать свое место и
01:23:54
собственно рисоваться они там будут без
01:23:56
всяких проблем
01:23:57
какими-то атрибутами это будет render
01:24:00
компонент и они будут себя уметь
01:24:02
отрисовывать в
01:24:06
нашим screen буфере но а все объекты
01:24:09
которые будут не статически от вот эти
01:24:11
три пасты а и б вы их тоже там ниже по
01:24:13
тексту опишем и они будут ты чего в
01:24:16
облейте что-то полезное делать
01:24:18
вот а если мы сделаем
01:24:21
острова острова как
01:24:25
ну параметры генерации например ну во
01:24:28
первых там придется эту генерацию писать
01:24:30
а во-вторых ну как то придется
01:24:35
это все дело принципа то есть ему нужно
01:24:37
будет схема карта да то есть надо будет
01:24:39
представлять как эта карта выглядит
01:24:43
в конечном виде ну и для того чтобы
01:24:46
оценить как в это дело играется я бы
01:24:49
сейчас становился вот на таком варианте
01:24:52
как более простом но потом можно будет
01:24:55
тесно с ним поиграться а
01:25:00
где взять описываете параметры цвета вот
01:25:03
это я буду описывать дальше то есть у
01:25:06
меня после того как выглядит вот эта
01:25:09
карта так давайте к его формата сразу
01:25:11
напишу
01:25:13
собственно у меня будет вид
01:25:18
так виды
01:25:21
th на
01:25:25
8
01:25:27
heights
01:25:28
chars
01:25:31
из map
01:25:35
configure шон
01:25:39
таким вот образом но тут она будет
01:25:41
понятно из премьера так а как я буду их
01:25:44
описывать дальше дальше вот я сказал
01:25:46
смотрите что у нас будем объектов
01:25:49
есть два типа едим той пойди и touch
01:25:53
arcade которым они представлены на этой
01:25:55
карте соответственно меня тут есть три
01:25:57
чар кода разных да это . решетка a и b и
01:26:03
дальше я должен все эти чар коды описать
01:26:07
но можно ввести дополнительное число
01:26:09
сколько будет у нас описание объектов
01:26:11
можно не вводить потому что это в целом
01:26:13
посчитать можно так это
01:26:15
непринципиально но можно кстати лучше
01:26:19
давайте-ка не будем а может быть и будем
01:26:22
ладно пока пусть будет то есть конечно
01:26:25
то в отдельный файл вынести с конфигами
01:26:27
именно тайлов вот я про это думал и в
01:26:31
целом с одной стороны имеет смысл это
01:26:34
хранить файлы game txt а с другой
01:26:36
стороны не понятно поэтому давайте мы
01:26:40
пока вот это совершенно точно будем
01:26:41
хранить в одном файле просто у нас будут
01:26:45
объекты которые будут жариться между
01:26:47
картами а будут объекты которые не будут
01:26:49
шарится между картами и соответственно
01:26:52
дни объекты лучше хранить в одном месте
01:26:54
а другие в другом и тут выглядит так что
01:26:56
те объекты которые будут жариться между
01:26:58
картами имеет смысл хранить game txt а
01:27:00
те которые не будут жариться между
01:27:02
картами можно хранить непосредственно в
01:27:04
самом файлики поэтому мне кажется пока
01:27:08
но пока давайте остановимся на этом у
01:27:10
всех у нас все равно пока будет один
01:27:12
только уровень мы соответственно будем
01:27:13
хранить только здесь чтобы не плодить
01:27:16
файлы опять же редактировать проще будет
01:27:18
ну а там а может быть кстати не проще
01:27:21
когда их реальную 1000 штук будет вот
01:27:23
этих строк ну ладно когда столкнемся
01:27:25
проблемы короче распилим это абсолютно
01:27:27
не на что не влияет
01:27:30
вот так возвращаясь короче вот сюда мы
01:27:33
описываем типа объектов да то есть у
01:27:35
меня будет тип объекта .
01:27:39
там что-то для нее да потом тип объекта
01:27:43
решетка что-то для нее тип объекта а и б
01:27:47
но пока у нас будет
01:27:49
рендер компонент соответственно мы
01:27:51
договоримся так что
01:27:53
идет чар который собственно
01:28:00
код символа
01:28:02
да потом идет описание цвета
01:28:06
которому он рисуется да например мы
01:28:09
можем для каждого компонента
01:28:11
тоже
01:28:13
кстати вот здесь надо говорить сколько у
01:28:16
объекта будет компонентов до static
01:28:19
сразу же это будем заносить тогда в
01:28:20
формат написать уже вот здесь вот не
01:28:22
буду сразу же буду писать вот здесь так
01:28:25
близко к фигуре что дальше на амбер
01:28:28
амбер
01:28:33
of object types
01:28:38
настоящие программисты пробел ими не
01:28:40
пользуются как в том анекдоте
01:28:42
далее идет у нас описание
01:28:47
обжиг type диск вот так вот его назову
01:28:50
объект
01:28:55
диск так который включает в себя что он
01:28:59
включает в себя
01:29:03
первое это
01:29:06
айди там объекта и придя
01:29:13
за которым через пробел у тут кстати
01:29:16
надо понять какие штуки у нас будут
01:29:19
служебными да вот например объектов диск
01:29:21
у меня служебное да давайте все
01:29:23
служебные штуки я буду отделять вот
01:29:25
такой чертой тип комментарий
01:29:29
главный не запутаться потом самом учета
01:29:32
за черта так объект айпэде
01:29:34
это у нас
01:29:37
ну чар понятно да
01:29:42
припишем чар
01:29:46
далее у меня будет количество
01:29:48
компонентов
01:29:49
номеров компонент
01:29:52
для что же никаким общем-то это так на
01:29:55
интер off
01:29:58
компонент
01:30:01
но это понятно намбер так далее значит
01:30:06
далее описание компонента тут в
01:30:09
количественном пер то есть это будет
01:30:16
components
01:30:17
диск а вот обжиг той пойдет именно не
01:30:22
какое-то число она именно сам символ да
01:30:26
для того чтобы было удобно их
01:30:28
сопоставлять то есть вот здесь у вас
01:30:30
есть
01:30:31
вот эта штука и вы сразу видите что вот
01:30:34
эта штука есть ограничение понятно что
01:30:36
не может быть их больше там
01:30:38
определенного количества но определенное
01:30:40
количество давайте кстати сразу
01:30:41
посчитаем а сколько у нас может быть
01:30:45
осмысленных этих копчик type of до
01:30:48
осмысленных ручек type of у нас может
01:30:50
быть
01:30:52
количество так вот она чар код ну
01:30:56
понятно 255 но понятно что в текстовом
01:30:58
файле 255 символов мы там не сможем
01:31:01
вводить поэтому мы будем использовать
01:31:03
следующие чарку воды так скажем так во
01:31:08
первых это символ от нуля до девяти их
01:31:11
10 штук до 10 штук of далее это большие
01:31:16
буквы и написал маленькую то есть
01:31:18
маленькие большие буквы a до z и a до z
01:31:22
сколько там букв в английском алфавите
01:31:26
2828
01:31:28
26
01:31:31
посчитаем короче
01:31:34
ну если взять играть вот тут философский
01:31:37
вопрос
01:31:38
24 26 мне кажется что
01:31:43
да
01:31:45
2624 мне кажется в латинском алфавите
01:31:47
потому что в латинском нету w и еще
01:31:51
какое-то что такое короче 26 на 2 до
01:31:56
4 стр а считаю это в районе 50-ти 2
01:32:00
должно быть латинском 20 23 даже вот как
01:32:04
значит там еще чего то нет но и ну и
01:32:06
славненько
01:32:07
так
01:32:10
52 получаются да ничего не попутал
01:32:14
так далее мы будем использовать
01:32:17
специальные символы очевидно .
01:32:20
ну . мы будем всегда звезды обозначать и
01:32:22
вот как раз нам для именно для истории
01:32:24
со звездами давайте-ка кстати запущу и
01:32:27
посмотрим какие у нас вообще символы
01:32:28
есть и которые какие мы можем рисовать
01:32:31
нижней даром там вывел вот это вот штуку
01:32:33
с таблицей символов
01:32:38
чем вот он капилляр быстрее был вообще
01:32:41
прекрасно
01:32:50
вот то есть тут у всех все мелко да если
01:32:53
внимательно присмотреться тут есть вот
01:32:55
две точечки которые в самом конце перед
01:32:58
символом корня до и вот эти точки мы на
01:33:01
самом деле будем использовать для звезд
01:33:03
но поскольку я эти точки не хочу вводить
01:33:06
в текстовом файле это как супер
01:33:07
убийственно и тем более будет 2 там еще
01:33:10
подумаем как они может быть и медведь
01:33:12
муж только одна короче пока это все
01:33:16
история будущего но в любом случае
01:33:19
хотелось бы иметь возможность
01:33:20
переопределять
01:33:21
вот этот вот рендер символ да то есть
01:33:24
чтобы айди был один в текстовом файле
01:33:27
ареал делился совсем другой и именно для
01:33:29
вот этого мы в render компоненте сделаем
01:33:32
как раз символу именно по коду который
01:33:35
бы его позволило городить короче
01:33:37
возвращаемся к этим символом и так у нас
01:33:39
будет . у нас будет ну там дальше
01:33:43
какие-нибудь символы которые похожи на
01:33:46
правду да да и кстати собачкой мы будем
01:33:48
обозначать себя то есть этот символ мы
01:33:51
типы используем
01:33:54
так это мой дирижабль плеер и возможно
01:33:59
этим же символом мы будем обозначать
01:34:01
другие дирижабли поэтому мы его
01:34:04
используем точно также но мы его из тех
01:34:08
символов которые мы обычно на карте
01:34:09
будем использовать тоже выбрасываем так
01:34:13
что еще тут у нас может быть но очевидно
01:34:16
решетка очевидно тильда тильды мы будем
01:34:20
изображать воду всегда так делают
01:34:22
решеткой мы будем обозначать границы
01:34:23
островов далее но можно использовать все
01:34:27
символы плюс минус умножить поделить
01:34:29
непонятно зачем вот например умножить
01:34:31
выглядит как хорошо как снаряд если
01:34:33
будем делал стрельбу то этот такой вот
01:34:38
кандидат на это дело а вот плюс-минус и
01:34:40
там поделить если можно ну можно их там
01:34:43
использовать тоже в рисовании островов а
01:34:46
можно вообще сделать так что
01:34:48
мы острова будем какие-то рисовать
01:34:51
например не решетками да а там красиво
01:34:54
символами слыша да вот символом поделите
01:34:57
символом там обратного флэша и минусам у
01:34:59
нас там соответственно быть вот так а
01:35:01
вот рамочка это кстати хороший идеям у
01:35:04
нее тоже можно подумать и вот опять же
01:35:07
вот эту информацию размещением эти идеи
01:35:09
мужик тоф в сетке он в принципе нам
01:35:12
легко позволяет очень быстро
01:35:14
перерисовывать острова да то есть у нас
01:35:16
будет например одна карта на которой
01:35:17
острова будут решетками нарисована
01:35:20
другая карта на которой они будут
01:35:22
нарисованы ну другими символами . бы
01:35:25
стилистически будет восток и запад на
01:35:28
100 по лору у нас кстати должно быть яд
01:35:31
учета думал над норам у нас будет такая
01:35:33
как я рассказал типа steam панковская
01:35:36
напишу
01:35:42
стимпанк
01:35:46
типа колоний all breed он кстати мне
01:35:48
кажется это так кладет
01:35:49
производительность еще запущены наша
01:35:52
игра color и ладно colonial британ то
01:35:58
есть подразумевается что у нас будет
01:36:01
типа лондон но или остров для в котором
01:36:05
британ и остров который but as будет
01:36:07
индия ну такая условная понятно да и
01:36:14
англия
01:36:17
так вот и даже напишу короче над этим
01:36:21
все мы подумаем да и мы можем прям так
01:36:23
сделать что например англии у нас будет
01:36:26
острова отделены решетками а вот в индии
01:36:29
они будут отделены красивыми вот такими
01:36:31
вот этими штуками да и
01:36:33
это с точки зрения движка игры это все
01:36:36
делается абсолютно бесплатно да но вот
01:36:39
за счет того что вы так хитро будем все
01:36:41
сохранять файлики это будет тоже а по
01:36:43
факту бесплатно просто возьми да нарисую
01:36:45
по-другому
01:36:46
так ладно возвращаемся к подсчету этой
01:36:49
штуки короче вот у нас есть такие
01:36:51
символы ну и плюс еще там какие-нибудь
01:36:54
символы типа вертикальные черты и
01:36:56
амперсанда отчетом нищую клавиатуре есть
01:36:59
знак ! ?
01:37:02
! вопроса так скобочки скобочки до всех
01:37:08
видов и это и я не вот такие
01:37:15
тильда тильды я нарисовал вот оно : есть
01:37:21
. запер на вату словно вот так вот пока
01:37:23
да и того получается раз два три 4 5 6 7
01:37:28
8 9 10 11 12 13 14 16 8 19 2 go
01:37:33
нормально
01:37:35
2020 и тому у нас получается что мы
01:37:37
всего на карте можем разместить
01:37:41
30 +
01:37:43
5282 типа объектов ну мне кажется это
01:37:47
нам выше крыши будет достаточно причем
01:37:49
это как бы уникальные типа объектов до
01:37:51
или уникальные штуки которые есть а не
01:37:54
уникальных естественно может быть больше
01:37:56
потому что мы их вот по карте можем
01:37:57
тиражировать короче это вот такой вот
01:38:00
техническое ограничение нашего движка мы
01:38:02
условными сказать им что она есть
01:38:04
понятно можно там еще пару символов на
01:38:07
клавиатуре каких-нибудь найти и там
01:38:09
будет больше но мы ориентируемся там
01:38:11
когда делаем свой гейм-дизайн что на
01:38:14
карте у нас может быть восемьдесят два
01:38:16
уникальных символа это значит
01:38:22
demax вот так вот но прописывать мы
01:38:25
естественно это нигде не будем потому
01:38:28
что там теоретический максимум 255
01:38:30
исходя из формата
01:38:39
подчеркнул но окей пока остановимся на
01:38:42
этом но опять же всегда можно переделать
01:38:45
в тот момент когда почувствуем что
01:38:48
что-то не то происходит
01:38:51
так
01:38:53
вернемся вот сюда
01:38:58
значит что мы хотим сделать мы хотим
01:39:01
описать наш компонент диск
01:39:06
компонент диск у нас будет
01:39:10
компонент
01:39:12
вот тут у нас будет связь естественно с
01:39:16
тем что есть движке
01:39:19
компонентой de campagne отойди у нас
01:39:21
фиксированный очевидно да у нас будет
01:39:24
пока что один компонент это рендер
01:39:26
компонент обозначаться будет буквой r
01:39:29
так
01:39:31
далее через пробел у нас идут
01:39:35
параметры этого компонента дам
01:39:40
params для рендер компонента
01:39:51
компонент а
01:39:54
вот мы не захотим не в таком случае по
01:39:58
использовать пробелы накатит нас ничего
01:40:00
не сломай
01:40:01
пробела на карте но мы можем по
01:40:05
использовать это ничего не сломает мы
01:40:07
прочитаем пробел как пробел я сказать
01:40:10
посмотрим как это будет выглядеть там
01:40:12
есть и другая подстава на самом деле
01:40:14
связаны с тем что когда вы считываете
01:40:16
символ там следующий разделитель не
01:40:18
всегда просто прочитать но поскольку у
01:40:20
нас это будет всегда четко один символ а
01:40:22
дальше всегда будет число у нас не будет
01:40:24
ситуации когда за символом следует
01:40:26
символ то вот этот первый пробел нас в
01:40:30
теории испугать не должен
01:40:36
так давайте для рендер компоненты это
01:40:40
напишем на самом деле сейчас нишу такой
01:40:43
формат файла через он тут ничего не
01:40:44
пойму че тут написано так это значит
01:40:47
буква р потом это foreground color фпг
01:40:53
потом bg и потом чарку вот чар код
01:40:59
хочется сделать общую чтобы не
01:41:00
переписывать код символа если он
01:41:03
совпадает как бы это нам сделать
01:41:07
чтобы всегда было все стандартно ну
01:41:10
наверное тут имеет смысл указывать
01:41:12
просто количество параметров и давайте
01:41:14
ка мы это сделаем это нам всегда
01:41:16
пригодится то есть у нас будет компонент
01:41:18
айди потом будет number of params но это
01:41:24
понятно а потом будут сами params то
01:41:26
есть мы для рендер компоненту будем
01:41:28
поддерживать формат вот такой r2 фидбэка
01:41:31
и вот такой формат r3
01:41:36
pg pg и char код на самом деле для
01:41:41
ускорения разработки
01:41:43
было бы удобно сделать возможность не
01:41:47
переопределять компонента есть где-то в
01:41:49
настройках уровне какой-нибудь дефолт
01:41:52
поставить и что если мы видим на карте
01:41:55
символ который мы снизу не описали вы
01:41:57
просто сама этот символ аренды с
01:41:58
параметрами которые мы указали только и
01:42:01
друга конфиг меньше становится это супер
01:42:04
великолепная идея и я прям ее тоже думал
01:42:07
и я думаю мы можем эти параметры даже не
01:42:09
описывать то есть мы можем сделать так
01:42:12
что это будет всегда символ нарисованный
01:42:16
на черном фоне
01:42:17
серым шрифтом и все и это реально нам
01:42:20
настолько бу станет разработку потому
01:42:22
что действительно вот эти вот острова мы
01:42:24
можем ну как бы всегда считает серен
01:42:26
кими и собственную это нас на сто
01:42:29
процентов устроит этому действительно
01:42:30
сделаем
01:42:32
но поставь дефолтный вот эти цвета не
01:42:36
прикольно с точки зрения если мы разные
01:42:39
уровни в разные цветовой гамме хотим
01:42:40
сделать а вот тут мы
01:42:42
в желто не в желтом как unsure афинян
01:42:46
липовым потом какой-нибудь magenta в
01:42:49
желтой индию но я согласен давайте
01:42:51
сделаем это очень даже хорошо и
01:42:55
это мы сделаем соответственно после
01:42:58
[музыка]
01:43:02
описание карта да то есть у нас будет
01:43:06
так давайте раз я научился тут писать
01:43:09
комментарии вот так это значит у нас
01:43:10
будет объект type а не будет так значит
01:43:16
вот здесь
01:43:18
дефолт в г
01:43:20
читать после вчерашней лекции как-то
01:43:23
голос немножко хрипит печали дефолтов
01:43:26
игре дефолт б.г.
01:43:28
вот таким вот образом и
01:43:31
понятно что если мы их не встречаем да
01:43:33
мы будем
01:43:35
мы не встречаем рендер компонент то то
01:43:38
мы будем его генерировать вот таким вот
01:43:41
образом для каждого объекта
01:43:47
.
01:43:49
все похоже на то что мы чё ты уже
01:43:52
сделали надо уже что-то
01:43:53
запрограммировать и посмотреть как это
01:43:55
все будет работать давайте сделаем
01:43:56
маленький перерывчик не тут одна воды
01:43:58
выпьем уже не полегче станет говорить и
01:44:01
будем программировать
01:49:28
так я вернулся ну давайте
01:49:42
сказал ей задумался куда это писать
01:49:45
тогда войти в engine и наверное для
01:49:48
ночам вот там потом перенесем
01:49:50
так
01:49:59
надо как-то аккуратно все разложить
01:50:02
чтобы удобно было
01:50:03
переключаться
01:50:05
так еще мне нужно сразу же наверное раз
01:50:09
я собираюсь с game и читать ширину и
01:50:12
высоту окна
01:50:14
лучше не стало так сразу же это дело
01:50:18
как-то поддержать в драйвере
01:50:23
это убить их лиц я уберу
01:50:29
вместо этого
01:50:32
инженер
01:50:34
но мы будем глобальными переменными
01:50:36
пользоваться наверное для таких вещей не
01:50:40
имеет смысла мне кажется их разделять
01:50:44
так book стоков стоп отладку
01:50:51
[музыка]
01:50:57
так экстерн им
01:51:01
но для глобальных переменных мы будем
01:51:04
использовать префикс g вот так вот
01:51:07
джек
01:51:09
windows
01:51:11
vista vitz ддт ддт аж и
01:51:18
экстерн int j
01:51:23
винду с
01:51:25
таким вот образом
01:51:27
[музыка]
01:51:28
то по поводу соглашения об именовании
01:51:36
наверное все будем писать кого ты сам
01:51:39
так вот префикса жив принципе достаточно
01:51:42
чтобы понять что это глобальная
01:51:44
переменная
01:51:48
control п
01:51:51
вот там у нас был declaration их да и
01:51:55
теперь их можно использовать других
01:51:57
файлов а вот здесь у нас будет их
01:51:58
definitions по умолчанию будут нули
01:52:03
мы будем их читать все равно из файлов
01:52:06
так далее файл с инициализацией мы
01:52:11
откроем в гим инете там все сделаем но
01:52:20
но получается что игру мы должны
01:52:23
инициализировать до того как и
01:52:28
не цель создаем окно порядок
01:52:31
инициализации будет вот такой
01:52:35
мы создаем окно и
01:52:38
создаем
01:52:41
рендеров
01:52:44
так же
01:52:48
windows nt и windows
01:52:56
вот таким вот образом
01:53:03
в кредит windows
01:53:06
тоже можно чинить передать а можно и не
01:53:09
передавать
01:53:32
хорошо
01:53:40
так так
01:53:44
тут есть
01:53:49
ну поехали инициализировать так нам
01:53:53
нужно открыть файл и
01:53:56
для работы с файлами мы будем
01:53:58
использовать стандартную библиотеку
01:54:00
экстриму
01:54:01
[музыка]
01:54:04
чу престо
01:54:27
бен клуб экстрим
01:54:41
так да и в stream находится файле
01:54:44
extreme вот так все теперь и
01:54:50
иными spss т.д. не знаю что писатели не
01:54:54
стоит подумаем так std экстрим
01:55:05
давайте game файлов и эту штуку назову и
01:55:11
имя этого файла мы будем хранить в
01:55:15
константе
01:55:21
kunst
01:55:23
чар
01:55:26
звездочка
01:55:41
и вот тут большая проблема какой
01:55:44
сепаратор использовать в теории windows
01:55:46
сейчас понимаете новые сепараторы тоже
01:55:48
но с другой стороны мы тут настолько
01:55:50
завязаны на винду до что имеет смысл
01:55:53
мире не имеет смысла об этом даже как-то
01:55:56
думать поэтому мы назовем вот так вот
01:55:58
асад game txt и будем этим пользоваться
01:56:05
так значит game file.gif равным
01:56:12
далее
01:56:18
так и почек а вино да давайте не виной
01:56:23
этому будем делать
01:56:33
мы хотим сделать engine так условно
01:56:35
переносимым тогда там это рассуждение не
01:56:39
очень хороший ладно
01:56:41
включил острым напрямую
01:56:43
там дальше будем думать
01:56:48
все включили так и стринги файл теперь
01:56:53
надо считать наши два параметра но надо
01:56:56
сначала проверить что он открылся
01:56:58
если он не открылся records и так если
01:57:01
не game файл
01:57:07
вот это не к добру ли черный фаллос
01:57:11
вот так вот
01:57:13
далее начинаем считывать game файл
01:57:18
будут по-хорошему конечно надо проверять
01:57:21
удалось нам читатели не удалось но мы
01:57:24
уже будем считать что файл у нас всегда
01:57:26
в правильном формате и проверок
01:57:29
корректности ввода мы делать не будем
01:57:33
так считали до улицы считали windows
01:57:37
eight
01:57:38
все и после чего ритер нутру
01:57:42
теперь ну давайте сразу посмотрим как
01:57:45
это все работает
01:57:56
кстати еще тут бы какой нибудь сообщение
01:57:58
с неплохо выводить что game files found
01:58:00
мы этого делать не будем но мы как
01:58:02
минимум асад поставим
01:58:04
чтобы у нас программа падала в дебаггер
01:58:07
если ей не удается прочитать ресурса
01:58:24
так
01:58:29
считываем и вот у нас образовались числа
01:58:32
120 и 80 из файла что все с этим хорошо
01:58:38
все вот оно у нас окно размера побольше
01:58:42
но и видно что да теперь скайс вводится
01:58:44
там где нужно
01:58:46
при этом но пока я дергаю мышкой да
01:58:50
производительность вот так интересно
01:58:52
скачет над этим подумаем
01:58:55
[музыка]
01:58:56
так далее что мы делаем теперь надо
01:58:59
считывать level или волн уже будем
01:59:03
считывать
01:59:04
но опять же можно заделать гема нити
01:59:06
можно это делать где то в другом месте
01:59:08
да мы давайте пока все будем делать вот
01:59:11
здесь потом когда возникнет
01:59:13
необходимость мы
01:59:17
перенесем так
01:59:20
но тем ни менее функцию то мы для этого
01:59:23
сделаем тут вообще надо подумать как бы
01:59:26
мы все это дело хотели хранить
01:59:29
стоит ли думать об этом сейчас
01:59:39
я вот думаю
01:59:47
давайте мы сделаем уже что-нибудь
01:59:50
объектно-ориентированная чуть-чуть для
01:59:53
разнообразия
01:59:55
так
01:59:59
создадим а
02:00:04
может быть и не так
02:00:10
всяком случае мы совершенно точно
02:00:12
сделаем свой файл
02:00:15
в палыч
02:00:24
apple apple сыпем
02:00:48
прогноз
02:00:54
так
02:01:00
самая большая мук ада это решить как же
02:01:04
это делать в принципе супер великой
02:01:08
разницы нет и мы можем сделать уровень
02:01:12
как структурой так классом
02:01:17
надо подумать какие есть плюсы у того и
02:01:20
у другого решения
02:01:21
ну ладно давайте сделаем классом
02:01:25
все-таки так класс level
02:01:30
что это выловила у нас будет но пока все
02:01:35
сделаем пабликам
02:01:39
так что то там должно быть на самом деле
02:01:43
до разница четверика особо-то и нет
02:01:53
любом случае нужен helper который за
02:01:55
самый level будет загружать и вот тут у
02:01:58
нас возникает проблема с управлением
02:02:00
поль метеор
02:02:10
которые тоже нам нужно как-то решить но
02:02:13
здесь мы будем возвращать
02:02:15
сырой указатель
02:02:18
лейбл звездочка
02:02:22
водному а
02:02:25
параметр будет
02:02:29
файл из которого мы это делаем
02:02:33
file name
02:02:42
tag урвала будут
02:02:46
ширина и высота
02:02:57
кстати
02:03:10
так я сейчас все делаю неправильно кто
02:03:13
мне объяснит почему
02:03:26
но на самом деле я еще не успел ничего
02:03:28
сделать неправильно ночью ты я начал это
02:03:31
делать давайте мы вот что сделаем на
02:03:34
самом деле то что я сейчас пытаюсь
02:03:36
сделать и называть левелом это ну
02:03:39
какая-то странная вещь в плане того что
02:03:41
у меня сейчас голове путаница между тем
02:03:44
что является
02:03:46
уровнем который я загружаю файлы которые
02:03:49
содержат все данные об уровне и тем что
02:03:53
у меня есть непосредственно в текущем
02:03:55
games 3 или world стоите да то есть то
02:03:57
как этот уровень играется это две разные
02:04:01
вещи да поэтому меня должно быть вот что
02:04:06
назовите вот это maple но я сейчас это
02:04:09
level диск назову у меня должно быть вот
02:04:13
что у
02:04:14
меня должно быть с одной стороны
02:04:20
что то что хранит вот эти загруженные
02:04:24
данные и вот это мы будем называть
02:04:26
lambesc
02:04:30
мне кажется пустой как я выпил воды не
02:04:33
стал хрипеть сильно больше по течению
02:04:37
поставить тепленького выпить так главное
02:04:41
чтоб супостат не одолел
02:04:48
так короче будет ли балбес тот файл с
02:04:52
описанием уровне который мы загружаем
02:04:59
мы соответственно понятно да будем
02:05:02
хранить плавал диски и у нас будет
02:05:06
helper creed точнее ладно и он будет нас
02:05:10
возвращать собой целый диск так это все
02:05:14
хорошо далее у нас будет world state а
02:05:21
вот эта штука эта игра в момент ее игры
02:05:25
да то есть на основе того что есть лавал
02:05:27
диски мы будем создавать фунт state и
02:05:30
там уже будут конкретные дима объекты и
02:05:33
так далее так далее почему хочется
02:05:35
сейчас как ты и хоббит нить но вот это
02:05:38
вот наверное неправильная идея потому
02:05:41
что у нас будет вот это вот карта
02:05:43
которая в целом
02:05:48
будет и там и там 1 этажа и
02:05:52
вот этот момент надо будет хорошо
02:05:55
подумать сейчас мы прочитаем в отдельно
02:05:57
карту сюда потом инстанцирует карту вол
02:05:59
state и будем работать с властей там но
02:06:02
может быть действительно будет иметь
02:06:04
смысл и
02:06:06
как ты их объединить короче вот есть вот
02:06:08
это вот путаница с ней надо будет
02:06:11
разобраться
02:06:12
давайте пока наверное все таки загружу
02:06:15
воевал диск отдельно а
02:06:18
потом когда мы поймем что должно
02:06:21
храниться конкретно в диске not очевидно
02:06:23
в диски должны храниться описание все
02:06:25
game объектов они там будут как бы
02:06:27
всегда и они будут тут не модифицируем и
02:06:32
когда нам будет нужно получить очередной
02:06:34
game облик мы будем получать но
02:06:36
собственно и мужик из со следующего
02:06:38
ловил диска с другой стороны саму карту
02:06:41
постоянно хранить загруженную не
02:06:44
модифицированную внутри ловил диска
02:06:47
наверно великого смысла нет да потому
02:06:49
что рестарта мать уровень мы не будем
02:06:51
там и так далее поэтому может быть имеет
02:06:52
смысл действительно а не и перенести вол
02:06:56
stay
02:06:58
пойду да как эта идея была мне еще раз
02:07:02
просто хотел уточнить у нас каждый
02:07:04
символ есть easily гемов жить правильно
02:07:07
каждый символ ну да то есть каждый тайл
02:07:11
на этой карте отдельный game обжиг да у
02:07:13
него есть отдельный тип этого game
02:07:16
объекта которой описывается кодом этого
02:07:19
символа
02:07:30
так на секунду отойду
02:09:02
так
02:09:03
продолжаем
02:09:10
structural тест
02:09:13
значит вид схем цитата дальше карта
02:09:21
но тут нам придется использовать
02:09:24
что-нибудь например стандартную
02:09:27
библиотеку чтобы эту карту хранить
02:09:30
так атлета нам нужно будет вектор и
02:09:35
вектор чар
02:09:44
дальше нам нужно хранить описание дима
02:09:47
объектов так вот они наши им общих тем
02:09:54
очевидным good виктор
02:10:11
это кстати хороший вопрос как бы эти
02:10:15
game объекта похоронить мы едим объекты
02:10:18
будем хранить и
02:10:23
вот думаю создатели для этого отдельный
02:10:26
класс или нет
02:10:28
по хорошему бы мне наверное этого
02:10:31
хотелось то есть придумать какой-нибудь
02:10:33
класс
02:10:41
который бы умел по айди
02:10:45
возвращать
02:10:46
какие-то объекты
02:10:48
ну понятно что тип стб мэк это умеет и
02:10:52
леонардо рот map например да но
02:10:57
мы можем создать что-то из спать он ну в
02:11:00
смысле мы писать свою не будем мы можем
02:11:02
создать только абстракцию как бы поверх
02:11:04
этого
02:11:06
давайте наверное ты сделаем
02:11:10
сделаем такой class
02:11:15
name
02:11:17
[музыка]
02:11:25
найди
02:11:28
так вот
02:11:32
квас
02:11:33
реджис 3
02:11:35
так и этом классе у
02:11:43
нас что-то будет
02:11:49
очень не хочется чтобы это что-то было
02:11:51
мы полно придется пока как минимум
02:11:55
std
02:11:57
[музыка]
02:12:00
айтюнс и
02:12:04
для приватных я буду пользоваться уже
02:12:06
вот этим соглашением
02:12:08
так вот это вот штука будет структурой и
02:12:12
тогда паблике отсюда санторо
02:12:15
так и будут методом
02:12:37
мы хотим получать все не мужестве
02:12:39
харгрив типа
02:12:41
тут мы хотим получить что то пойди
02:12:47
то есть по факту такаяма по которой а
02:12:50
вот такая std map
02:12:53
ай ай ди и tm
02:13:00
кэш которая будет хранить дефиницию
02:13:03
наших
02:13:04
даю так я на самом деле не нравится map
02:13:08
и поэтому я его хочу скрыть и именно
02:13:11
поэтому я его не хочу использовать
02:13:13
напрямую как единственная причина
02:13:17
так
02:13:21
он т причем все это дело не модифицируем
02:13:27
это const т
02:13:33
пройди поедим и
02:13:40
воет put a
02:13:44
иди иди и
02:13:47
const
02:13:49
т со звездочкой
02:13:53
поэтому
02:13:55
кто вот так
02:13:59
но посмотрим час что из этого получится
02:14:01
вообще этот класс естественно относится
02:14:03
к джону и имеет смысл его туда занести и
02:14:07
вообще имеет смысл то что сейчас
02:14:11
называется гейма лежит when johnny
02:14:13
вынести в отдельный файл game иначе мы
02:14:15
сейчас убьемся с зависимостями
02:14:26
так сделаю вот так вот это
02:14:29
переименуем
02:14:32
так карины
02:14:48
фат трай веря
02:14:55
клуб kimo
02:15:04
так
02:15:06
engine у нас внж не будут самые такие
02:15:12
корневые вещи хранится
02:15:35
так сейчас отойду еще минуту
02:18:20
как вам тут
02:18:22
прихлёбывать периодическим так поехали
02:18:27
прогул аванс и
02:18:33
переносим эту штуку из гейма в engine
02:18:37
takes a изливала вимм-билль-данн
02:18:42
я был на дачу им закрыть
02:18:48
пока не нужен плевал и это пусть будет
02:18:52
это убираем
02:18:56
драйвер
02:18:59
будет нам сейчас нет с тебя тоже убираем
02:19:03
и
02:19:05
это убираем
02:19:08
чем я пишу это в себе пиво или
02:19:11
спрашивается
02:19:13
тут у меня уже не писали так и копируем
02:19:17
это
02:19:36
клубная
02:19:40
все
02:19:46
так мы про это вчера не успели но
02:19:52
следующий раз обязательно скажем что
02:19:55
для template of их реализацию любом
02:19:58
случае обязательно надо писать в все
02:20:01
пеппи файлах ой вы че файлах
02:20:04
поэтому как бы мне не хотелось этого не
02:20:08
делать но
02:20:10
придется это сделать здесь так
02:20:14
делаем
02:20:17
реджис 3-бет и
02:20:24
радиус 3 put
02:20:27
так кроме того мы еще включимся assert и
02:20:31
будем а сердить
02:20:35
ошибки
02:20:37
случае если они есть так а и
02:20:42
кстати я сейчас думаю ладно культуре
02:20:45
ссылка так
02:20:47
как думаете почему будем их именно
02:20:50
сердить а не какие-то другие вещи делать
02:21:04
как вообще обработать ошибку правильно
02:21:09
окей ну типа машины можно выкинуть
02:21:14
эксепшен но это не всегда хорошая идея
02:21:18
можно верный статус код возврата это
02:21:21
тоже не всегда хорошая идея и
02:21:29
вообще это такая холивар на я вещь то
02:21:32
есть что лучше делать но мы будем делать
02:21:36
не то не то мы будем просто осветить как
02:21:38
вы думаете почему
02:21:47
проще
02:21:52
ну это понятно что проще да почему мы
02:21:55
считаем что нам этого достаточно
02:22:00
но мы предполагаем что только вы будем
02:22:03
использовать 7 класс и будем понимать
02:22:04
как его не поломать но с одной стороны
02:22:08
до а с другой стороны то есть более
02:22:10
важное рассуждения
02:22:23
более важно сникерс голос опять же
02:22:25
потому что ну xoчy на это очень дорого
02:22:28
возврат попроще и swears he'll сила
02:22:31
блада гадить но это да это
02:22:33
когда мы выбираем стратегию работки
02:22:36
ошибок мы про это думаем а здесь идея
02:22:38
такая что
02:22:39
этот registry он в любом случае будет
02:22:42
представлять собой данные которые мы на
02:22:45
этапе дизайна и на этапе отладки как бы
02:22:48
ну то есть на этапе дизайна в этот файл
02:22:50
помещаем а на этапе отладки мы
02:22:51
соответственно определяем там нормальные
02:22:54
ненормально и ситуации когда нам
02:22:56
требуется что-то что нет в этом файле у
02:22:59
пользователя анна возникнуть не может
02:23:01
она может возникнуть только у нас
02:23:03
процессе разработки игры с вы конечно не
02:23:05
злобный буратино и там чё-то не удалил
02:23:07
руками но мы эту ситуацию не
02:23:08
рассматриваем и
02:23:10
соответственно
02:23:12
как что-то дополнительно проверять еще
02:23:15
вот в этот момент она кажется такой
02:23:17
странной идеи до хотя в целом а
02:23:19
правильный но мы эту ситуацию не
02:23:22
рассматриваем да то есть мы
02:23:23
рассматриваем именно ситуацию когда все
02:23:26
данные корректны потому что мы все
02:23:29
проверили и собственно эти данные мы
02:23:31
сами вы запаковали вместе с игрой и
02:23:34
пользователь там вот в этом северном
02:23:35
файле и так далее отправили на поэтому
02:23:38
мы можем себе позволить фронтами уже
02:23:40
дополнительно таких проверок не делать
02:23:43
так что там ни там говоришь the registry
02:23:46
ты не классные много
02:23:48
первый взгляд вроде все правильно
02:23:50
написано разберемся так
02:23:55
что я хочу сделать я хочу что ты вернуть
02:23:59
из map и anthems так это мтс и
02:24:07
поедем
02:24:11
таким вот образом
02:24:14
так значит дальше надо написать что я
02:24:18
там хочу вернуть const т давайте этом
02:24:24
присвоить ада и тут мы ничего не
02:24:27
засветим поэтому будем а сердить вот
02:24:29
таким образом сердце
02:24:34
так
02:24:39
так ой teams and
02:24:42
и что у него фант
02:24:46
как эта штука называется у мог бы
02:24:50
турфирма не так
02:24:55
понял
02:25:17
так пока я ищу короче как файл выглядит
02:25:20
давайте придумаем решение как можно
02:25:23
вообще тут без могу прожить
02:25:28
написать свои имплементация но это какая
02:25:32
себе история
02:25:41
ну все правильно чу но просто хранить
02:25:45
вектор
02:25:48
пассив используется
02:25:52
ну собственно да просто тут можно
02:25:55
подумать что на самом-то деле у нас этих
02:25:58
хищников не так и много да и поэтому
02:26:00
здесь мы действительно можем
02:26:01
использовать вектор хранить все напрямую
02:26:03
векторе без того чтобы осуществлять
02:26:05
поиск по мапе но поскольку мы сейчас это
02:26:09
все очень хитро скроем в реестре нас это
02:26:11
все устроит но на будущее мы просто
02:26:13
посмотрим как эти регистры будут
02:26:15
использованы дальше и но мы могу заменим
02:26:18
в конце концов на вектор пока мы идём по
02:26:21
пути наименьшего сопротивления
02:26:26
так
02:26:28
этом сендер
02:26:31
таким вот образом и
02:26:35
после того как мы его уже за нашли
02:26:39
его можно и
02:26:41
вернуть так а мы тогда лучше сделаем вот
02:26:44
как fine нам возвращает итератор
02:26:48
чтобы два раза не искать
02:26:56
но правильно тут конечно бы наверное
02:26:59
было использовать ключевое слово авто
02:27:02
но я этого чет очень не хочу делать хотя
02:27:06
сейчас ладно покажу вот и скажу
02:27:09
мне кажется так его приезд не помню на
02:27:13
лекция про это говорил или нет но вода
02:27:14
не
02:27:15
кажется говорил так короче
02:27:20
нам нужен com'st поэтому нас вполне
02:27:23
устроит и const итератор
02:27:28
итератор и
02:27:31
присвоить ой там saint вот таким вот
02:27:33
образом и теперь мы должны засверлить
02:27:38
что эта штука не и
02:27:40
не равно items and и
02:27:44
если оно не равно этом цент его можно
02:27:46
разыменовать и вернуть
02:27:49
собственно сам ой там или
02:27:53
сделать вот таким вот образом то у него
02:27:55
есть штуку который называется second
02:27:57
почему ничего не подсказывает эта
02:27:59
загадка скорее всего где то вот здесь
02:28:02
что-то пошло не так
02:28:04
так общая идея заключается в том что но
02:28:08
зачастую вот такие вот страшные
02:28:10
конструкции писать очень неудобно но по
02:28:12
очевидным причинам до ужасные типы и
02:28:14
поэтому в современном си плюс плюс было
02:28:17
добавлено слово авто и компилятор может
02:28:20
выводить типы самостоятельно вот таким
02:28:23
вот образом но я опять же в большинстве
02:28:26
случаев не фанат этого дела потому что
02:28:28
читаемость кода очень сильно падает и
02:28:30
непонятно что вообще происходит но
02:28:34
сейчас этим очень часто и модно
02:28:36
пользуются мы этим пользоваться наверное
02:28:38
таки не будем и
02:28:40
так как он танцует лучше нажму и будем
02:28:43
писать вот такие страшные портянки
02:28:48
добавляет
02:28:51
разрешение в векторе будет что-то примет
02:28:55
рисованный да я согласен но
02:28:58
тут хотя бы вам не надо помнить что у
02:29:01
вас вот эта вот штука вот такая вот на
02:29:04
самом деле как с этим бороться с этим
02:29:07
бороться может например переопределяя
02:29:09
типы
02:29:11
тех контейнеров которые вы используете у
02:29:14
себя вот здесь но каким-то вот образом
02:29:21
например тут можно using писать можно
02:29:25
писать собственно тайпа 5 дек напишу
02:29:31
control иксом
02:29:34
правда сейчас тоже будет подстава сейчас
02:29:37
мы тоже увидим
02:29:38
си плюс плюс от язык подстав
02:29:42
этом см и
02:29:46
тогда вот этого можно не писать
02:29:50
становится все проще
02:29:51
как то вот так вот и
02:29:55
мы бы хотели написать вот так вот
02:29:58
anthems
02:30:01
мэп констатировать сейчас посмотрим
02:30:04
достала нам или не даст на первый взгляд
02:30:06
вроде бы дает и
02:30:08
может быть нам повезет а может быть и
02:30:11
нет сейчас узнаем когда все скомпилируем
02:30:17
так а мы тем временем что-то поместим в
02:30:21
этом
02:30:23
суть этого мы воспользуемся
02:30:25
перегруженной операцией
02:30:27
индексирование ну таким вот образом
02:30:31
так все готово я все еще не пойму почему
02:30:34
она мне подчеркивает 3g stay
02:30:41
походу дела так загрузку уровня
02:30:48
мэтт до храним здесь а вот другим
02:30:52
объектов у нас уже будет реже стрим
02:30:56
registry так давайте мы
02:30:59
сразу же на делаем type дефов и
02:31:04
pdf
02:31:09
объект
02:31:13
type a
02:31:17
идти
02:31:19
не нравится такое длинное имя
02:31:27
будем считать что мы знаем
02:31:31
но тогда будет непонятно
02:31:33
придется вот так
02:31:36
общий к той айди т
02:31:39
так это у нас будет чар
02:31:55
них а может быть мы прошли и не знаем
02:31:58
что обжиг той пойдет и tide
02:32:12
сразу жизнь станет легкой приятный
02:32:20
так и это будет у нас
02:32:26
объект
02:32:30
вот так вот а в реальности же два
02:32:34
параметра да я как раз сейчас на нем
02:32:36
раздумываю второй параметр будет
02:32:39
очевидно объектов диск или объект диск и
02:32:43
обязательно записать постоянный объект
02:32:45
type вот так вот а обжиг диск у нас
02:32:48
будет вот здесь
02:32:52
копчик тест
02:32:56
подумаем что тут должно быть но как
02:32:59
минимум один
02:33:01
тип
02:33:03
т.д.
02:33:05
ну и там всяких компоненты да
02:33:09
так вот вектор и флуд engine
02:33:19
таким вот образом
02:33:22
так
02:33:26
вот основная
02:33:28
в печаль которая связана с
02:33:32
плюсами у нас есть ссылки у нас есть
02:33:34
указатели да и надо постоянно думать что
02:33:38
является ссылкой что является указателем
02:33:40
и оказывается что на самом деле эти
02:33:42
штуки очень похожи и
02:33:45
как бы правильные решения принять шторы
02:33:47
в каком случае надо использовать на
02:33:49
самом деле не так то и просто
02:33:51
так
02:33:53
in cloud i included мы будем ловить
02:34:00
так как давайте сделаем ладлоу
02:34:15
так
02:34:17
к нам не нужен
02:34:21
так ну все по
02:34:24
старинке
02:34:26
нам нужен здесь и в stream
02:34:44
extreme
02:34:47
назову его просто им и ну либо там
02:34:51
никакой game назвал gun
02:34:57
game файл вообще нас ну значит будет
02:35:01
воевал файл
02:35:06
так level файл file name
02:35:15
проверим
02:35:17
если не
02:35:23
ну и вот здесь поскольку мы возвращаем
02:35:26
указать мы можем смело вернуть null птрк
02:35:29
что будет означать что файл по какой-то
02:35:32
причине загрузить не удалось
02:35:37
так далее
02:35:44
далее неплохо почитать формат
02:35:49
[музыка]
02:35:56
значит мы будем
02:35:59
но опять же проблема почему плохо
02:36:03
возвращать указатель и на самом деле
02:36:06
абсолютно непонятно кто эти указатели а
02:36:08
лоцируют еще с ними делать дальше и
02:36:11
и семантики языка это абсолютно никаким
02:36:13
образом не следует
02:36:16
мы естественно будем его выделять при
02:36:18
помощи new но удалять этот указатель
02:36:22
должен будет кто-то кто эту функцию
02:36:25
вызывает это в принципе очень нехорошо и
02:36:28
неправильно поэтому мы бы могли наверное
02:36:31
сделать шарик бтр какой-нибудь это было
02:36:35
бы более адекватным решением ну либо
02:36:38
переделать дизайн да и ловил диск
02:36:41
хранить каким то другим образом
02:36:43
надо думать что лучше вы наверное пока
02:36:48
оставим так как есть но вот про этот
02:36:50
косяк в дизайне да надо постоянно
02:36:52
помнить в других языках дайте по той
02:36:54
возрасте sharp или я вот такой проблемы
02:36:56
нет потому что все подчиняется сборки
02:36:58
мусора может быть вообще имеет смысл это
02:37:00
дело в какой-то глобальной переменной
02:37:02
хранить покороче надо
02:37:05
думать мы будем пока просто лоцировать и
02:37:07
возвращать
02:37:09
указатель
02:37:11
да для меня как для человека с миром
02:37:14
шортов не очень понятно как лучше
02:37:16
стремиться не возвращайся указатели в
02:37:18
принципе и вот весь менеджмент
02:37:21
определять там где и была создана объект
02:37:24
в целом да иначе вы просто этот
02:37:27
указатель не потеряете и ну как бы из
02:37:30
семантики языка вообще никак не следует
02:37:32
что с этим указателем делать да и
02:37:34
поэтому действительно ну как то лучше
02:37:36
наверное его
02:37:38
либо пусть
02:37:41
аллоцировать тот кто вам этот параметр
02:37:43
передает и вы будете его заполнять и
02:37:46
кстати вот vin opel практически весь
02:37:47
построен по этому принципу да если
02:37:50
кому-то что-то надо зал nazir уйти
02:37:52
снаружи вызовите мы этот буфер заполним
02:37:55
но и вы потом его сами удалите хотя но
02:37:57
есть некоторые функции или там
02:37:59
специально в ремарках пишут что вы
02:38:01
должны после того как с этим возвращаем
02:38:03
значение поработайте вы должны вот таким
02:38:05
вот образом удалить а с другой стороны
02:38:08
можно пользоваться умными указателями в
02:38:12
си плюс плюс вот они в частности для
02:38:14
решения этой проблемы были придуманы то
02:38:16
есть
02:38:17
более красивое решение было бы
02:38:20
возвращать у этой функции шарит поттер
02:38:25
таким вот образом и
02:38:28
аллоцировать именно шарик бтр на этот
02:38:31
объект ну и тогда вы этот объект
02:38:33
совершенно точно не потеряете если вы
02:38:36
что-то вернете и это значение нигде не
02:38:40
запомните на просто вызовите отловил без
02:38:43
запоминания возвращаемого значения
02:38:45
компилятор автоматически в нужный момент
02:38:48
вы заведут инструкторы освобождения
02:38:50
памяти и все будет хорошо если же вы
02:38:53
просто вернёте сырой указатель и ничего
02:38:55
не сделаете да ну понятно в эту память
02:38:57
потеряете короче это супер печальная
02:39:01
проблема и этого единого решению этой
02:39:03
проблемы нет там везде решают все
02:39:05
по-разному нам надо придумать то как бы
02:39:08
мы хотели это делать и но на самом деле
02:39:12
у меня нет мнения как это делать именно
02:39:14
здесь вообще я бы отказался бы от всех
02:39:17
вот этих вот поттеров всего прочего
02:39:20
хранил бы это делал наверное как-то
02:39:22
глобально до в каких-то глобальных
02:39:24
данных но сейчас просто не очень понятно
02:39:29
как это должно выглядеть и поэтому как
02:39:31
сейчас начнет возвращать ладно давайте
02:39:33
мы чисто для того чтобы
02:39:35
посмотреть как работать шарит потерями с
02:39:38
ними поработаем но я прям супер не фанат
02:39:43
это делать в этом контексте так sharing
02:39:51
птрд вал диск вот таким вот образом
02:39:56
так
02:40:00
он нам говорит что нужно нет ничего не
02:40:04
нужно все хорошо так шарит поттер ловил
02:40:08
диск
02:40:10
здесь но у поттер в теории должен
02:40:12
конверта луца от проблемы нет а вот
02:40:15
теперь нам надо создать ризал
02:40:27
так и лил его как угодно
02:40:31
или диск вот так вот так и
02:40:35
в std
02:40:38
есть вот такая штука майк шарин
02:40:41
шаблончик который позволяет
02:40:44
очень удобно создавать
02:40:48
различные типы указателей давайте на
02:40:50
него посмотрим себе но то груз не
02:40:53
различные типы а только шарит поттер но
02:40:56
поскольку это шаблон да сам объект может
02:40:59
быть любого типа
02:41:00
так мучает
02:41:15
соответственно вот так вот это выглядит
02:41:18
если мы там хотим вызывать какие-то
02:41:21
конструкторы конструкторы с какими-то
02:41:23
аргументами мы тоже можем сделать таким
02:41:26
вот образом ну и
02:41:28
вот как это выглядит
02:41:31
непосредственно в коде
02:41:36
здесь мы хотим создать майк shared для
02:41:40
двд зко
02:41:43
мы это делаем вот так ну и все теперь
02:41:47
этой штукой можно пользоваться как
02:41:49
обычным указателям и он никогда не
02:41:52
потеряется
02:41:55
так поехали
02:41:58
надо прочитать и так level файл
02:42:10
бисквит
02:42:15
бисквит
02:42:17
далее надо прочитать саму карту размеры
02:42:21
карты мы знаем прежде чем читать карту
02:42:24
читать карту мы будем векторе
02:42:25
индексировать вектора мы будем ну точно
02:42:27
так же как мы это делали раньше да и
02:42:29
тогда у нас кстати естественным образом
02:42:31
получаются
02:42:32
идентификаторы
02:42:34
там инстансов но это будет важно когда
02:42:37
мы будем инстанциировать эту штуку на я
02:42:39
говорю сейчас мы посмотрим может быть
02:42:41
как то мы что-нибудь за оптимизируем так
02:42:45
и
02:42:46
просто почему мы за оптимизирую потому
02:42:48
что очевидно для реальной игры это
02:42:50
слишком большая рушка роскошь хранить 2
02:42:52
описания уровней в
02:42:56
памяти то есть виде вот такого диска как
02:42:58
мы сейчас делаем собственного all state
02:43:00
и где этот уровень дублируются но именно
02:43:02
поэтому
02:43:03
когда играли в игры наверное очень часто
02:43:06
замечали что когда вы жмете кнопку типа
02:43:09
restart level и еще что то такое делаете
02:43:11
да вот в том же соус и умираете и
02:43:13
начинаете заново уровень целиком
02:43:15
перезагружается собственно поэтому
02:43:18
не целиком дата возможно текстуры что-то
02:43:20
не перезагружается но как минимум
02:43:21
логическое описание уровня вот то что
02:43:23
сейчас у нас лежит файл txt мной
02:43:25
перезагружается очевидно вот именно по
02:43:27
этой причине что проще один раз
02:43:28
загрузить и сразу создать вал стоит на
02:43:31
основе того что есть файле чем отдельно
02:43:34
его читать но и вот так вот использовать
02:43:36
у нас тут получается что немножко вот
02:43:38
эти два понятия как-то смешанная может
02:43:40
быть мы действительно будем с функцией
02:43:42
ладлоу возвращать типа два аргумента да
02:43:45
будем возвращать текущей вал state
02:43:47
проинициализирована и в котором будет
02:43:49
храниться начальное состояние вот этого
02:43:51
вот уровня и будем возвращать
02:43:54
список game объектов который будет
02:43:57
универсальной но либо там какая-то
02:43:59
странная комбинация пока говорю это не
02:44:01
очень понятно мы сделаем вот тогда потом
02:44:04
в процессе а3 факты так
02:44:09
читаем короче
02:44:11
начал говорить об одном и забыл о чем
02:44:14
так вот поскольку мы совершенно точно
02:44:17
знаем сколько мы чего должны прочитать в
02:44:20
вектор до который будет хранить все
02:44:23
символы и все gem объекты в нашем уровне
02:44:26
мы должны этот вектор не обязаны как бы
02:44:29
то должны
02:44:31
установить правильный размер если мы
02:44:33
этого не сделаем соответственно
02:44:36
размер будет установлен автоматически
02:44:39
каждый раз когда мы будем туда что-то
02:44:41
push бегать а
02:44:42
но это не всегда эффективно почему как
02:44:45
раз в следующую субботу мы разберемся
02:44:49
короче устанавливаем размер причем
02:44:52
установим размер мы тоже немножечко
02:44:53
хитро сейчас увидим как так делаем
02:44:56
короче вот так диск
02:44:58
мы
02:45:00
словом об тут
02:45:02
имеет очень неприятный смысл лучше бы
02:45:05
его как-нибудь
02:45:08
как-нибудь заменить потому что мы об
02:45:11
этом как бы мы по стандарту библиотеки
02:45:14
да поэтому мы сейчас придумаем как бы
02:45:17
нам его перья позвать итак мы просим за
02:45:22
аллоцировать память и достаточного
02:45:25
достаточной для хранения
02:45:29
всех наших файлов
02:45:32
давайте это так называть
02:45:36
можно кстати ржд укуталась назвать ну
02:45:38
ладно и теперь мы можем это делать
02:45:41
читать у нас в
02:45:45
глава формате еще сначала параметры где
02:45:49
пол года спасибо сейчас мы их тоже
02:45:51
прочитаем
02:45:56
вот так вот и читаем дефолтные параметры
02:46:02
так диск
02:46:06
назовем их как бы их назвать ну давайте
02:46:10
так и назовем дефолт и дефолт bg самом
02:46:15
деле как то надо их будет может быть
02:46:18
более внятно хранить пока так
02:46:24
[музыка]
02:46:29
а у нас эти штуки там uint8 были до
02:46:35
или color ты как у нас она называлась
02:46:37
все забыл где гондар
02:46:44
хлор т и
02:46:50
вот тут уже хочется этот color
02:46:53
куда-нибудь перенести так
02:46:56
просто взял включать render наверное не
02:47:00
очень правильно да
02:47:03
чтобы было раньше курица или яйцо
02:47:06
давайте считать что
02:47:09
что раньше что-то было
02:47:15
раньше был engine
02:47:20
это кстати великая проблема
02:47:23
все пятачок чего что включить так чтобы
02:47:26
не было кольцевых зависимости и все было
02:47:28
там где нужно
02:47:32
очевидно in color понятно но хотя
02:47:36
наверно мы можем render считать корнем в
02:47:37
наши render разделен до есть такой есть
02:47:40
такой и давайте действительно мы без
02:47:42
лишнего
02:47:46
считать два файла рендер и engine
02:47:49
корневыми и самые-самые корневые наши
02:47:53
вещи мы будем помещать в них но
02:47:54
зависимости от смысла что имеет туда и
02:47:57
сюда да а
02:48:02
более специфичные вещи соответственно
02:48:05
будем помещать в определенные файлов и
02:48:07
как мы для level и делаем и включать
02:48:09
соответственно их в них вот так вот
02:48:13
так color temp
02:48:17
дефолт bg и
02:48:20
color temp дефолт впг
02:48:24
таким образом
02:48:27
так
02:48:33
прочитали
02:48:34
далее начинаем читать тайлы количество
02:48:38
тайлов у нас весна heights
02:48:40
зарезервировали
02:48:46
entails и теперь начинаем читать тут все
02:48:50
не просто так for in
02:48:54
g
02:48:55
присвоить
02:49:02
0
02:49:05
меньше
02:49:09
чего же меньше ахейцам
02:49:16
вот так вот
02:49:18
плюс плюс g
02:49:23
далее
02:49:26
им
02:49:28
присвоить 0 у
02:49:30
не меньше
02:49:35
виться
02:49:37
+ + и
02:49:40
так может оказаться
02:49:43
что-нибудь не то но мы про это сейчас
02:49:46
все узнаем так
02:49:50
чар кстати там есть redline и может быть
02:49:55
redline нам бы помог у
02:49:56
[музыка]
02:49:58
у
02:49:59
диска до так точнее уловил файла
02:50:03
как это называется-то
02:50:13
ну вот это как раз история про локацию
02:50:16
памяти до мы можем прочитать всю строчку
02:50:19
из потока ввода только мы обязаны
02:50:22
передать буфер достаточного размера
02:50:24
чтобы он туда поместился но и вот как
02:50:28
раз можно менять били куда там пункт тут
02:50:30
тоже есть проблема с делимым связано и с
02:50:33
тем что у
02:50:34
нас в качестве д'алема по умолчанию для
02:50:38
чтения строк используются пробела
02:50:40
поэтому можно прочитать по умолчанию
02:50:43
только строчку без пробела
02:50:45
это нехорошо но мы можем и кстати мне
02:50:48
кажется beltline был какой-то перегрузка
02:50:51
которой отчитывала прям непосредственно
02:50:53
из т.д. string но мы не знаю что этот
02:50:56
нам сделать или нет так мы можем
02:51:00
как-нибудь
02:51:01
это дело обыграть
02:51:07
поскольку мы знаем ширину буфера мы
02:51:10
можем этот буфер ну как бы сами за
02:51:14
аллоцировать и в этот beltline
02:51:15
передавать в качестве длину мы будем
02:51:17
передавать символ королев ну там слышен
02:51:20
который будет считывать нам всю строку
02:51:22
до конца но стандартный вопрос откуда
02:51:26
взять этот самый кучер да давайте его
02:51:29
откуда-нибудь возьмем так std
02:51:33
вектор
02:51:34
вектор шар
02:51:39
буфер ну тут тут его хотя бы можно не
02:51:42
освобождать так в буфер там должен быть
02:51:45
параметр типа
02:51:48
количество элементов да вот таким вот
02:51:51
образом я
02:51:52
закон скаут и без значений
02:52:04
упс ну типа вот такой что-то нам важно
02:52:07
помочь ладно так нам размер известен
02:52:09
размер with
02:52:12
control
02:52:15
center в количество элементов у нас ну
02:52:20
тоже в целом известно да а количество
02:52:22
элементов сколько у нас
02:52:24
смысле количество элементов а начальный
02:52:27
элемент так начальный момент вас будет
02:52:30
ноль
02:52:32
так вот все
02:52:35
так буфер есть теперь этот буфер можно
02:52:38
прочитать
02:52:46
так beltline
02:52:51
буфер
02:52:53
да там ну либо вот так либо можно
02:52:57
прочитать в буфер
02:52:59
собственно взяв указатель на его нулевой
02:53:03
элемент вот это вот штука в стиле си
02:53:05
хотя там немножко все нет так количество
02:53:09
этом в которой мы читаем это да диск
02:53:11
vitz
02:53:16
бисквит и
02:53:18
милиметр у нас будет слышен как
02:53:23
то вот так
02:53:26
после того как прочитали надо все эти
02:53:29
символы скопировать в карту
02:53:33
давайте-ка это сделаем
02:53:38
ну мы воспользуемся стандартной
02:53:41
библиотекой там есть алгоритм который
02:53:43
называется копия он копирует
02:53:47
кусочек
02:53:49
буфера ну так заключенные между двумя
02:53:52
операторами но у нас есть хорошо в
02:53:55
векторе начало и конец до в качестве
02:53:57
двух операторов беден and в какой-то
02:54:01
итератор сейчас мы увидим как он
02:54:03
называется так std копия короче
02:54:09
буфер
02:54:12
bigint
02:54:18
buffering
02:54:22
так и теперь как мы будем вставлять нам
02:54:25
нужно вставлять в конец нашего вектора в
02:54:29
память тому же зарезервировано при
02:54:31
помощи ltorelles это все будет хорошо и
02:54:34
для того чтобы получить iterator который
02:54:37
умеет вставлять в конец какого-то
02:54:38
вектора мы воспользуемся стандартным
02:54:40
модератором который называется back
02:54:42
insert are
02:54:44
back in certain
02:54:49
собственно куда конкретно
02:54:52
да он в контейнер а контейнеры тут у нас
02:54:55
называется диск мэтт
02:54:58
вот таким образом так ну что эта штука
02:55:02
делает итак мы берем
02:55:04
некоторый
02:55:05
диапазон
02:55:07
которые находятся между двух операторов
02:55:10
beginner and это собственно полностью
02:55:12
все что содержится в некоторых буфере
02:55:14
дата вот это некоторый вектор и буфер и
02:55:16
при помощи
02:55:18
постоянных вызовов узбек да мы вставляем
02:55:22
в конец вот этого vector map и
02:55:25
вот этого интерната рыбакин сортер то
02:55:28
что находится в соответствующей позиции
02:55:31
ну не знаю что на самом деле лучше
02:55:34
читается обычный
02:55:37
цикл то есть мы помогли это скопировать
02:55:39
в цикле но для того чтобы смотреть как
02:55:42
это можно сделать в средствами
02:55:43
стандартов блеать эти дамы и воды
02:55:45
сделали собственно таким образом так все
02:55:48
это мы делаем для всех строк тут еще
02:55:50
подстава связаны с чтением линии сейчас
02:55:53
мы посмотрим избежали бы ее или нет так
02:56:00
все черных там дальше идет полуовал
02:56:03
файлу дальше павел файл у нас идет
02:56:06
описание считывания описаний объектов до
02:56:11
н обжиг
02:56:14
мы их храним было бы ли или нет мы их
02:56:20
ловли не храним потому что мы всегда
02:56:22
можем получить количество объектов из
02:56:25
регистра да но но или реестра но это на
02:56:29
самом деле нам нигде не надо поэтому
02:56:30
даже такой метод низвели это нужно
02:56:32
сейчас только при чтении и так считываем
02:56:36
level файл
02:56:40
inject
02:56:43
так и теперь надо считывать описание
02:56:46
каждого объекта
02:56:49
поскольку описание каждого объекта это
02:56:51
достаточно сложная штука мы для этого
02:56:53
сделаем отдельный reader только потом
02:56:57
давайте уже запустим и посмотрим нигде
02:57:00
ли бы не до косячили то есть мы просто
02:57:02
считали ноги потом будем считывать
02:57:04
описание хотя другой стороны пока в
02:57:07
описании у нас есть только так вот
02:57:10
айдишники дамы в целом можем сделать
02:57:13
течение о хищниках и тайме так то и
02:57:15
сложно
02:57:17
ладно потом сделаем сначала за пустимся
02:57:19
и посмотрим
02:57:21
так что мы делаем мы должны вставить в
02:57:26
где ему
02:57:29
вот сюда
02:57:31
инициализацию
02:57:33
считывание
02:57:35
уровня так пока мы будем уровень хранить
02:57:39
видя тоже глобальной переменной
02:57:45
вот здесь std
02:57:48
шарят
02:57:52
шарит
02:57:55
птрд был дисках
02:58:01
желал
02:58:05
так и
02:58:07
надо его за included
02:58:14
все
02:58:17
где минете мы будем этот уровень
02:58:20
учитывать давайте я пока
02:58:23
потом мы сделаем так чтобы
02:58:26
вот этот самый level файл считывался из
02:58:32
game а то будет ими уровня да и моего
02:58:38
кстати общем у карпат он давайте хоть
02:58:41
хоть что-нибудь сделаем сейчас так как
02:58:44
мы это будем делать мы это будем делать
02:58:46
вот таким вот образом
02:58:49
const чат
02:58:55
const char
02:58:58
game
02:59:03
gear
02:59:06
так
02:59:11
send с
02:59:18
game
02:59:19
master ладно не будем плохие практике
02:59:24
применять
02:59:25
gave in game txt
02:59:29
так теперь нам нужна функция и это уже
02:59:32
выглядит так что вот это должно уехать в
02:59:35
engine control x
02:59:45
так
02:59:52
почему так все плохо
02:59:55
std string
03:00:01
с
03:00:03
файл не
03:00:06
так и
03:00:09
передавать мы будем
03:00:13
т.д. почему я ту сказал что все так
03:00:16
плохо а все так плохо по той простой
03:00:19
причине что
03:00:21
я хочу ну там очевидно возвращать
03:00:25
какой-то текст из
03:00:31
функции get a sad file name эта функция
03:00:34
будет по имени файла там полный путь к
03:00:36
ней генерировать дан так вот вся
03:00:39
проблема заключается в том что я не могу
03:00:41
это нормально сделать потому что мне
03:00:44
нужно аллоцировать буфер
03:00:46
соответственно эту самую стринги
03:00:49
я должен возвращать но уверен у вот этот
03:00:53
буфер да я должен возвращать каким-то
03:00:54
управляемым образом управляемый образы
03:00:56
это std string очевидно да но тут тогда
03:00:59
возникает проблема в том что мне надо
03:01:02
передать что-то внятное в качестве
03:01:04
входного аргумента и получается так что
03:01:06
в качестве входного аргумента меня
03:01:08
всегда будут передаваться
03:01:10
предопределенные строки вот типа как у
03:01:12
меня сейчас есть там game full name и
03:01:13
все остальное хотят неверно да потому
03:01:15
что я что-то буду считывать из файла
03:01:17
короче ok
03:01:25
вот так вот name
03:01:29
где-то сет файлы
03:01:32
[музыка]
03:01:40
чтобы лишний раз не писать текст get
03:01:44
текста сад ванной вот это другое дело
03:01:46
так и
03:01:49
делай kontrol ц
03:01:52
трогаем
03:01:59
in cloud
03:02:07
тут надо за included string
03:02:17
так
03:02:25
вот это дело мы
03:02:33
так
03:02:37
а я уже скопировал потерял ладно
03:02:44
делает
03:02:47
тут есть печальная проблема нас есть
03:02:52
хоть что то гибнет печальных проблем
03:02:54
которая связана с тем что нам надо
03:02:57
как-то отформатировать строку и
03:03:00
я уже показал один способ это сделать с
03:03:03
буфером до
03:03:06
который у нас был в
03:03:12
том месте где мы показывали fps это было
03:03:15
в рендере мне кажется
03:03:17
здесь у нас есть стандартные строки и мы
03:03:20
в целом можем сделать точно так же либо
03:03:23
мы можем воспользоваться стандартной
03:03:25
библиотекой и классом string стрим
03:03:27
которая умеет
03:03:29
делать то же самое но уже типы в стиле
03:03:32
си плюс плюс фото форматирования давайте
03:03:34
его найду заговорил
03:03:36
это было форматирование в стиле сим
03:03:41
так вот такое вот да мы можем сделать
03:03:46
форматирование в стиле си плюс плюс но
03:03:49
чё-то мне эта идея не очень нравится
03:03:51
поэтому давайте ка мы
03:03:54
все сделаем по старинке этот уже
03:03:57
плакался что я не люблю стандартный ввод
03:03:59
вывод с и плюс плюс потому что он
03:04:01
максимально-максимально
03:04:03
мне не нравится так control в
03:04:06
соответственно мы сделаем буфер
03:04:08
максимальная длина буфера будет вот
03:04:11
такой на самом деле есть более
03:04:13
правильная максимальная длина буфера
03:04:15
поскольку мы работаем с
03:04:18
виндой винде есть такая константа
03:04:21
который называется макс паз и это
03:04:23
количество символов которые есть может
03:04:26
максимально быть в пути и имени файла он
03:04:29
261 учету раю не этого она равна вот и
03:04:33
правильнее было бы использовать конечно
03:04:35
же именно и idea но
03:04:38
сколько теория от практики у нас будет
03:04:40
отличаться
03:04:42
если вы хотели все плюс плюс стали
03:04:44
сделать там его использует стинг steam
03:04:46
правильности плюс плюс вы бы это сделали
03:04:47
при помощи strings 3 мая так вы бы
03:04:50
проблема у вас не было
03:04:52
мне просто в хавара ви не получилось
03:04:55
место где складываешь строки и как раз я
03:04:58
давала как и форматировать строку и
03:05:00
подумал что может из текстильных паша
03:05:02
идея на которые стало лень но
03:05:08
так вот вот там сейчас покажет как у них
03:05:10
примерчик мы
03:05:18
просто боюсь что так просто мы ничего не
03:05:22
увидим но база выйдет такая что вы
03:05:24
можете создать план давайте покажу
03:05:27
почему я тут все страдаю я с одной
03:05:31
стороны хочу показать какие-то разные
03:05:32
техники да а в другой стороны не хочу
03:05:34
чтобы у меня программа превратилась в
03:05:36
лапшу что для одного и того же в разных
03:05:39
местах используются разные техники это
03:05:41
очень такая себе история неприятное
03:05:45
главное давайте я попробую что-нибудь
03:05:48
сделать
03:05:52
так
03:05:54
stringbuilder да привет кого ты будешь
03:05:58
называться так это все дело находится
03:06:01
как нам подсказали в из стремян in club
03:06:05
с стрим вот таким вот образом теперь
03:06:10
меня значит есть этот самый
03:06:11
stringbuilder и в этот stringbuilder я
03:06:14
могу уже как мы это раньше делали что-то
03:06:17
печатать до для
03:06:20
нашего каталога соседками это будет
03:06:24
выглядеть вот таким вот образом так
03:06:26
asset потом ним потом
03:06:31
расширение txt
03:06:36
собственно все но
03:06:38
да можно плачущего водить можно я думаю
03:06:41
него водитель сам его флешмоб игре тером
03:06:44
соответственно с.б. и тут есть метод
03:06:48
который называется типу string или
03:06:49
как-то вот так вот стр
03:06:51
ивается
03:06:53
так вот
03:06:58
ну и вот собственно мы
03:07:02
отформатировали строку до в стиле си
03:07:07
плюс плюс получили там в результате
03:07:08
string но который вот будет вот такой
03:07:11
вот
03:07:12
интересный значок
03:07:15
берем вот так но если бы я это делал в
03:07:20
стиле
03:07:22
все
03:07:23
соответственно меня было бы вот так вот
03:07:25
здесь должна быть как я жесткого
03:07:27
правильная константа из windows mac спас
03:07:30
вот таким вот образом в том почему
03:07:32
подчеркиваем показывает ну ладно и
03:07:35
дальше я сюда я печатаю
03:07:43
club we нос и
03:07:48
вот так вот
03:07:52
что-нибудь
03:07:58
ушел надолго в себя
03:08:01
ладно и дальше я соответственно делаю
03:08:05
вот так вот
03:08:07
половых он показывает вот с таким
03:08:09
подчёркиванием и
03:08:11
вот и это он видит
03:08:14
почему интересно нет без подчеркивание
03:08:17
должно быть
03:08:19
ну да вот она 260 и сюда мы собственно
03:08:24
делаем формат
03:08:27
asset
03:08:29
процент с
03:08:36
так процент с . txt и сюда мы передаем
03:08:42
моим но уже не просто name a
03:08:45
sister из нее вот таким вот образом но в
03:08:49
c и бретер guf
03:08:59
как то вот так вот но с макс пасом
03:09:03
почему то он его там упорно подчеркивает
03:09:07
ладно оставим пока так вино я не хочу
03:09:10
завязывается внж ненави нос если вдруг
03:09:13
придется сделать чтобы было это зло мы
03:09:16
это оставим но пока ладно может быть
03:09:18
поэтому она там не протекает как то
03:09:21
какой способ использовать ну понятно
03:09:24
решать каждому самому вот эта вот штука
03:09:28
может быть лучше а может быть хуже не
03:09:31
понятно да с точки зрения
03:09:33
производительности вот эта штука хотя бы
03:09:35
нам понятно как работает поэтому мы
03:09:38
возможно остановимся на ней то но если
03:09:42
можно собственно использовать как я уже
03:09:44
показал так get текст asset file name мы
03:09:49
теперь можем использовать в гейме
03:09:53
ради чего все затевалось
03:09:56
один файл нас game txt так get
03:10:02
текст asset
03:10:06
file name кто придумал это имя функции
03:10:11
вот кроме того тут есть еще несколько
03:10:13
неприятных моментов до связанных с тем
03:10:16
что
03:10:17
вот эта строчка теперь будет
03:10:20
копироваться и заворачиваться в std
03:10:21
string там где это не нужно но как бы
03:10:24
вот в этот момент это абсолютно неважно
03:10:26
да с точки зрения производительности мы
03:10:27
как раз вот в этих ситуациях про это
03:10:30
можем не думать да поэтому нас
03:10:33
целом устроит tags и теперь мы хотим
03:10:37
level файл считывать из game адам чтобы
03:10:40
у нас хоть что-то была приличная они
03:10:43
потом давайте мы тогда договоримся что у
03:10:46
нас но пока вот это второй строкой будет
03:10:48
а потом мы это сделаем т.е. строкой
03:10:50
который надо будет соответственно имя
03:10:53
файла уровня вот так вот лавал один так
03:10:57
и мне это дело нужно написать в гейм
03:11:00
формате
03:11:03
закрою
03:11:06
game формате соответственно воевал file
03:11:10
name он не содержит пробелов поэтому его
03:11:13
можно считывать
03:11:14
у стандартным читателям
03:11:17
так
03:11:20
учета на все пощелкал пока челку думал о
03:11:24
нет ли стандартного читателя строки то в
03:11:27
конечном итоге мне кажется был но я не
03:11:29
помню как он назывался
03:11:32
ну-ка
03:11:35
стрим
03:11:38
им
03:11:48
ну спасибо перегруженная перхоть
03:11:50
перегруженный оператор нам пойдет в том
03:11:53
случае если у нас строка не содержит
03:11:55
пробелов да вот в данном контексте у нас
03:11:57
строка не содержат пробелов и ладно
03:12:00
давайте тогда мы его и по пользуем tags
03:12:07
std string я там попутал слай нам ну
03:12:13
ладно так std string
03:12:17
главным
03:12:18
вот так вот и читаем его game файл
03:12:25
файл в волны им все прочитали теперь
03:12:30
надо загрузить до текущей ловил tak je
03:12:34
le vole присвоить лот
03:12:39
дьявол
03:12:41
из
03:12:46
текст
03:12:49
с моим
03:12:53
умным так теперь у нас есть другая
03:12:56
проблема то что у одного принимает
03:13:01
кантор мы раз уж связали с этой истории
03:13:06
со строками
03:13:09
будем последовательным
03:13:13
tags
03:13:23
все есть контакт
03:13:32
получается будем game файл переписывать
03:13:34
если мы там до какого-то нового уровня
03:13:36
дошли и схоронили я играл но на самом
03:13:40
деле тут надо будет подумать что с этим
03:13:43
делать потому что наверняка тут должен
03:13:45
быть но должно быть описание стартового
03:13:48
уровня а когда мы будем сохранять игру
03:13:50
мы будем его сохранять каком-то другом
03:13:52
месте и переписывать мы будем не game
03:13:54
файл файл сей вода из файл c и вычитать
03:13:57
имя текущего уровня но мы пока до этого
03:13:59
не дошли но в любом случае да то что вот
03:14:03
мы сейчас делаем загрузку из какого-то
03:14:06
файлов каким-то именем она так или иначе
03:14:07
нам в какой-то момент поможет да
03:14:12
так
03:14:17
значит загрузили уровень давайте уже
03:14:19
посмотрим как это все не работает
03:14:24
так пока вы компилируется на секунду
03:14:27
отлучусь
03:16:06
пришел и увидеть что оно все работает
03:16:09
она даже не компилируется и
03:16:15
чинить у
03:16:20
меня подсказывает что типа когда я пишу
03:16:23
вот эту штуку и по я должен написать так
03:16:26
вот
03:16:36
бой
03:16:38
так отлично
03:16:41
далее
03:16:44
смотрел-смотрел думаю почему же он не
03:16:46
его подчеркивает
03:16:48
поэтому подчеркивает так
03:16:52
миллиард ошибок исправили парочку
03:16:55
перекомпилировать и посмотрели
03:17:11
этот как раз та штука про которую я
03:17:13
говорил да что есть вот такая вот
03:17:15
подстава все плюс плюс
03:17:19
он не может распарсить вот это выражение
03:17:22
насколько я понимаю и потому что он не
03:17:25
понимает что вот эта вот штука является
03:17:27
именем типа относительно вот этого имени
03:17:30
и чтобы вот такие проблемы решать есть
03:17:33
специальный синтаксис супер ужасный вот
03:17:37
такого вида который скажет что вот вся
03:17:39
эта конструкция
03:17:41
const эти ротар относительно нашего т.д.
03:17:44
в этом smeb является именем типа это
03:17:47
говорит вот это ключевое слово платит
03:17:50
проверим
03:17:56
ну вот все подчинилась
03:18:01
идут вопрос до чего мы выиграли от того
03:18:06
что мы использовали вот этот pdf по
03:18:09
отношению к
03:18:10
начальному из pdf doc если мы
03:18:13
использовать вот этот stm то тогда так
03:18:15
нам бы использовать было не надо и он
03:18:19
нас так вот наталкивает на идею что
03:18:21
наверное все таки надо использовать
03:18:23
ключевое слово в то и не париться
03:18:26
так как у нас там беда с шарит поттером
03:18:29
шарит паттерн беда такая что мы его не
03:18:32
сказали
03:18:34
откуда у за included
03:18:38
он должен находиться в мемори
03:18:53
а
03:18:57
вот это неприятная история сейчас
03:18:59
посмотрим на нее
03:19:04
хоть у кого-то мне кажется включен
03:19:07
микрофон
03:19:08
это
03:19:16
игры
03:19:25
где моя точка останова ничего не
03:19:28
сработало так и видимость
03:19:32
так товарищи у кого-то включен микрофон
03:19:34
пожалуйста обратите на это внимание
03:19:46
так давайте посмотрим там есть ощущение
03:19:49
что get текста set vol ним что-то не то
03:19:51
нам печатает
03:19:54
так
03:19:57
в буфере у нас строчка asats
03:20:06
game txt txt
03:20:13
понятно
03:20:20
в идеале расширение наверное тоже
03:20:22
вынести константу какой-нибудь но тут
03:20:25
типа то поменять да можно это сделать у
03:20:28
нас это скрыто за функции гид текста set
03:20:30
for name поэтому мы как бы
03:20:34
там получается все будет надо вынести в
03:20:37
константы дала мы
03:20:40
короче скрыли все внутри функции и
03:20:42
сделали вид что так и надо
03:20:45
правда был странным можно вот здесь этот
03:20:48
гейм написать один раз он все равно
03:20:50
больше это константа нигде не нужно
03:20:53
так
03:21:00
ну чё то там
03:21:02
неизвестно открылась не открыл из ладно
03:21:05
открылась уран так у нас значит есть вот
03:21:09
это и вот это теперь мы считываем ловил
03:21:11
name
03:21:13
считали это level 1 и теперь мы начинаем
03:21:16
загружать уровень давайте сразу поставлю
03:21:19
точку останова на ладлоу
03:21:26
так файлы у нас a social один txt все
03:21:30
похоже на правду
03:21:32
так
03:21:34
создались читали у нас теперь должны
03:21:37
быть заполнены давайте смотреть что она
03:21:39
заполнена в этом ловили вот unravel файл
03:21:42
так чтобы зачем милого фармила диск
03:21:45
нужен вот он
03:21:46
вот здесь у нас есть
03:21:50
данные от шарит поттера да мы на них
03:21:54
внимания обращать не будем мы сразу
03:21:56
будем смотреть на то что там у нас
03:22:00
считалось считалось у нас что то нет а
03:22:03
потому что я очевидно в файле
03:22:07
ну ка я не написал соответствующее
03:22:09
константы до
03:22:13
а по умолчанию у нас там идет
03:22:17
дефолтов обеды фунт bg дефолтов ага у
03:22:20
нас будет
03:22:23
вот думаю а в каком формате написал у
03:22:27
нас будет описание рендера pg pg до
03:22:29
всегда хорошо так значит 70 вот так вот
03:22:34
и сейчас мы можем кликнуть в историю в
03:22:37
очень неприятную сейчас мы у нее
03:22:39
посмотрим тоже
03:22:41
связанную с тем что
03:22:44
это все можно снять
03:22:49
чем является uint8 т
03:23:01
внимательно смотрим на дефолт в г дефолт
03:23:04
б.г. кто объяснить что за безобразие
03:23:07
произошло
03:23:08
мое забыли код 0 вы чуть от нуля за были
03:23:14
вычесть а с чего мы его вообще должны
03:23:16
быть читать ну потому что на его как чар
03:23:19
воспринимает они как число до но
03:23:22
мы-то невинные агнцев
03:23:27
написано внутри
03:23:29
капучинатора но я просто хотел как раз
03:23:32
сказать про
03:23:35
несоответствие ожиданий результату да
03:23:37
вот смотрите
03:23:39
так кто помнит где-то объявлена бренда
03:23:42
ряда
03:23:43
вот смотрите мы сказали что color т это
03:23:47
uint8 т это fix it says in так вопрос
03:23:52
почему когда я начинаю использовать
03:23:54
операции там вот в частности поместитесь
03:23:58
извлечь из потока но и там поместить в
03:24:01
поток эта штука трактует фиксации int
03:24:05
который в стандарте написан что это int
03:24:07
который размер 8 бит почему он его
03:24:10
трактует как чар а потому что ну как вы
03:24:14
правильно сказали нижележащий тип или
03:24:16
тот тип для которого этот той gf
03:24:18
определен это онлайн от чар и поскольку
03:24:22
компилятор си плюс плюс не видит что это
03:24:25
on-site чар игре он не видит что это int
03:24:28
который ну типа в стандарте считается in
03:24:31
том а он видит что я танцевальный чар он
03:24:34
ведет себя так же как будто это был бы
03:24:37
антенны чар и поэтому он вместо того
03:24:40
чтобы считать целое число то есть вот то
03:24:43
что мы бы ожидали получить он считывает
03:24:45
но вот код этого символа он считывает
03:24:48
его именно как символ и но понятно что
03:24:51
мы понимаем эту проблему все дела но это
03:24:54
очень мощное нарушение семантики того
03:24:57
что они сделали в стандарте в своем же
03:25:00
самом стандарте вот мне интересно если
03:25:01
дефекты рапортом эту тему потому что она
03:25:04
у меня вот лично бы
03:25:06
голова бы от этого взрывалась так
03:25:09
давайте думать как с этой проблемой жить
03:25:11
наверное надо читать ему ты
03:25:14
ну и соответственно уже потом это
03:25:18
значение приводить щас мы попробуем это
03:25:20
сделать напрямую
03:25:22
так это было все лавля
03:25:26
напрямую написать вот здесь приведение
03:25:29
типов крутую но естественно ничего не
03:25:32
получится у нас с этим поэтому надо
03:25:36
будет завести им прочитать им то потом
03:25:38
это дело
03:25:39
соответственно сохранить так о чем нам
03:25:42
подчёркивает покажет код ошибки
03:25:55
короче так вот он не умеет давайте
03:25:58
попробуем сделать вот что
03:26:04
так int дефолт пгм и
03:26:10
дефолт б.г.
03:26:25
так и в вест теперь их надо переписать
03:26:28
при этом мы получим еще и ошибку но не
03:26:32
за не ошибка мы получим варнинг сейчас
03:26:35
мы посмотрим и
03:26:41
решим чуть нам с ним делать так конга
03:26:45
фолд в г
03:26:46
писать давайте кстати вот отсюда беру
03:26:49
просто ведь это фол то что меньше
03:26:50
печатать ведь уже не печатал
03:27:05
так как и наконец-то bg
03:27:08
кажется стирал больше чем
03:27:28
они там все устраивает
03:27:35
пропил 1
03:27:43
так теперь поскольку эти штуки int и int
03:27:47
и он уже читать умеет правильно да
03:27:49
потому что есть перегруженная версия вот
03:27:51
этого оператора извлечь из потока
03:27:52
которая реально работает с антон
03:27:55
так ну и все собственно
03:27:59
только я тут cut опечатался неприятно
03:28:03
вот так вот ну и в результате сейчас
03:28:07
увидим что в б-га тоже будет правильное
03:28:08
числом
03:28:12
так мы получаем
03:28:14
но вот такую штуку
03:28:17
там уже хранятся правильные числа одну
03:28:21
перезапущу каким
03:28:32
вот а то про что я говорил я на самом
03:28:35
деле ожидал получить сообщение о
03:28:38
преобразование типов с сужением потому
03:28:41
что мы присваиваем значение которое
03:28:44
хранится в ин-те это значение обладает
03:28:47
намного большим диапазоном чем то
03:28:48
значение которое хранится вот здесь в
03:28:52
uint8 т ну или там vans аль начале это
03:28:55
соответственно но от 0 до 155 и выводить
03:28:59
этом от минус 2 миллиардов до плюс 2
03:29:01
миллиардов и в теории вот такое
03:29:02
преобразование оно не должно быть
03:29:05
допустимо
03:29:07
по умолчанию по умолчанию допустимы
03:29:10
только преобразование с расширением и
03:29:12
даже при вот таких присваивания я ожидал
03:29:14
что он мне скажет что так делать нельзя
03:29:17
и я получу
03:29:19
мне потребуются явно привести тип
03:29:22
возможно надо уровень предупреждения
03:29:23
поднять чтобы это увидеть
03:29:26
так окей что там дальше будет
03:29:31
ну и все то есть теперь 0 и 7 все хорошо
03:29:35
так давайте теперь считаем тайлы значит
03:29:39
тайлов у нас понятным 288
03:29:42
зарезервировали память и начинаем
03:29:44
работать с вектором итак у меня
03:29:47
образовался буфер вот он размер этого
03:29:50
буфера по ширине
03:29:53
строки до 24 символа вот они и мы
03:29:58
считываем так щит его им
03:30:02
что-то в этот буфер что-то ничего мы не
03:30:05
считали судя по тому что я вижу сейчас
03:30:09
будем разбираться почему
03:30:16
где то есть еще одна неприятная проблема
03:30:20
связана эта проблема с тем
03:30:23
так у кого есть какие идеи с чем
03:30:43
еще где-то и память порушили с этим
03:30:47
разберемся
03:31:00
почему вот этот вызов нам не вернул не
03:31:03
какую строку хотя должен был бы это
03:31:05
сделать
03:31:21
тишина дело в том что у
03:31:24
нас сейчас
03:31:28
в потоке ввода находится не прочитанный
03:31:32
символ слышим то есть мы прочитали все
03:31:34
до него записали вот эти int и ну
03:31:37
соответственно на
03:31:38
[музыка]
03:31:40
переменные и у нас поток воды сейчас
03:31:43
позиционирован на
03:31:44
собственно вот этот символ слышим и
03:31:47
когда мы говорим прочитай мне что-нибудь
03:31:50
в буфер до чтобы заканчивалась лишена но
03:31:53
как бы получается такая ситуация что он
03:31:55
считывает этот совершенно это пустая
03:31:57
строка но и собственно на этом все
03:32:00
заканчивается и
03:32:02
нам нужно сделать что то чтобы
03:32:06
эту пустую строчку прочитала
03:32:10
осталось вспомнить как это сделать так
03:32:13
давайте попробуем ну и на самом деле мы
03:32:16
будем постоянно эту проблему вот здесь
03:32:18
вот наталкиваться так level файла там
03:32:21
есть какой-то метод который нас бы
03:32:23
устроил сейчас давайте мы
03:32:25
посмотрим в документацию по iv стриму
03:32:44
так
03:32:49
вот она
03:32:53
игнор
03:33:00
intel nm10 им это то что у нас вполне
03:33:04
себе устраивает то есть теперь мы можем
03:33:08
написать
03:33:09
eval файл игнор
03:33:13
совершенно
03:33:19
все перезапускаем ся сейчас заодно
03:33:22
увидим
03:33:26
по-внимательнее посмотрим где мы там
03:33:28
память порушили
03:33:52
так
03:33:59
тут на самом деле понятно темы порушили
03:34:03
потому что нет стоп не понятно мышц
03:34:07
создали с конкретным размером
03:34:09
заполненным нулями
03:34:12
так что нет не удалось так
03:34:19
порядок мы не нет правильно
03:34:23
так проигнорировали до слышанное теперь
03:34:27
делаем beltline давайте посмотрим и
03:34:29
состояния нашего буфера попёрла так мы
03:34:33
видим что мы считали точки это именно те
03:34:36
символы которые в
03:34:38
буфере были так только мы их считали
03:34:42
чё-то молода почему считали мало а
03:34:46
сколько их там напечатал так ну ка еще
03:34:50
раз я вот вижу что буфер попала
03:34:55
13
03:34:57
символов
03:34:58
на
03:35:01
сколько у меня символов ука
03:35:13
у меня их там 23 3 4
03:35:18
5 6 7 8 9 10 11 12
03:35:26
до 23 надо добавить еще по одному
03:35:31
но проблема то наверное не в этом
03:35:35
так сейчас посмотрим
03:35:40
ещё раз остановим и перечитаем файл
03:36:01
так так но рэкет line
03:36:19
так ладно сейчас посмотрим на
03:36:24
что там следующий и
03:36:28
считается
03:36:30
пока непонятно
03:36:45
дмх жижку здесь
03:36:57
он beltline говорит
03:37:01
ну-ка
03:37:29
до конца старых и или до списывать
03:37:32
деньги 2
03:37:34
кстати милиметр мы здесь получается
03:37:37
можем не указывать это ничего страшного
03:37:51
ну
03:37:55
очень странное кино
03:37:57
ладно сейчас посмотрим что с map и
03:38:00
произойдет и посмотрим что он прочитает
03:38:02
следующий раз
03:38:04
так а файл у нас и в stream а
03:38:12
чё такое чувство что по какой-то
03:38:15
непонятной причине
03:38:18
учитывает в два раза меньше
03:38:22
тоже миф 2
03:38:24
в 1
03:38:26
что там в рэпе у нас образовалась
03:38:36
д.с.
03:38:45
но типа хочу просили то я образовалась
03:38:49
ладно
03:38:53
высчитать следущий
03:39:04
так ущерб
03:39:24
ученик
03:39:51
что то у нас и нет says 24
03:39:56
бит у нас не менялась
03:40:02
к попробуем-ка мы
03:40:09
убрать делим что не будет нам даст
03:40:15
ой ой ой
03:41:00
так
03:41:19
что там такого в этом файле но к
03:41:25
сексу на мусора не покажет
03:41:30
дать я попробую
03:41:33
вставить вот эту строчку
03:41:36
или лучше так
03:41:40
вот так сделаю то я сотру
03:42:17
мне заодно надо возвращаемое значение
03:42:19
посмотреть так
03:42:23
что он обернул
03:42:39
не покажется
03:42:43
так
03:42:47
назначен упорно почему ты читает 14
03:42:50
символов
03:42:58
и почему это происходит закупкам
03:43:50
поскольку а символов конфете мышцы там
03:43:52
ошиблись
03:43:53
давайте посмотрим
03:43:56
но 2412
03:43:58
и
03:44:01
но похоже на правду причем самое
03:44:04
странное что он вообще какие-то другие
03:44:06
стройке читают
03:44:09
то есть первая строка получается вот я и
03:44:12
поменял оно правильное
03:44:23
здесь все нормально
03:44:26
далее
03:44:29
мы
03:44:36
так давайте ка мы возвращаем значение от
03:44:39
кит лайлы посмотрим
03:44:50
так чем-то возвращает
03:44:53
мой он и стрим вообще возвращает
03:44:59
так может я чего-то вы стриме и так пишу
03:45:11
собственно нет
03:45:15
что можно не так писать а
03:45:19
ну вот это кстати перегрузка которая
03:45:22
читает
03:45:23
непосредственно стрелку
03:45:34
откуда куда и
03:45:36
убили
03:45:48
но давайте попробуем ее использовать
03:45:50
что-нибудь вообще а нет стоп стоп
03:45:57
стада и стринги твой а ну ка еще раз
03:46:08
ну дак то который читают строку она
03:46:10
непосредственно но типа глобальное а то
03:46:13
который читает
03:46:15
в буфер
03:46:18
какой параметр string discount
03:46:30
чарт type-s
03:46:33
чар type у нас должен быть час
03:46:40
короче странная эта история ладно
03:46:42
давайте попробуем string прочитать
03:46:45
не очень понятно почему ну вот так себя
03:46:48
ведет так тут нам можно
03:46:54
4 сестер
03:46:57
буфер и теперь мы пишем просто
03:47:01
to get line
03:47:04
в файл и
03:47:08
буфер
03:47:15
так вот
03:47:43
ночь видно ничего не изменилось
03:47:47
действительно он считывает
03:47:49
почему-то он считает что конец строки
03:47:52
вот этот разделитель
03:47:54
находится вот в том месте так мы вернем
03:47:58
историю с
03:48:03
что запитать строку тыс читать
03:48:24
так
03:48:38
проверим на всякий случай кодировки
03:48:44
не все правильно
03:48:48
так
03:48:52
чем еще может быть проблема
03:49:09
чуть ли не по нему
03:49:14
так лопнув
03:49:54
короче это какая-то загадка ладно
03:49:57
давайте мы на сегодня тогда на этом
03:49:59
прервёмся голос чего-то совсем сел в
03:50:03
общем следующий раз разберемся что тут
03:50:06
за печальная проблема и тогда доделаем
03:50:09
чтение файлы и уже начнем делать all
03:50:11
state и
03:50:12
рендер да и что-нибудь в конце концов
03:50:15
нарисуем проект идет чуть чуть медленнее
03:50:18
чем хотелось бы но я думаю ничего
03:50:21
страшного
03:50:22
в целом
03:50:24
успеем все доделать
03:50:27
все вопросы
03:50:34
есть наверно один вопрос почему нельзя
03:50:38
было просто сочетать все в буфер и
03:50:41
но не то этими стандартами
03:50:44
файловыми
03:50:45
потоками читать раструб она нам бы
03:50:49
пришлось бы все парсить вручную то есть
03:50:51
ради чего вообще мы это все затеяли
03:50:53
чтобы не парсить стройке самим чтобы
03:50:57
строки преобразовывались в целые числа
03:50:59
разбивались пор с делителем и так далее
03:51:01
стандартным потоком воды на самом деле
03:51:04
он тоже там все буфере зуи то есть когда
03:51:06
вы считываете файл вот так вот он
03:51:08
считывает не по одному символу из
03:51:09
файловым там считывает в буфер внутри
03:51:11
себя этот буфер парсит сам но собственно
03:51:14
вот только поэтому
03:51:17
то есть нам хотелось простоты но чет и
03:51:22
все как-то не просто
03:51:25
причем вот это вот проблему я но
03:51:27
действительно я не осознаю пока
03:51:31
очевидно она
03:51:33
просто и понятно но надо подумать в чем
03:51:37
может быть ее причина
03:51:48
кей тогда на этом заканчиваем я пойду
03:51:51
лечить голос внезапно пропавший и до
03:51:54
субботы надеюсь что будет хорошо
03:51:58
следующую субботу
03:51:59
спасибо до свидания до свидания
03:52:02
за ним

Описание:

Мастер-класс 2021.10.10

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

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

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

mobile menu iconКак можно скачать видео "A'21-MK3. The Cpp Skies"?mobile menu icon

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

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

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

mobile menu iconКакой формат видео "A'21-MK3. The Cpp Skies" выбрать?mobile menu icon

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

mobile menu iconПочему компьютер зависает при загрузке видео "A'21-MK3. The Cpp Skies"?mobile menu icon

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

mobile menu iconКак скачать видео "A'21-MK3. The Cpp Skies" на телефон?mobile menu icon

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

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "A'21-MK3. The Cpp Skies"?mobile menu icon

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

mobile menu iconКак сохранить кадр из видео "A'21-MK3. The Cpp Skies"?mobile menu icon

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

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

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