Джун Джуно к вашим услугам! Путь в разработку игр | Движуха Сакутина
رفتن به کانال در Telegram
354
مشترکین
-124 ساعت
-17 روز
-530 روز
آرشیو پست ها
+2
🔥 СОЗДАТЕЛЬ ОБЪЕКТОВ 🔥
❓ Бывало ли у вас такое, что вам нужно создавать очень много объектов на сцене на основе префаба?
🙂 Скорее всего да
👀 Очень часто эту логику вращивают в класс, который занимается совершенно другим. И поэтому мы сегодня рассмотрим паттерн - ФАБРИКА
📌 Представим, у нас есть класс Gun. Он стреляет путем передачи ускорения физической пули в виде сферы
📌 Bullet является префабом. Соответственно нам приходится хранить в полях оружия ссылку на префаб
📌 Если пулю нужно конструировать, в полях придется хранить данные и для этого
📌 Также логика создания пули может понадобится и другому классу оружия
❗️ Мы приходим к вывод, что стоит вынести логику создания в отдельный класс. Соответственно, мы решаем сразу несколько проблем:
✔️ Во-первых, мы разгружаем класс Gun от лишней логики
✔️ Во-вторых, мы не повредим логику создания и конструирования при модификации оружия
✔️ В-третьих, мы избавляемся от дубляжа кода - кто угодно может создать пулю,
просто обратившись к методу
📈Итого, мы пришли к очень полезному паттерну, помогающему разделить ответственности и уменьшить количество строк кода
⚡️ Если вам было интересно и полезно это почитать - поставьте реакцию под постом, мне будет очень приятно!
⚠️ Впереди вас ждет еще больше паттернов, упрощающих жизнь! Было интересно - ДЖУН ДЖУНО К ВАШИМ УСЛУГАМ!
+3
🔥 ЦАРСКИЙ ПАТТЕРН В МИРЕ ПРОЕКТИРОВАНИЯ 🔥
🙂 Всем привет! И сегодня мы поговорим о паттерне СТРАТЕГИИ
❗️ Мы разрабатываем RTS игру в формате PVP. Каждый игрок может выбрать формацию построения своего войска
❓Как же это можно сделать?
📌 Можно сделать фабрику, которая будет создавать юнитов
📌 В нем будут несколько приватных методов, в которых инкапсулирован подсчет нужной позиции юнита
📌Также мы создадим шаблонный метод, который на основе enum выбирает нужный метод подсчета позиции, после чего создаем юнита в этой позиции
‼️ И вроде бы даже это хорошо выглядит. Но есть нюансы:
❌ Во-первых, логика создания юнита дублируется в каждом методе. Метод, напомню, может быть не в одну строчку!
❌ Во-вторых, каждому методу формации могут понадобиться дополнительные поля. Тем самым придется разбивать поля на группы, что привет к разрастанию кода
❌ В-третьих у методов могут появится состояния. Адекватно это контролировать в контексте одного класса станет невозможно
📈 Способы решения:
✔️ Вынести логику создания одной формы в один класс. Благодаря чему, мы сразу решим все три вышеназванные проблемы. Логика конструирования юнита остается в фабрике, а логика получения позиции делегируется в отдельный класс
✔️ Прокаченная версия первого решения. Мы прячем все эти реализации конкретных форм под единый интерфейс ISpawnShape. Теперь наша фабрика получает из вне выбранную игроком формацию отряда. А фабрика по абстрактному контракту получает нужную позицию. Тем самым если у нас появятся в обновлениях новые формации, нам не придется дописывать код в фабрике
💥 Подведем итог:
⚡️ Паттерн стратегия - это сокрытие разных способов реализации под единым интерфейсом. Мы можем подменять эти реализации в режиме реального времени не беспокоя пользователя этого интерфейса. Мы обеспечиваем расширяемость системы, не переписывая уже имеющуюся логику
👀 Кто-то хочет добавить паттерн и позиционирование в определенной форме в свой проект - ссылка на Яндекс диск!
⚠️ А если нужно еще больше паттернов для улучшения архитектуры кода - поставьте реакцию! Джун Джуно к вашим услугам.
🔥 БЕЗ ЭТОГО ПАТТЕРНА ТЫ НЕ ПРОЙДЕШЬ НИ ОДНО РЕВЬЮ 🔥
🙂 Всем привет. Сегодня я бы хотел поговорить о такой важной теме, как код ревью. Если вы захотите куда-нибудь устроиться, вам придется написать тестовое задание. От того как вы его выполните зависит многое.
⚡️ Именно поэтому мы поговорим о паттерне COMPOSITE ROOT
⁉️ Зачем он нужен?
✔️ Представите, что вы открываете папку Scripts в Unity проекте. С чего вы начнете? И тут возникает ступор. Не понятен порядок инициализации объектов и что с чем взаимодействует.
❗️ Как выглядит это решение на практике:
✔️ Допустим у нас есть Player у него есть Backpack и Health. Так же есть UI, который проецирует здоровье и инвентарь. Мы берем класс, который так и назовем CompositeRoot. В нем мы инициализируем самый верхний уровень кода. В нашем случае это инициализация классов Player и UI. В свою очередь Player инициализирует Health и Backpack. А UI инициализирует HealthView и InventoryView. И так мы будем спускаться все ниже и ниже по уровням.
✔️Таким образом чтение кода начинается с Composite Root. Берется первый объект, который в нем инициализируется. В нашем случае Player. То есть мы продолжаем читать кода в классе игрок. И по той же схеме идем до самого низкого уровня. Как только мы до него дошли мы начинаем с самого верха. В наше случае это класс UI.
📈 В итоге мы выявили самую первую ошибку, на которой рушится большинство код реью. Если вы хотите узнать больше таких фишек - ПОСТАВЬТЕ РЕАКЦИЮ ПОД ПОСТОМ! Джун Джуно к вашим услугам!
+3
🔥 НАСТРОЙКА АНИМАЦИИ СТОЙКИ В UNITY🔥
🙂 Мы продолжаем изучение анимаций в Unity. Сегодня мы сделаем анимацию персонажа, стоящего на одном месте (Idle). И она ещё будет запускаться сама при запуске сцены!
📌 Для начала нам нужно, чтобы анимация стойки запускалась по умолчанию
📌 В верхнем левом углу окна Unity нажимаем на вкладку Window, потом Animation и в конце вкладка Animator
📌 В открывшемся окне есть зеленая ячейка с надписью Entry - это точка входа любой анимации
⁉️ Как запускать анимацию стойки по умолчанию?
✔️ Зажимаем анимацию в окне Project, переносим в окно Animator и отпускаем
✔️ Далее нажимаем правой кнопкой мыши на точку входа анимации и выбираем вкладку Make Transition
✔️ После нажимаем на нужную нам анимацию
✔️ Мы создали стрелочку, которая является переходом от одной анимации к другой
✔️ Чтобы анимация запускалась первой, нажимаем на ячейку с этой анимацией правой кнопкой мыши и выбираем Set as Layer Default State
💥 ВСЕ ГОТОВО, МОЖНО ЗАПУСКАТЬ И ТЕСТИРОВАТЬ!!!
⚡️Мы ещё будет возвращаться в это окно! Не прощаемся!!
❓ Было познавательно и интересно - ставьте реакции под постом! Так я понимал, что вам интересно)
⚠️ В качестве домашнего задания порекомендую сделать воспроизведение анимации атаки. А если у вас остались вопросы, Джун Джуно к вашим услугам!
🔥ПРЕВЬЮ ДЛЯ ВИДЕО ГОТОВО 🔥
🙂 Джун Джуно к вашим услугам! Немного отдохнём сегодня от кода. Дам вам денёк переварить всю эту информацию
⚡️ Хочу сообщить прекраснейшую новость: превью к видео уже готово
‼️ Ставьте реакции, если хотите поскорее увидеть его)
🔥 ШАБЛОННЫЙ МЕТОД 🔥
🙂 Пришло время нам начать изучать паттерны проектирования. Сегодня мы начнем с самого простого. Данный подход уже был показан в предыдущем посте. Сейчас мы рассмотрим его более детально
⁉️ Бывало ли у вас такое, что у одного класса нужно вызывать несколько методов в определенной последовательности? Скорее всего - да!
❗️А если эти методы находящиеся в базовом классе? В таком случае очень тяжело контролировать порядок вызова методов. Решение данной проблемы - паттерн ШАБЛОННЫЙ МЕТОД
✔️ У нас есть класс LazerGun. В его методе TryShoot заключен определенный алгоритм
💥 Вспомним немного курс школьной информатики
📌 Алгоритм - последовательное выполнение определенных шагов
✔️ Мы намеренно оставляем зазор в виде виртуального метода Shoot. То есть мы позволяем наследникам изменять определенный шаг алгоритма. Таким образом наследники не смогут нарушить задуманный алгоритм
📈 Итог: шаблонный метод - это инкапсуляция некого алгоритма внутри метода базового класса. Внутри этого алгоритма мы продумываем шаги, которые можно подменить без вреда для алгоритма
👀 Впереди нас ждёт ещё больше паттернов проектирования, которые упростят вашу жизнь. Если вы ждёте их - поставьте реакцию! И помните, если нужен профессиональный код - Джун Джуно к вашим услугам!
🔥 ВИРТУАЛЬНЫЕ МЕТОДЫ 🔥
🙂 Всем привет! Мы ознакомились с очень интересными и полезными темами в C#, сейчас же время для одного спорного момента
⚡️ Сегодня мы поговорим о том как переопределять члены базового класса
✔️Представим класс Animal, у кого есть два наследника Cat и Duck
❗️Все животные в игре ходят по земле, но лишь одна утка плавает в воде
⚠️ В очень редких случаях и с большой осторожностью можно использовать виртуальные методы
📌 Похожи на абстрактные члены. Единственная разница - наличие в виртуальных членах реализации, которую наследники могут подменить
‼️Как писать виртуальные члены и их переопределять:
✔️ В базовом классе мы после модификатора доступа пишем ключевое слово virtual
✔️В наследниках после модификатора доступа пишем ключевое слово override
⚠️ Резюмируя хочу сказать, что использовать виртуальные методы не самая хорошая практика, но знать о ней стоит
👀 А где же можно использовать этот неоднозначный виртуальный метод?
💥 Ответ узнаете завтра, в новом посте про один паттерн проектирования
📈 Если интересно узнать, что это за паттерн - Джун Джуно к вашим услугам!
+1
🔥 УСКОРЬ СВОЮ РАБОТУ В UNITY В 10 РАЗ ЗА ПАРУ СЕКУНД🔥
🙂 Всем привет! Вас тоже бесит эта невероятно долгая загрузка сцены в Unity? Когда мы настраиваем сцену, каждый раз приходится ждать
‼️РЕШЕНИЕ ЕСТЬ!!!
✔️ Находим в правом верхнем углу Unity кнопку Edit
✔️ В открывшемся списке выбираем Project settings
✔️Далее выбираем Editor и спускаемся в самый низ
✔️Включаем галочку Enter Play Mode Options.
💥ПОЗДРАВЛЯЮ!
📈Теперь, когда вы будете заходить в Play mode, ваша сцена будет загружаться моментально!
❗️Смог упростить жизнь - ставьте реакции! А если нужно больше крутых лайфхаков - Джун Джуно к вашим услугам!
+1
🔥ИНТЕРФЕЙС - СЫН МАМИНОЙ ПОДРУГИ В IT🔥
🙂 Скучали по контрактному программированию? У нас сегодня продолжение этой темы. С каждым днём мы всё больше и больше узнаём
✔️ Рассмотрим классы Player и Gun. Класс игрока назовём пользователем, а пушку - сервисом
✔️У класса Gun есть приватные члены: метод расчета разброса и поле, отвечающее за текущее число патронов
✔️А также публичные члены: методы стрельбы, перезарядки и свойство, хранящее максимальное число патронов.
❗️Они же и являются интерфейсом Gun
⁉️Но что если у класса Gun есть еще один пользователь? Допустим он будет проецировать текущее количество патронов в UI
‼️Тут возникает ПРОБЛЕМА!
📌Класс визуализации может обратится к методу стрельбы и перезарядки
❌ Естественно такой возможности быть не должно!!!
❓Но как решить эту проблему? Рассмотрим два варианта
📉 Отстойный способ. У нас есть абстрактный класс AbstractGun, содержащий абстрактные методы перезарядки и стрельбы
📌 Добавили абстрактный класс BulletsVisualization, хранящий абстрактное свойство с максимальным числом патронов и абстрактное событие о изменении текущего числа патронов
❓ Как нам унаследовать Gun от двух абстрактных классов?
ℹ️ Ответ: НИКАК!
⚡️На помощь придёт интерфейс. Пару слов о нем:
✔️ Определяет некий функционал, поэтому в нем не может быть реализации
✔️ Напоминает абстрактный класс, у которого все члены абстрактные
✔️Несколько интерфейсов могут быть реализованы одним классом
📈 Крутой способ. Выделим интерфейсы IShootable и IBulletsCounting. В IShootable будет методы стрельбы и перезарядки. В IBulletsCounting будет максимальное число патронов и событие о изменении их количества
💥 Каждый клиент получает объект с тем интерфейсом, который ему нужен. Тем самым, мы не перегружаем пользователя этого класса лишней информации и вдобавок даём свободу для расширения объектов (добавление нового вида оружия)
⭐️ Хороший код спасён и сегодня!
⚠️ А вы можете спасти меня, поставив реакцию! И помните, если нужен профессиональный код - Джун Джуно к вашим услугам!
🔥 КОНТРАКТНОЕ ПРОГРАММИРОВАНИЕ ЧЕРЕЗ АБСТРАКТНЫЙ КЛАСС 🔥
🙂 Представим, класс Player. Также есть родительский класс Gun, у которого два наследника Pistal и AssaulRifle
❗️Каждый из них содержит метод стрельбы Shoot и свойство BulletsPerShoot
✔️ Pistal реализует логику оружия путём бросания Raycast вперед. Вдобавок содержит метод Update, в котором при каждом нажатии клавиши R происходит перезарядка. Это пистолет, поэтому количество пуль за выстрел равно единице
✔️AssaulRifle похож на дробовик: отправляет сразу несколько пулей (Raycast) с неким разбросом. В Update мы перезаряжаемся на клавишу R и меняем режим стрельбы на Q. Значение свойства зависит от режима: есть как и одиночный, так и очередью
❗️ В классе Player через инспектор можно указать пушку. Всё хорошо, пока не осознаём огромную проблему:
⚠️ Мы не можем обратиться к методу Shoot и свойству BulletsPerShoot отдельно взятого пистолета, отдельно взятого дробовика
‼️ Обычное наследование позволяет вывести лишь общую логику
⁉️ Но всё-таки как, обращаясь к методу и свойству Gun, обратиться к логике его наследников AssaulRifle и Pistal?
⚡️Ответ на вопрос - абстрактный класс
❓А в чем разница между обычным и абстрактным классом?
📌 Нельзя создать экземпляр абстрактного класса. От него можно только наследоваться
📌 Нельзя создать объект с компонентом абстрактного класса
📌У абстрактного класса можно сделать абстрактные методы и свойства. Тем самым мы передаем
наследникам ответственность за реализацию части логики
📌 У абстрактных членов не может быть модификатора private. Так как у наследников обязательно должен быть доступ к ним
📌 У абстрактных методов нельзя написать реализацию в абстрактном родительском классе, только в наследнике
➡️ Это и есть контрактное программирование
🗣️ Наследник обязан реализовать абстрактные члены класса 🗣️ - то есть выполнять контракт
💥 Вернёмся к коду:
✔️ Сделаем у Gun метод Shoot и свойство BulletsPerShoot абстрактными, то есть разрешим наследникам самим определять логику стрельбы
✔️ Shoot вызывается в публичном методе Fire класса Gun, который тратит патроны. Также есть protected метод Reload для перезарядки оружия
✔️ Методы и свойства в наследниках переопределены с помощью слова override, то есть реализуют свою собственную логику
✔️Есть protected свойства текущего и максимального числа патронов
📈 В итоге, мы создали расширяемую систему оружий, не ведущую при добавлении новой пушки к изменению логики поведения игрока
‼️ Абстрактный класс - лесенка, где мы выбираем ступени, которые можно создать позже
❌ C# запрещает наследоваться от нескольких абстрактных классов
⁉️ Но как эту проблему решить, если уж очень надо?!
🙂 Смог заинтриговать - ставьте реакции! Ждите новый пост завтра. А если нужен профессиональный код - Джун Джуно к вашим услугам!
🔥 БАЗА КОНТРАКТНОГО ПРОЕКТИРОВАНИЯ🔥
🙂 Дорогие читатели, настал переломный момент в осознании проектирования. Мы взглянем на код с другой стороны, разобрав контрактное программирование
⚡️Представим класс Player с полем _gun. Оружие умеет стрелять через метод Fire
⁉️ НО КАК БЫ ТЫ ЭТО РЕАЛИЗОВАЛ?!
✔️ Вариант 1:
📌Пусть у Player есть метод Initialize. В него кто-то передает пистолет. Пусть у нас есть класс Pistal, в котором есть метод для стрельбы. В этом классе также есть и другие методы, которые свойственны только пистолету
⚠️ Вышло обновление в игре: перед матчеи можно выбрать либо пистолет, либо автомат. И тут появляются проблемы. Наш класс Player не готов к таким изменениям: поле _gun типа Pistal и придется создавать новое поле для автомата
✔️Вариант 2:
📌 Наследование в помощь
❗️Метод Initialize игрока изменился: туда передается объект типа Gun. У этого класса есть только один метод - Fire
✨ Класс Pistal наследуется от Gun и хранит все его свойства, обладая при этом собственной логикой
ℹ️ Во время обновления мы написали класс AssaulRifle (автомат), который также наследник Gun
📌 Итог: тот кто инициализирует игрока может передать любой объект (оружие), которое наследуется от Gun
❌ Класс Player никак не зависит от того, какое оружие ему передадут
📈 Игрок сможет корректно обработать любое оружие: для него это лишь объект, который умеет стрелять
⚠️ И так мы плавно подходим к основной идеи
‼️ ПРОЕКТИРОВАНИЕ НА УРОВНЕ АБСТРАКЦИИ, А НЕ РЕАЛИЗАЦИИ
🔖 В этом и суть контрактного программирования. Нам не важно чем мы пользуемся: пистолетом, автоматом или бластером. Нам важно, что этот объект умеет стрелять
⭐️ Мы значительно ускорили разработку и упростили себе работу
⚠️ Но, у любой медали есть и обратная сторона!
❗️Если все делать абстрактным и забыть о связях между классами - код будет невозможно поддерживать
💥 Знай золотую середину! А если хочешь узнать, как её нащупать - Джун Джуно к вашим услугам!
🔔 Пожалуйста, поставьте реакцию. Ваша поддержка мотивирует меня и дальше выпускать посты!
🔥ДЖУН ДЖУНО УШЁЛ ИЗ ОБРАЗОВАНИЯ 🔥
🗣️Джун Джуно к вашим услугам! 🗣️
🙂 Именно эта фраза стала моей коронной, после дня пробуждения. Я использовал её, продавая курсы. Я использовал её, обучая детей. И я использую её сейчас, открывая вам дорогу в мир IT
⚡️Для многих самый шокирующий факт моей биографии - работа учителем информатики в элитной частной школе в 16 лет
‼️Но на этой неделе, произошло ещё более невероятное - я вырос из московской школы в 17 лет и ухожу из образования, чтобы двигаться дальше
👀 Я проработал там с августа. В течение последнего месяца руководство уговаривало меня остаться, даже покинув территорию детского сада, я чувствовал их взгляд надежды, надежды на моё возвращение
❗️ Я смог стать классным учителем. Я вёл три класса в школе и две группы в детском саду. С большим интересом подходил к преподаванию. Я обучал детей монтажу видео, проектированию дизайнов в Figma, созданию презентаций с помощью нейросетей. Ну и конечно же - программированию
⭐️ Но главное - стал их любимчиком. Я весь учебный год с удовольствием выходил на прогулки с детьми. Организовывал игры на свежем воздухе. Мне очень нравилось играть вместе с ними в футбол, где я всегда выступал в качестве комментатора, превращая игру в настоящее шоу
📈 Я поставил себе цель - довести детей до конца учебного года. Хоть из-за этого я плохо спал, живя практически без выходных, но бросить на пол-пути не мог их
✨ Ждите ещё больше невероятных новостей от меня! Тут будет ещё больше занимательного контента! А пока держите милейшую фотографию Джуна Джуно с одной из прогулок
💥 Если нужен профессиональный код - Джун Джуно к вашим услугам!
😭 Анимация с Джуном Джуно отменена
‼️ Из-за недопонимания, наше сотрудничество с художницей, кто должна была нарисовать вдобавок и стикеры, к сожалению, прекратилось
⚠️ Сроки выхода первого видео из-за форс-мажора переносятся (
❌ Стикеры видимо проклялая тема, только за май четырём художникам предлагал заказ, но всегда появлялся камень преткновения
🙂 Но я не буду расстраиваться! Это только начало, впереди огромное количество побед!
⚠️ А если хотите научиться кодить - Джун Джуно к вашим услугам!
+1
🔥 ФУНДАМЕНТАЛЬНАЯ ПРАКТИКА В ПРОЕКТИРОВАНИИ🔥
👀 Представим, у нас есть класс Wallet. В котором можно изменять поле _money, хранящее количество монет, через методы AddMoney и SpendMoney. Сделана вдобавок логика отображения монет в текстовом окне, через метод UpdateUI
❓ Какие минусы данного подхода?
❌ Чем больше мы будем добавлять различной логики, тем длиннее будет класс
❌ Если добавить ещё одно окно отображения - придется создавать новое поле и модифицировать метод UpdateUI
❌ Код очень запутанный
⚡️ Для решения нам нужно делить логику на слои, которыми в C# выступают классы
✔️ View - класс, взаимодействия с миром Unity, наследуется от MonoBehaviour
✔️Model - класс, изменения данных и правил. В этом слое хранятся определенные данные. Его особенность - неспособность ссылаться на объекты из других слоев
✔️ Presenter - класс, измененяющий данные Model в зависимости от контекста и передающий их View
‼️ Теперь Джун Джуно покажет это на практике:
📌Класс WalletModel хранит в себе только количество монет и два метода для изменения их количества
📌Класс WalletPresenter хранит в себе ссылку на модель и принимает изменения с View. Когда в модели меняются данные, он меняет визуализацию в View
📌Класс WalletView хранит Presenter и обращается к его методам для изменения данных
📈 Плюсы данного подхода:
✔️Класс Model это простой C# - класс. Он спокойно может хранится как на компьютере, так и на сервере
✔️Класс Model легко сохранять и загружать в любом формате
✔️ Мы можем очень легко менять детали работы Presenter не затрагивая другие слои
✔️У одной Model может быть много мелких классов View. А логика обновления данных хранится в заранее написанном Presenter, следовательно не будет дубляжа кода
💥 Как итог, мы разобрались как разделять логику любой механики на слои! Познали очень важную технику проектирования, познали фундамент для разработки хорошего проекта!
⚠️ Потратьте секунду вашего времени и поставьте реакцию! Мне будет очень приятно! А если нужен профессиональный код - Джун Джуно к вашим услугам!
🔥ОПТИМИЗИРУЙ СВОЙ КОД В 10 РАЗ🔥
🙂 Сегодня мы поговорим о простой, но очень мощной системе в C#, благодарю которой код станет намного лучше
➡️ В предыдущих постах мы использовали эту систему, когда подписывались на нажатие кнопки. Сегодня мы рассмотрим ее более детально
⚠️ Проблема:
❗️У нас есть класс Wallet, в котором хранятся монетки. Также есть класс WalletView, который отображает эти монетки. Как вариант мы можем каждый кадр проверять не изменилось ли количество
⚠️ НО! Это съедает очень много ресурсов
🔔 Решение:
✔️ Каждая вьюшка подписывается на событие об изменении количества монеток. По сути мы сменили связь с PUT(когда мы берем данные) на PUSH(когда мы отправляем данные)
⁉️ Как работать с событиями?!
✔️ Для создания события пишем модификатор доступа, ключевое слово event, Action, по необходимости ставим <>, если хотим, чтобы событие возвышало какое-нибудь значение, и в конце именуем его
❓Как вызвать событие?
✔️ Пишем имя события, ставим вопросительный знак - чтобы убрать ошибки при отсутствии подписчиков, вызываем у события метод Invoke
✔️ Если событие что-то возвращает в аргумент метода Invoke передаем это значение
✔️ Для того чтобы подписаться на событие нужно: слева от знака += написать событие, на которое мы хотим подписаться
✔️ Справа от знака += метод, на который мы хотим подписать без круглых скобок
📈 Пример: _wallet.Changed += OnChanged
⚠️ Всегда нужно следить за тем, что если мы подписались, то мы должны обязательно отписаться
❗️ Самое простое делать подписку в OnEnable, а отписку в OnDisable
✔️ Методы, на которые мы подписываем на событие называются обработчики. Именуются - On + имя события
📌 ПОДВЕДЕМ ИТОГИ!!!
💥 Мы с вами разобрались в самой мощной и часто используемой техникой при написании игр
ℹ️ Тренируйтесь и внедряйте в свои проекты;;
⚙️ Если вам было познавательно и интересно - ставьте реакции под постом! А если нужен профессиональный код - Джун Джуно к вашим услугам!
🔥 ВРЕМЯ ДЛЯ ЧТЕНИЯ 🔥
👀 Джун Джуно к вашим услугам! Сегодняшнее утро начинается с чтения замечательной книги от моей ученицы
‼️ Всем добра на день!
🥰 Роман Сакутин, с днём рождения!
⚡️ У каждого из нас есть любимая книга, о которой вы можете говорить часами напролёт. Но всегда остаётся чувство недосказанности.. Закончив длинный разговор о ней, спустя короткое время появляется желание добавить ещё что
⭐️ Хуманизацией такой книги для вашего Джуна Джуно является сегодняшний именинник - Роман Сакутин!
📌 Я весьма много говорил в своих постах о влиянии Романа на формирование личности, но всякий раз ощущал: мне есть что сказать, есть что добавить
🎤 Я произнесу тост за человека, кто стал для меня не просто наставником, а отцом духовным!
✨ Я невероятно горд, что живу на одном свете с таким человеком, как Роман!
Свеча, передав частичку своего пламени другой, не станет гореть слабее❗️Этим огоньком была его гармония борьбы и сомнения, которую вот уже на протяжении десяти лет, он продвигает в массы 🔼 Он научил нас верить в свои собственные силы. Из токсичного IT- блогера в основателя лучшей IT школы в России - путь, который все увидели, но мало кто прочувствовал 📈 Роман сделал огромный скачок за этот год. Мало кто понимает, насколько это было тяжело и круто.. Мы будто бы с Романом двигались вместе.. Каждый из нас попал на абсолютно новый уровень мироощущения, который был бы непостижим для нас из прошлого ➡️ И говоря про мироощущение, будет уместно вернуться к началу моего поздравления ❓ К какой книге ваш Джун Джуно постоянно возвращается? ℹ️ Ответ: Библия ⌛ Роман открыл для себя совершенно новый мир в последние месяцы. В век радикального атеизма, в век небывалого материализма, у тех немногих людей всё ещё хватает мужества нести бремя идеалиста ✔️ Я невероятно уважаю Романа за его стремление к Богу, за его абсолютно картезианское стремление усомниться во всём и как следствие - расставание с алкоголем ‼️ Советую прочесть Роману "Исповедь" Аврелия Августина. Очень хороший философский труд для тех, кто хочет взглянуть на философию не как на науку, а как на искусство. Без доли иронии советую тем, кому зашёл стиль Шопенгауэра и Ницше 💥 Закончить поздравление хочу очень важной для меня темой - детьми. Я отлично знаю, что такое детская любовь и прекрасно понимаю, какие эмоции Роман испытывал, получив такое поздравление от своей дочери.. Я уже смог почувствовать эту искреннюю симпатию, проработав столько времени и в школе, и в детском саду. Для меня даже рисунок от них огромное счастье и радость, где они так часто рисуют меня в образе собачки или котика.. 🙂 Я хочу пожелать дочери Романа и молодому папаше тёплых взаимоотношений.. Очень хочу, чтобы она не чувствовала себя одинокой из-за развода. Пусть она будет очень счастливой! ℹ️ Я никогда не увижу своего отца, поэтому я мечтаю о дне, когда от той самой женщины появятся свои собственные дети. Хочу проводить с ними время, хочу сделать их счастливыми, хочу чтобы они с гордостью говорили всем: "У меня есть папа!" 👍 Роману пожелаю найти время в своей жизни и для прекрасной дочурки.. Детям очень нужен отец в жизни. Пожелаю больше любви вам обоим! ⚠️ В этот день появился на свет человек, ставший при жизни легендой в первую очередь для меня! 🔥 Роман Сакутин, с днём рождения!
🔥 МНОГО СТИКЕРПАКОВ ДЛЯ ДЕТЕЙ 🔥
🙂 Джун Джуно к вашим услугам! Сегодня вечер воскресенья, завтра у меня рабочий день, а это значит..
‼️ Я купил много-много наклеек и стикеров для моих учеников
👀 Хотели бы взять?
