-
Notifications
You must be signed in to change notification settings - Fork 62
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Levitsky-Ilya
authored
Oct 12, 2019
1 parent
51941c4
commit 4081211
Showing
1 changed file
with
51 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,59 @@ | ||
## Задание 12 "i2c_oled_display" | ||
## BMP to sprite conversion | ||
|
||
### Подключение дисплея | ||
### Мотивация | ||
|
||
<p align="center"> | ||
<img width="600" src="https://github.com/edosedgar/stm32f0_ARM/wiki/oled.jpg" alt="oled.jpg"/> | ||
<p align="center"> Рис. 1. Схема подключения дисплея <p align="center"> | ||
Когда появляется *черно-белый дисплей*, появляется множество идей как его можно использовать. Кто выводит серые *картинки*, скачанные или нарисованные самостоятельно, кто пишет удобный *интерфейс* для взаимодействия с МК, а кто создаёт *анимацию или игры*. В последнем случае различные создаются облики персонажей и объектов. И один из способ вывести такого персонажа на экран - нарисовать его по пикселям. Это способ достичь результат, но не самый быстрый и удобный способ. | ||
|
||
### Инициализация I2C | ||
Пользование дисплеем с помощью МК **воодушевляет** на создание проектов. Поэтому реализация любой графической задумки должна быть **быстрой и удобной**. Иначе интерес пропадает. Причём потраченные временные ресурсы должны сводится к минимуму, обьём написанного кода не должнен выливаться за пределы памяти МК, а исполнение по возможности быстрое. Предсталенный здесь *гибкий инструмент* **BMP to sprite conversion** пригодится для реализации всевозможных идей. Начиная от создания небольших обьектов, персонажей и заканчивая большими движущимися фонами, вроде пронасящегося мимо космического пространства. | ||
|
||
### Инициализация SSD1306 | ||
### О программе | ||
|
||
### Базовые функции | ||
Инструмент **BMP to sprite conversion** позволяет перевести рисунок из файла типа BMP в С код и дальше на дисплей. Состоит интрумент из двух частей. Первая часть - программа для преобразования BMP файла в код. Вторая часть - функции для вывода риуснка на экран. Эти функции включены в библиотеку управления дисплеем `oled_display`. | ||
|
||
### Игра «Жизнь» (Conway's Game of Life) | ||
Правила, по которым работает преобразование, можно найти в мануале "BMP to sprite converter" | ||
|
||
### Отрисовка черно-белых картинок | ||
### Быстрый старт | ||
1. Создайте картинку в формате BMP с *8 битной глубиной цвета*. Задайте имя картинке такое же, как имя самого спрайта. Нарисуйте небольшой пиксель-арт – *спрайт* – ту картинку, которую вы хотите вывести на экран. Картинка может быть трех «цветов»: белый, черный и прозрачный. Прозрачным будет считаться любой цвет кроме черного и белого. Сохраните картинку в отдельной папке, в которой больше нет других файлов. | ||
|
||
### Дизеринг | ||
2. Запустите bmp2arr программу, указав в качестве аргумента путь к папке. В результате получится файл формата С, в котором содержится вся информация о вашем спрайте. Вторым аргументом к программе можно (но не обязательно) указать желаемое имя для создаваемого С файла. | ||
3. Поместите сгенерированный файл в папку с вашим проектом. Убедитесь, что в проекте вы также используете `oled_display.c` и `oled_display.h` *с поддержкой рисования спрайтов*. | ||
|
||
4. Нарисуем созданный спрайт на экране. В начале создадим переменную типа Sprite. Затем проинициализируем ее именно теми данными, которые хранятся в сгенерированном ранее файле. Перед этим портируем соответствующую функцию инициализации из того файла (extern). | ||
```C | ||
#include “oled_display.h” | ||
<…> | ||
extern void init_dino_sprite(Sprite *sprite); | ||
Sprite dino; | ||
init_dino_sprite(&dino); | ||
``` | ||
5. Используем функцию рисования спрайта draw_sprite. Укажем аргументы: переменную типа `Sprite`, номер костюма (пока 0), координаты `x` и `y` на экране, считая от верхнего левого угла экрана до верхнего левого угла исходной картинки BMP. Опции оставим 0. | ||
```C | ||
int16_t x = 10; int16_t y = 10; | ||
draw_sprite(dino, 0, x, y, 0); | ||
``` | ||
|
||
6. Запускаем и любуемся! | ||
Это был краткий экскурс, как рисовать спрайты. Далее идут тонкости, описанные в мануале. | ||
|
||
### Испытай себя | ||
|
||
1. Нарисуйте динозаврика | ||
|
||
2. Сделайте много одинаковых спрайтов, используя одну картинку. | ||
|
||
3. Используйте костюмы: Сделайте экран загрузки или анимацию пламени. | ||
|
||
4. Используйте отражения: Сделайте пакмана, перемещающего вправо-влево. Затем добавьте костюмов с движением вверх-вниз. | ||
|
||
5. Добавьте фон, нарисованный своими руками. | ||
|
||
6. Сделайте сразу несколько разных спрайтов - с костюмами или без. | ||
|
||
7. Вашего персонажа не всегда видно на любом фоне? Используйте опции вроде `DRAW_BLACK_INVERT`. | ||
|
||
8. Проверка на коллизию: пусть фон - лабиринт! Белый пакман коснулся белой стенки? - вернулся в начало. | ||
|
||
9. Сделайте мини-игру, используя по полной новый функционал! | ||
|
||
10. Функционала не хватает? Разберите весь код и улучшите/дополните его для себя! Если нововведение хорошо - оно может попасть в оригинальный код ;) |