Обучение языку c#

Формула программиста
основатель — Волосатов Евгений Витольдович

Игры со Спрайтами

Создание программы для рисования спрайтов.
Использование спрайтов для двух игр -
+ Аполлон - полёт на Луну
+ Домино - пасьянс из плашек домино.

Объём: 33 урока.
Создаём: Конструктор спрайтов + 2 игры
Срок: 30 дней

5,000 руб.


Для подписки на пакет необходимо авторизоваться.

Список уроков | фото | видео

# Название видеоурока Решило Рейтинг Доступ
1 Спрайт. Первая форма 00:13:27 82 чел. ★ 4.8 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Нового ничего. 
Сложности: Придумать иконку) 
Комментарии: ... 
2 Спрайт. Структура для линии 00:11:07 75 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: вспоминал старое 
Сложности: прозевал указать паблик в конструкторе структуры)) Просидел минут 10 пытаясь понять почему не видит конструктор с параметрами. 
Комментарии: Все в одном файле награмаждено. 
3 Спрайт. Класс для графики 00:09:32 68 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 20 мин. [Показать отчёт]
Научился: Повторение - мать ученья) 
Сложности: не было 
Комментарии: не нравится мне массив цвета... надо как то по другому. Почему линия это структура а не класс, в чем преимущество в будущем? Насколько я знаю структуры используют либо для экономии памяти, либо для необходимости присваивания как значения. 
4 Спрайт. Класс для Спрайта 00:14:10 48 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 30 мин. [Показать отчёт]
Научился: было интересно 
Сложности: да все нормально 
Комментарии: нет 
5 Спрайт. Рисуем линии мышкой 00:22:31 46 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Поэкспериментировал с событиями мышки. 
Сложности: Потеряться в логике 
Комментарии: нет 
6 Спрайт. Панель инструментов 00:19:00 46 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 2 час. 00 мин. [Показать отчёт]
Научился: Рисовать 
Сложности: Рисовать иконки)) 
Комментарии: Удовольствие от процесса получил) 
7 Спрайт. Сериализация объекта 00:18:23 44 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 4 час. 00 мин. [Показать отчёт]
Научился: Много читать о xml сериализации )) 
Сложности: разобраться почему сначала не сериализовался и потом и не десериализовался тип Color 
Комментарии: впечатление: гемор и еще раз гемор. Почему нужно нужно придумывать костыли, чтоб в xml перевести некоторые структуры? 
8 Аполлон. Главные герои 00:07:08 53 чел. ★ 4.7 Done
  Отчёт отправил: 5027. Руслан Решено за 10 мин. [Показать отчёт]
