Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
products:laboratory_iot:exp53 [2020/06/11 21:15] – создано labuser29 | products:laboratory_iot:exp53 [2024/12/13 20:01] (текущий) – [Эксперимент 53. Классы ящиков, человека и цели] labuser30 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ===== Эксперимент 53. Классы язиков, человека и цели ===== | + | ===== Эксперимент 53. Классы ящиков, человека и цели ===== |
В прошлом эксперименте мы подключили TFT дисплей, | В прошлом эксперименте мы подключили TFT дисплей, | ||
- | Как мы уже поняли, | + | Как мы уже поняли, |
+ | |||
+ | === Класс ящика === | ||
+ | Начнем с класса ящика. Главные свойства ящика, это его координаты на карте и его состояние — находится он на цели или нет. | ||
+ | |||
+ | <code python> | ||
+ | class Box: | ||
+ | def __init__(self, | ||
+ | self.tft = tft | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.picture = ' | ||
+ | self.picture_onGate = ' | ||
+ | self.onGate = False | ||
+ | self.draw() | ||
+ | |||
+ | def draw(self): | ||
+ | if (self.onGate): | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture_onGate) | ||
+ | else: | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
+ | |||
+ | def setOnGate(self, | ||
+ | self.onGate = state | ||
+ | |||
+ | def getOnGate(self): | ||
+ | return self.onGate | ||
+ | |||
+ | def getPos(self): | ||
+ | return (self.x, self.y) | ||
+ | |||
+ | def setPos(self, | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.draw() | ||
+ | </ | ||
+ | |||
+ | В конструктор мы передаем такие параметры как объект дисплея, | ||
+ | |||
+ | Метод '' | ||
+ | |||
+ | Метод '' | ||
+ | |||
+ | Метод '' | ||
+ | |||
+ | === Класс цели === | ||
+ | Класс цели намного проще. Цель никуда не перемещается и свойств не имеет. Цель имеет только координаты и должна отображаться на экране с помощью своего спрайта. | ||
+ | |||
+ | <code python> | ||
+ | class Gate: | ||
+ | def __init__(self, | ||
+ | self.tft = tft | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.picture = ' | ||
+ | self.draw() | ||
+ | |||
+ | def draw(self): | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
+ | |||
+ | def getPos(self): | ||
+ | return (self.x, self.y) | ||
+ | </ | ||
+ | |||
+ | Метод '' | ||
+ | |||
+ | === Класс кладовщика === | ||
+ | Кладовщик также имеет координаты своего нахождения на поле и имеет свой спрайт. | ||
+ | |||
+ | <code python> | ||
+ | class Man: | ||
+ | def __init__(self, | ||
+ | self.tft = tft | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.picture = ' | ||
+ | self.draw() | ||
+ | |||
+ | def draw(self): | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
+ | |||
+ | def getPos(self): | ||
+ | return (self.x, self.y) | ||
+ | |||
+ | def setPos(self, | ||
+ | self.tft.rect(self.x * 16, self.y * 16, 16, 16, tft.COLOR_BLACK) | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.draw() | ||
+ | </ | ||
+ | |||
+ | Конструктор и методы '' | ||
+ | |||
+ | Класса стен не будет. Мы будем пользоваться нашим двумерным массивом в котором уже описали план уровня. | ||
+ | |||
+ | Теперь, | ||
+ | |||
+ | ==== Схема эксперимента ==== | ||
+ | Схема не изменилась. | ||
+ | |||
+ | {{ : | ||
+ | // | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | // | ||
+ | ==== Программный код эксперимента ==== | ||
+ | |||
+ | <file python Exp53.py[enable_line_numbers=" | ||
+ | from machine import Pin, SPI | ||
+ | from tft import TFT_GREEN | ||
+ | _init() | ||
+ | machine.freq(160000000) | ||
+ | |||
+ | |||
+ | dc = Pin(4, Pin.OUT) #a0 | ||
+ | cs = Pin(2, Pin.OUT) | ||
+ | rst = Pin(5, Pin.OUT) | ||
+ | spi = SPI(1, baudrate=40000000, | ||
+ | |||
+ | # TFT object, this is ST7735R green tab version | ||
+ | tft = TFT_GREEN(128, | ||
+ | |||
+ | Map = [ | ||
+ | [1, | ||
+ | [0, | ||
+ | [1, | ||
+ | [0, | ||
+ | [0, | ||
+ | [1, | ||
+ | [1, | ||
+ | [1, | ||
+ | [1, | ||
+ | [1, | ||
+ | ] | ||
+ | |||
+ | Gates = [] | ||
+ | Boxes = [] | ||
+ | |||
+ | class Box: | ||
+ | def __init__(self, | ||
+ | self.tft = tft | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.picture = ' | ||
+ | self.picture_onGate = ' | ||
+ | self.onGate = False | ||
+ | self.draw() | ||
+ | |||
+ | def draw(self): | ||
+ | if (self.onGate): | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture_onGate) | ||
+ | else: | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
+ | |||
+ | def setOnGate(self, | ||
+ | self.onGate = state | ||
+ | |||
+ | def getOnGate(self): | ||
+ | return self.onGate | ||
+ | |||
+ | def getPos(self): | ||
+ | return (self.x, self.y) | ||
+ | |||
+ | def setPos(self, | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.draw() | ||
+ | |||
+ | class Gate: | ||
+ | def __init__(self, | ||
+ | self.tft = tft | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.picture = ' | ||
+ | self.draw() | ||
+ | |||
+ | def draw(self): | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
+ | |||
+ | def getPos(self): | ||
+ | return (self.x, self.y) | ||
+ | |||
+ | class Man: | ||
+ | def __init__(self, | ||
+ | self.tft = tft | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.picture = ' | ||
+ | self.draw() | ||
+ | |||
+ | def draw(self): | ||
+ | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
+ | |||
+ | def getPos(self): | ||
+ | return (self.x, self.y) | ||
+ | |||
+ | def setPos(self, | ||
+ | self.tft.rect(self.x * 16, self.y * 16, 16, 16, tft.COLOR_BLACK) | ||
+ | self.x = x | ||
+ | self.y = y | ||
+ | self.draw() | ||
+ | |||
+ | # init TFT | ||
+ | tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, | ||
+ | tft.clear(tft.COLOR_BLACK) #b, g, r | ||
+ | |||
+ | x = 0 | ||
+ | y = 0 | ||
+ | |||
+ | for row in Map: | ||
+ | for col in row: | ||
+ | if col: | ||
+ | tft.draw_bmp(x * 16, y * 16,' | ||
+ | x+=1 | ||
+ | x=0 | ||
+ | y+=1 | ||
+ | |||
+ | Boxes.append(Box(tft, | ||
+ | Boxes.append(Box(tft, | ||
+ | Boxes.append(Box(tft, | ||
+ | |||
+ | Gates.append(Gate(tft, | ||
+ | Gates.append(Gate(tft, | ||
+ | Gates.append(Gate(tft, | ||
+ | |||
+ | man = Man(tft, 5, 6) | ||
+ | </ | ||
+ | |||
+ | Для хранения объектов целей и ящиков создаем массивы: | ||
+ | <code python[enable_line_numbers=" | ||
+ | Gates = [] | ||
+ | Boxes = [] | ||
+ | </ | ||
+ | |||
+ | Создаем три объекта ящиков с координатами 3,4; 4,6 и 2,7: | ||
+ | <code python[enable_line_numbers=" | ||
+ | Boxes.append(Box(tft, | ||
+ | Boxes.append(Box(tft, | ||
+ | Boxes.append(Box(tft, | ||
+ | </ | ||
+ | |||
+ | Оператор '' | ||
+ | |||
+ | Создаем объекты целей: | ||
+ | <code python[enable_line_numbers=" | ||
+ | Gates.append(Gate(tft, | ||
+ | Gates.append(Gate(tft, | ||
+ | Gates.append(Gate(tft, | ||
+ | </ | ||
+ | |||
+ | Создаем кладовщика: | ||
+ | <code python[enable_line_numbers=" | ||
+ | man = Man(tft, 5, 6) | ||
+ | </ | ||
+ | |||
+ | Теперь мы имеем игровое поле с лабиринтом, |