Продолжаем делать игры

Никогда не думал, что это может кому-то понравится, но уже 4 лайка под прошлым постом, и я думаю, что можно и дальше писать тут небольшие заметки.

Скажу честно, даже для моего уровня код для Deadly Cubes From Outer Space Attack (ниже ссылка на пост) написан плоховато, поэтому в голову пришла идея сверстать нормальный мини-движок с понятной структурой и возможностью делать на нем всякое.

Начнем с основных требований, это кратко: небольшие легковесные 2D проекты (на самом деле не только 2D, но напишем так), а также кроссплатформенность, как минимум Win и MacOS.

Чтож, приступим. Немного "архитектуры". У нас с фантазией все в порядке, поэтому базовый класс назовем GAME. Он будет принимать параметры игры, отслеживать её состояние и рендерить. Немного кода для тех, кому интересно (ну и заметка от этого коуче выглядит):

class GAME: # essential class | contains game status info and responsible for graphics def __init__(self, SETTINGS): self.settings = SETTINGS self.clock = pygame.time.Clock() self.screen = pygame.display.set_mode((self.settings.WIDTH, self.settings.HEIGHT)) pygame.display.set_caption(self.settings.CAPTION) self.running = True def Tick(self): # will be called every frame | chasing FPS self.clock.tick(self.settings.FPS) def DrawAll(self, Container): # takes all the graphic containers in one | decomposite ones and call to draw it one by one for elem in Container: self.__Draw(elem) def __Draw(self, Container): # takes one graphic container and draw all elements from it for elem in Container: self.screen.blit(elem.surf, elem.rect)

Но надо же что-то рисовать! Скажете Вы, и это верно. Следующей гранью нашего бриллианта станет класс SPRITE. Он будет базовым и его функционал будет сводиться к загрузке изображений, проигрыванию анимации, размещении в конкретном месте на экране и масштабировании. Ещё немного кода для крутости:

class SPRITE(): # basic class for sprite | takes image, can be animated, resizable, movable def __init__(self, folder_path = 'Sprites/Default', w = 300, h = 300, pos_x = 0, pos_y = 0, animate = False): self.path = folder_path self.__ApplyImage(1) self.rect = self.surf.get_rect() self.SetPosition(pos_x, pos_y) self.SetScale(w,h) self.anim = animate def Tick(self): # will be called every frame | updates animations if (self.anim): self.__UpdateAnim() def __UpdateAnim(self): # updates animation | takes selected path to apply images from it if(self.anim): try: self.__ApplyImage(self.path + '/' + str(self.image_num + 1) + '.bmp') except: self.image_num = 1 self.__ApplyImage(self.path + '/' + str(self.image_num) + '.bmp') def __ApplyImage(self, number): # applies image to sprite | takes integer number and found related image in set path self.surf = pygame.image.load(self.path + '/' + str(number) + '.bmp') print ("sprite image applied: " + self.path + '/' + str(number) + '.bmp') self.image_num = number def SetPosition(self, x, y): # set sprite position on screen | uses x/y coordinates (0,0 - top left screen corner) self.rect.x = x self.rect.y = y def SetScale(self, w, h): # set scale of the sprite | w - width, h - height self.surf = pygame.transform.scale(self.surf, (w,h))

В общем в основу нашего рендера лягут 3 базовых слоя: фон, который не будет реагировать на коллизии, акторы, в число которых войдут все подвижные и интерактивные игровые объекты, а сверху все накроется кнопками и текстом (UI). Не возможно без картинки, так что вот:

Продолжаем делать игры

Собираем наше чудо и получаем прелестного котика из интернета на романтично-синем фоне:

Продолжаем делать игры

а, может, лучше больше котиков?

Продолжаем делать игры

Дальше - больше: запустим анимацию и перейдем к созданию стандартных классов для конструирования игры)

15
4 комментария

Я правильно понимаю, что будут только картинки, а шейдеров не будет?
Вообще никакой пост обработки изображений на GPU, как во времена Бориса Годунова, или когда там такие игры делали?

1
Ответить

Сори, как-то я промазал мимо кнопки ответить, ответ на коммент ниже)

Ответить

Привет, я не слышал про шейдеры в PyGame - сама библиотека для максимально простых проектов, по крайнем мере мне так кажется. Тут скорее мезозой, но это позволяет без особых навыков потестировать разные идеи. Закончу веселье тут, попробую OpenGL - но это явно больше времени потребует)

Ответить

Ненене, не лезь туда. Лучше ищи надстройку над OpenGL.
Эта либа - она для создания тулов. А тулы для создания игр. Хочешь игры, ищи ченить выше уровнем.

1
Ответить