Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
products:laboratory_iot:exp52 [2020/06/11 20:54] – создано labuser29products:laboratory_iot:exp52 [2021/07/21 16:55] (текущий) – [Программный код эксперимента] labuser29
Строка 7: Строка 7:
 </WRAP> </WRAP>
  
 +Отображать игру будем на TFT дисплее, управлять кладовщиком будем с помощью кнопок. Игровое поле разобьем на клетки 16 на 16 пикселей. Разрешение дисплея 128 на 160 пикселей. Получается 8 на 10 клеток.
 +Отображать графику будем с помощью //спрайтов// — маленьких картинок. Мы уже подготовили набор спрайтов, в который входят картинка для стены, ящика, цели и кладовщика. Их нужно загрузить во внутреннюю память микроконтроллера.
 +
 +<WRAP center round download 60%>
 +{{ :products:esp-iot:sokoban_sprites.zip |}}
 +</WRAP>
 +
 +Начнем с построения игрового поля — лабиринта. Нужно описать в каких клетках есть стена, а в каких нет. Проще всего это сделать с помощью двумерного массива. Число 1 будет обозначать наличие стены, а 0 — ее отсутствие.
 +
 +==== Схема эксперимента ====
 +
 +{{ :products:esp-iot:exp25_mont.png?direct&600 |}}
 +//Рисунок 1. Монтажная схема эксперимента для дисплея с 8 выводами//
 +
 +{{ :products:esp-iot:exp25_mont_11pin.png?direct&600 |}}
 +//Рисунок 2. Монтажная схема эксперимента для дисплея с 11 выводами//
 +==== Программный код эксперимента ====
 +
 +<file python Exp52.py[enable_line_numbers="2", start_line_numbers_at="1"]>
 +from machine import Pin, SPI
 +from tft import TFT_GREEN
 +_init()
 +machine.freq(160000000)
 +
 +
 +dc  = Pin(4, Pin.OUT)
 +cs  = Pin(2, Pin.OUT)
 +rst = Pin(5, Pin.OUT)
 +spi = SPI(1, baudrate=40000000, polarity=0, phase=0)
 +
 +tft = TFT_GREEN(128, 160, spi, dc, cs, rst, rotate=0)
 +
 +Map = [
 +    [1,1,0,1,1,1,0,1],
 +    [0,1,1,1,1,1,1,0],
 +    [1,1,0,0,0,1,1,1],
 +    [0,1,0,1,0,1,0,1],
 +    [0,1,0,0,0,1,0,1],
 +    [1,1,1,1,0,0,0,1],
 +    [1,0,0,0,0,0,0,1],
 +    [1,0,0,0,1,0,0,1],
 +    [1,0,0,0,1,1,1,1],
 +    [1,1,1,1,1,0,0,0]
 +]
 +
 +
 +tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, а вместо красного синий
 +tft.clear(tft.COLOR_BLACK)
 +
 +x = 0
 +y = 0
 +
 +for row in Map:
 +    for col in row:
 +        if col:
 +            tft.draw_bmp(x * 16, y * 16,'brick.bmp')
 +        x+=1
 +    x=0
 +    y+=1
 +</file>
 +
 +Мы объявили двумерный массив ''Map'' с описанием игровой карты. И в цикле перебираем все ее элементы. Те элементы, где присутствует 1 мы рисуем изображение стены (картинка brick.bmp).