Научился: искать в интернете картинки с названием "аполлон игра" 
Сложности: нарисовать, ибо рисовать не умею 
Комментарии: ку-ку) 
9 Аполлон. Законы физики 00:26:47 59 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 30 мин. [Показать отчёт]
Научился: Как обычно, в начале картинки и формулы, потом код) 
Сложности: Вспоминать школьную физику) 
Комментарии: Пум-пурум 
10 Аполлон. Плавное прилунение 00:55:16 53 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 4 час. 00 мин. [Показать отчёт]
Научился: нюансам логики игры 
Сложности: отстроить играбельность 
Комментарии: Я не умею так быстро соображать, как Евгений Витольдович, почти с ходу писать почти работающий код) Чувствуется опыт по игрушкам, как они внутри должны выглядеть. 
11 Спрайт. Рисуем Аполлона 00:14:10 41 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 30 мин. [Показать отчёт]
Научился: пользоваться свои собственным почти графическим почти редактором )) 
Сложности: как всегда рисовать 
Комментарии: Я сделал бинарную сериализацию. Смысла в xml в данном случае нет, а гемора много. Опять не хотело сериализовать из-за фабрики. У меня список типа Figure, а внутри лежат наследованные Line, Rectangle и Ellipse. И он просто не видит какого типа объект надо сериализовать. Зато бинарная сериализация прошла с первого раза. Вообще xml сериализацию делают, когда нужно трансформировать данные в другой тип или передать объект в другую программу на другой платформе, ну или когда надо передать данные не всех полей объекта по сети, чтоб не забивать трафик целым объектом. Для данной ситуации бинарная сериализация подходит больше: нужны все поля, передаем на той же платформе, да и работает это быстрее в разы. 
12 Аполлон. Graph и Sprite на Луне 00:19:58 38 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за не указано [Показать отчёт]
Научился: Создавать dll 
Сложности: Вносить изменения, приходилось постоянно между тремя проектами крутиться, чтоб все работало. 
Комментарии: Решил я выпендриться и был наказан затратой кучи времени) Так как я спрайты сериализовал в бинарные фйлы, то возникла новая неожиданность. Нельзя сериализовать класс, описанный в одной программе, а десериализовать в класс, описанный в другой программе, даже если эти классы совпадают по реализации. Т.е. сериализуемый класс должен быть вынесен в отдельную сборку, попросту говоря в dll, и уже его подключать в программу где сериализуешь и его же подключать где десериализуешь. Пришлось делать то, о чем я уже говорил раньше. Класс, с описанием фигуры и реализацией его прорисовки (класс Graff), я вынес в dll. Теперь я могу эту dll всовывать в любую прогу где надо выводить наши спрайты, без всякого копипаста кода. Ну а так как я настраивал dll, решал, что именно там должно быть, менялось описание самого класса, то постоянно приходилось копировать dll то в прогу Sprite, то в Apollon. Потому что небольшое испарвление в классе dll и десериализовать предыдущую картинку уже не хотело. Вобщем я спрайты на Аполлон рисовал 4 раза)) Ну зато теперь совсем просто! В любую игру, где мы будем работать с нашими рисованными спрайтами, можно просто указать ссылку на нашу dll и вся реализация нам доступна: десериализация спрайта из файла, методы его отрисовки. 
13 Аполлон. Финальное прилунение 00:29:58 38 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за не указано [Показать отчёт]
Научился: Вообще программа Sprite и Apollon меня многому научили. Во первых четко продумывать структуру программы, во-вторых пришлось работать с кучей разных контроллов, их свойствами и методами, с которыми я раньше дело не имел. Втретих я получил один из способов как могут быть реализованы игры с точки зрения кода. 
Сложности: Настроить правильное отображение спрайтов, их масштабирование, положение на экране, настроить, чтоб как то чувствовалось, что это игра, а не просто картинки на экране) 
Комментарии: Вобщем я игрушку в большей части сделал по своему. В части это из-за того, что моя спрайт программа реализованна была по другому: у меня в список фигур спрайта входят не только линии, но и прямоугольники, и эллипсы, так же у меня можно корректировть толщину линии, ну и цветовая гамма вся, что предоставляет Windows, и сериализирую я в бинарный файл, в не в xml. Ну и плюс я добавил в программу функционал добавление-отключение фоновой картинки, рисование сетки для облечения точного рисования и возможность сдвигать картинку в углы окна, чтоб потом в программах легче было позиционировать их на экране. Вобщем из-за того, что изначально я решил из интереса усугубить с программой спрайтов, мне приходилось все, что связано с отображением в дргуих программах подгонять под это. Мои изменения: 1. Из спрайтов я сделал сортированный список типа SortedList sprites; (на скрине кода предыдущего урока видно как я это делаю). Это даёт нам возможность обращаться к спрайту по его ключу (а не индексу, как в массиве), в моем случае я сделал стринговое имя. Всетаки удобнее sprites["ship"], чем ничего не говорящее sprites[0]. Ну и перерисовывать сразу весь список удобнее через foreach, массив такой возможности не даст. 2. Как по мне то класс формы должен заниматься только отрисовкой на форме. Он ничего не должен знать о корабле, о его свойствах и даже о правилах игры. Поэтому все, что касается отрисовки спрайтов, я вынес в класс Sprites. Класс Ship, это только корабль как объект, у него есть скорость, топливо, двигатель, высота как местоположение в пространстве, метод перемещения, который определяет это самое месторасположение. Их я инкапсулировал в класс Game, который собственно и определяет правила игры. Теперь форма у меня знает только о Game и ничего не знает о корабле и как рисуются спрайты. Вобщем класс Game, это прослойка-контроллер между формой и объектами игры. 3. Статус Play я разбил на два EngineOn и EngineOf. Мне так показалось удобнее обрабатывать события. Вообще, конечно, там все далеко от совершенства, есть у меня еще мысли как усовершенствовать. Первое, добавить функционал в Sprite сразу делать пакет спрайтов одним файлом. Когда выделяешь насколько спрайтов в файловом диалоговом окне, десериализует поочереди файлы, создает SortedList где ключ каждого спрайта это имя файла. А потом сериализует весь этот список в один файл. Что нам это дает? Ну вопервых на вход игры иметь один файл сразу со всеми спрайтами, во-вторых, обращаться к ним по имени. Ну и второе, что мне хочется добавить, это сделать два пикчебокса. Один для статичных спрайтов, другой для анимированных. Потому, что происходит очень много лишней перерисовки. И вот тогда наши пакеты спрайтов будут вообще замечательны. На вход игры мы будем получать два пакета: один для статичного пикчебокса, второй из спрайтов которые надо двигать. И тут foreach можно спокойно использовать, т.к. не надо выбирать из списка, какой спрайт для анимации, а какой для статичного фона. И тогда двигая корабль не придется перерисовывать Луну и звезды.  
14 Полуфинальный урок 00:23:23 26 чел. ★ 4.8 Done
  Отчёт отправил: 5027. Руслан Решено за 4 час. 00 мин. [Показать отчёт]
