Передаём управление

Продолжаем цикл заметок о том, как я делаю что-то похожее на игру практически в прямом эфире.

С анимацией закончили в прошлом посте:

https://dtf.ru/indie/1690488-animaciya-spraytov-ili-testy-na-pesikah

Сегодня не слишком много, но очень важно (как по мне, конечно).

С нуля выстраивать поведение каждого объекта в игре звучит сложно и долго, пожтому мы вводим новый класс, а именно Controller!

Зачем он нужен? Он цепляется к любому предназначенному для этого спрайту и руководит им. По итогу план выглядит примерно так:

Передаём управление

Сначала научим наш спрайт принимать контроллер и слушать его команды. Делать мы это будем в классе-детеныше нашего основного спрайта. А также напишем некоторые дополнительные методы и охапку стандартных команд.

Теоретически все круто, но нужно теперь это все воплотить в реальность. Текущей целью будет подарить возможность спрайту получать команды от пользователя и двигаться туда-сюда по окошку игры. Звучит как механика ААА проекта, так что поехали!

Для начала научим наш спрайт двигаться и переведем текущие координаты объекта в тело класса, чтобы желать с ними все, что нам заблагорассудится, а потом просто подставлять их, куда следует:

self.x = pos_x self.y = pos_y def SetPosition(self): # set sprite position on screen | uses x/y coordinates (0,0 - top left screen corner) self.rect.x = self.x self.rect.y = self.y

Для того, чтобы контроллер и спрайт заговорили на одном языке, а также с целью формирования адекватного (насколько это возможно в моих руках) интерфейса создадим список команд:

class E_DEFAULT_CONTROLLER_COMMANDS: TEST = 0 MOVE_RIGHT = 1 MOVE_LEFT = 2 STOP_MOVE_RIGHT = 3 STOP_MOVE_LEFT = 4 MOVE_UP = 5 MOVE_DOWN = 6 STOP_MOVE_UP = 7 STOP_MOVE_DOWN = 8

Собственно, запускаем, и наша сиба теперь может и напасть (на самом деле нет, но спрятаться за окошком - вполне).

Думаю, есть смысл отметить, что в спрайте появились стейты, как один из вариантов предустановленных настроек, которые применяются к классу при соответствующей команде контроллера.

Ниже как раз объявление стейтов, связанных с движением спрайта и смены его анимации, а также вариант применения:

class STATE: def __init__(self, path, is_moving_hor = 0, is_moving_vert = 0): self.is_moving_hor = is_moving_hor self.is_moving_vert = is_moving_vert self.path = path STATE_IDLE = STATE("PythonGame\Sprites\Doge\Idle") STATE_MOVE_UP = STATE("PythonGame\Sprites\Doge\RunUp",is_moving_vert,-1) STATE_MOVE_DOWN = STATE("PythonGame\Sprites\Doge\Idle",is_moving_vert,1) STATE_MOVE_LEFT = STATE("PythonGame\Sprites\Doge\RunLeft",-1,is_moving_hor) STATE_MOVE_RIGHT = STATE("PythonGame\Sprites\Doge\RunRight",1,is_moving_hor)

Кажется, пришло время это все причесать так, чтобы можно было использовать, и двигаться дальше! Собственно, по плану: коллизии, более-менее удобный "интерфейс", функционал переключения уровней и начнем работу над концептом самой игры)

Всем спасибо!

44
Начать дискуссию