Это старая версия документа!


Эксперимент 53. Классы ящиков, человека и цели

В прошлом эксперименте мы подключили TFT дисплей, создали игровую карту в виде двумерного массива и отобразили ее на экране. Теперь давайте поймем какие вообще объекты задействованы в игровом процессе. Как мы уже поняли, это стены, ящики, кладовщик и цели, куда нужно перетащить ящики. Теперь нужно описать каждый из классов.

Класс ящика

Начнем с класса ящика. Главные свойства ящика, это его координаты на карте и его состояние — находится он на цели или нет.

class Box:
    def __init__(self, tft, x, y):
        self.tft = tft
        self.x = x
        self.y = y
        self.picture = 'box.bmp'
        self.picture_onGate = 'boxngate.bmp'
        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, state):
        self.onGate = state
 
    def getOnGate(self):
        return self.onGate
 
    def getPos(self):
        return (self.x, self.y)
 
    def setPos(self, x, y):
        self.x = x
        self.y = y
        self.draw()

В конструктор мы передаем такие параметры как объект дисплея, координата x, координата y. Координата ящика указывается не в пикселях, а в клетках игрового поля. В самом конструкторе мы задаем имя спрайта для ящика на цели self.picture_onGate = 'boxngate.bmp' и вне цели self.picture = 'box.bmp'. Свойство onGate как раз описывает состояние ящика. В конце конструктор вызывает метод отрисовки draw.

Метод draw() предназначена для отрисовки ящика. Если ящик находится на цели, то функция отображает спрайт self.picture_onGate, иначе self.picture. Координата ящика указывается не в пикселях, а в клетках игрового поля, поэтому для отображения картинки ее необходимо пересчитать в пиксели. Для этого координата умножается на размер ящика в пикселях.

Метод setOnGate() служит для установки свойства нахождения на цели. А метод getOnGate() для чтения этого свойства.

Метод getPos возвращает текущие координаты ящика. А метод setPos устанавливает новые координаты ящика, после чего перерисовывает его на новом месте.

Класс цели

Класс цели намного проще. Цель никуда не перемещается и свойтсв не имеет. Цель имеет только координаты и должна отображаться на экране с помощью своего спрайта.

class Gate:
    def __init__(self, tft, x, y):
        self.tft = tft
        self.x = x
        self.y = y
        self.picture = 'gate.bmp'
        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)

Метод daraw служит для отрисовки спрайта цели в заданных координатах. Так как координаты цели задаются не в пикселях, а в клетках поля, необходимо пересчитать их в пиксели для оборажения. Поэтому координаты в клетках умножаются на размер клетки — 16.