Научился: Делать видеообзор, никогда не делал этого раньше) 
Сложности: Сделать, чтоб вокруг все вели себя тихо, пока запись шла) 
Комментарии: Фууууххх.... Дублей 15 было точно, некоторые по 15 минут. 
Видеообзор: http://www.youtube.com/watch?v=Vfof_eaCjOs
15 Домино. Правила игры 00:20:55 42 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Думать о архитектуре игры 
Сложности: Да в принципе ничего, все доходчиво показано) 
Комментарии: Фотки доминошек не выкладываю, не заморачивался их искать в магазине ради одной фотографии) 
16 Домино. Перемешиваем плашки 00:22:49 39 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 4 час. 00 мин. [Показать отчёт]
Научился: Вспомнил мат функции, пришлось читать за ошибки преобразования из double в int для выделения дробной части числа. Вспоминал формулы алгебры по арифметическим прогрессиям. 
Сложности: Реализация своей логики по перемешиванию плашек домино, чтоб за один проход и с одинаковым шансом рандома для всех плашек. Пришлось брать ручку и листочек, вспоминать и выводить формулы 6-7 класса алгебры, чтоб по порядковому номеру плашки знать в каком ряду и столбце она находится. Упираешься надолго в непонятку в коде, которая потом оказывается мелочью, которую просто надо знать изначально. Вобщем неприлично долго провозился с реализацией вроде простого с первого взгляда метода перемешивания. 
Комментарии: Люблю заморочки)) Хорошо себя чувствую, когда из конца в конец получается что хочешь) 
17 Домино. Динамическая пирамида 00:21:39 39 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 30 мин. [Показать отчёт]
Научился: Позиционировать лейблы) Пытался делать это не подсматривая в урок, но признаюсь пару раз подсмотрел, время к сдаче урока поджимает, а еще половины толком не сделал. 
Сложности: Разобраться с нужным позиционированием лейблов. 
Комментарии: Спешу сделать вовремя 
18 Домино. Делегаты отображения 00:20:38 37 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: работать с делегатами 
Сложности: да вроде бы ничего 
Комментарии: Я вызов ShowPlate() перенес из SetState(). Как то не камильфо мне, что метод изменения статуса занимается перерисовкой. Всунул я его в HidePlate() внутрь цикла. Там после изменения статуса мы сразу и перерисовываем плашки. 
19 Домино. Выбираем и убираем 00:27:16 37 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за не указано [Показать отчёт]
Научился: Как обычно опробывал свою логику 
Сложности: Копипастить, ибо хочется по своему сделать)) 
Комментарии: Да все замечательно 
20 Домино. Ура! Победа! 00:19:12 37 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 2 час. 00 мин. [Показать отчёт]
Научился: скорее не "научился", а "подучился" ) Ну или "прокачался" )) 
Сложности: Разобраться в некоторых моментах логики 
Комментарии: Как обычно во время написания, возникают всякие ненормальные идеи мимо которых трудно пройти). Возникла идея хранить плашки в обычном массиве plate[], инкапсулировать его в класс какой-нибудь Plates и реализовать к нему свой именованный энумератор, чтоб обращаться можно было Plates[2,1], а он возвращал плашку plat[4]. Т.е. двумерного массива вроде как и нет, а плашки из ряда можно доставать так, как будто они у нас на поле лежат разложенные. Ни лишних тебе элементов в массиве, да еще и форичем можно пройтись. В общем провозился пару часов, никогда раньше энумераторы не реализовывал, но остался доволен. Потом перепишу игрушку без двумерных массивов. Я, думаю, что если рассматривать плашки как одномерный массив, проще логика будет и для открытых плашек отдельный список, чтоб меньше перебора и лишних проверок было. 
21 Спрайт. Рисуем плашки 00:25:50 33 чел. ★ 4.9 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Рисовать в Поинте, если это так можно назвать. 
Сложности: Рисовать 
Комментарии: Всякие ухищрения в коде легче сделать, чем рисовать.... 
22 Домино. Отображение плашки 00:26:38 33 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Разобрался как с ресурсами работать 
Сложности: Разбираться с ресурсами 
Комментарии: Ресурсы тоже гемор)) Зачем все так было усложнять..? 
23 Домино. Двойной спрайт 00:29:27 32 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 00 мин. [Показать отчёт]
Научился: Делал неделю назад, уже не помню что и как. 
Сложности: Ну конкретно по этой работе, спозиционировать. 
Комментарии: Начал писать с нуля, со своей логикой, но по плану задач ЕВ ) 
24 Домино. Анимация спрайта 00:17:36 32 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 00 мин. [Показать отчёт]
Научился: Двигать 
Сложности: В этих анимациях все понятно, ничего сложного. 
Комментарии: Момент анимации тяжело заскринить) 
25 Домино. Подъём переворотом 00:28:16 32 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 00 мин. [Показать отчёт]
Научился: Анимациям 
Сложности: Делал анимацию на дроп, что они в разные стороны летят от центра экрана и уменьшаются в размерах - "исчезают", долго провозился. А т.к. я весь экран не перерисовываю, затираю область плашки, то и всякие нюансы по затираню соседних плашек происходят, отстраивал долго. 
Комментарии: Все гуд 
26 Домино. Базовый класс Анимаций 00:21:37 32 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 00 мин. [Показать отчёт]
Научился: Делать разные виды анимаций 
Сложности: Чтоб это действительно было анимация )) 
Комментарии: У меня чуть по другому, скрины анимаций я уже выкладывал. У меня PlateSprites всетаки наследуется от Sprites. В Sprites лежат методы отрисовки спрайтов, а PlateSprites расширяет это до отрисовки доминошек, там же реализовал анимацию. 
27 Домино. Три наследника Аниматора 00:30:26 32 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 00 мин. [Показать отчёт]
Научился: Тому же что и на предыдущем уроке) 
Сложности: То же самое что и на предыдущем уроке) 
Комментарии: Всем Ку! 
28 Домино. Пирамида из анимашек 00:15:05 32 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 00 мин. [Показать отчёт]
Научился: Позиционировать спрайты доминошек 
Сложности: Чтоб все красиво было и они перевернулись как надо. У меня ж анимация висит как поле у плашки. Но помнится, что все вроде быстро заработало, проблемы были в самой анимации, с которой я долго возился. 
Комментарии: Ну я уже высылал скрин пирамидки, поэтому повторюсь с картинкой. На скрине с кодом видно как я подписываю плашки на обработку события. 
29 Домино. Rolling Stones 00:19:29 31 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 00 мин. [Показать отчёт]
Научился: Разным методам анимации, перепробовал кучу всяких вариантов 
Сложности: В моем случае не вся анимация хорошо выглядит, я все реализовывал так чтоб по минимуму перерисовывать графику, из-за этого постоянные затирки других спрайтов или остаются атрибуты от недотертых спрайтов. Со всем этим разобраться ушло много и времени, и мозгов. 
Комментарии: Бурум-бурум. Ну не знаю, что тут писать в КАЖДОМ уроке!)))) 
30 Домино. Наведение порядка 00:20:25 31 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 5 час. 05 мин. [Показать отчёт]
Научился: Без понятия, но чему-то научился, опыт он и в африке опыт. 
Сложности: Сделать независимыми модулями. 
Комментарии: Как я уже говорил, делегат ShowPlate я сделал полем каждой плашки и теперь на каждую плашку я могу повесить цепочку методов, хоть анимации, хоть еще чего-то.  
31 Домино. Финальный аккорд 00:22:58 30 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за не указано [Показать отчёт]
Научился: Писал все и сразу с нуля со своей логикой, но старался по шагам ЕВ. Иногда эти шаги не совпадали, поэтому сказать конкретно за этот урок тяжело. Программа написана неделю назад, местами вылизывал, подпиливал, чтоб не стыдно в отчет выложить. 
Сложности: Довести её до логического конца)) Хотелось бросить её и не заморачиваться, работает и ладно. В плане архитектуры хотелось, чтоб логика была разбита на независимые слои, где каждый верхний слой инкапсулирует нижний. 
Комментарии: Как и обещал, выкладываю свою реализацию на всеобщее рассмотрение. Критика, обсуждения, дополнения, предложения приветствуются. http://www.fayloobmennik.net/5030084 Конечно не идеал, чёт время уже не хочется на нее тратить. Есть моменты реализация которых мне не нравятся, есть моменты с костылями. Коментариев оставил достаточно, но если у кого какие вопросы возникнут, что и как по коду - отвечу. Основные моменты изменений: Плашки - это обычный массив plate[] (этим избежал ненужных эллементов двумерного массива), инкапсулировал его в Plates, где рализовал итератор для него и два именованих энумератора. Это дало возможность перебирать все плашки с помощью foreach и обращаться к плашке так, будто она лежит на поле plates[row,column]. Описал событие которое возникает при смене статуса плашки. Когда плашка меняет статус, генерируется событие, на которое можно подвесить любую цепочку методов для обработки. У меня один метод, который разбирает, как эту плашку анимировать. В плашке есть поле делегат, на который я подписываю метод с анимацией. Каждая плашка может анимироваться как хочет, хоть цепочку из анимаций. При этом сохраняется полная абстракция. Обрабатывая анимацию, мы вообще не в курсе, как именно она анимируется. 
32 ФИНАЛЬНЫЙ урок 00:23:23 23 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 4 час. 00 мин. [Показать отчёт]
Научился: Делать видеообзор 
Сложности: Не запнуться на долгую паузу) 
Комментарии: Сейчас пересмотрел, что я выложил вчера на ютуб и думаю: "Ууууу......" )))) 
Видеообзор: http://www.youtube.com/watch?v=Vfof_eaCjOs
33 VIP урок. Телефон по TCP/IP протоколу 00:47:44 18 чел. ★ 5 Done
  Отчёт отправил: 5027. Руслан Решено за 1 час. 00 мин. [Показать отчёт]
Научился: Создавать TCP соединения 
Сложности: Ну, наверное, понять что за чем следует и почему. 
Комментарии: У меня был опыт только с UDP, как работать с TCP только читал, поэтому было интересно как это реализовывается на пркатике 
  Итого:   33 видеоурока общей продолжительностью 12 час. 26 мин. 18 чел. ★ 4.95  
  Финалисты:   Оля,   Руслан,   Екатерина,   Иван,   Андрей Поляков,   Дмитрий,   Елена,   Ильшат,   Фомичева Наталья,   Илья,   Владимир,   Никита,   Сергей Сергеевич,   Артём,   Мариша ,   Михаил Ермишин,   Максим Лапшинов,   Максим .

Начинаем практику по языку C#




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.
Научился: Работать с Архиватором.
Трудности: Обошлось без трудностей.
Спасибо!
Научился: Еще раз попрактиковалась в создании видео обзора. Правда теперь наверное слишком коротко получилось
Трудности: Ничего
Все понравилось. Спасибо
Смотреть видеозапись: https://youtu.be/zWXRDTVW-t8