def __init__(self, location, background): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.image, self.rect = load_image('images/person-icon.png', -1) self.location = location screen = pygame.display.get_surface() self.area = screen.get_rect() font = pygame.font.Font(None, 36) if location == 'N': self.rect.midtop = background.get_width() / 2, 10 text = font.render("Tim", 1, (10, 10, 10)) textpos = text.get_rect(centerx=background.get_width() / 2, centery=100) background.blit(text, textpos) elif location == 'S': self.rect.midbottom = 650, 760 text = font.render("You", 1, (10, 10, 10)) textpos = text.get_rect(centerx=background.get_width() / 2, centery=background.get_height() - 130) background.blit(text, textpos) elif location == 'W': self.rect.midleft = 10, 400 text = font.render("Gary", 1, (10, 10, 10)) textpos = text.get_rect(centerx=35, centery=background.get_height() / 2 + 50) background.blit(text, textpos) elif location == 'E': self.rect.midright = 1290, 400 text = font.render("Sam", 1, (10, 10, 10)) textpos = text.get_rect(centerx=background.get_width() - 40, centery=background.get_height() / 2 + 50) background.blit(text, textpos)
def __init__(self, coords=(0,0), speed=(0,0)): Game_Object.__init__(self, coords=coords, speed=speed) self.image = load_image('yellow_car.png', path='Images', alpha_cannel=True) self.image = pygame.transform.rotate(self.image, -90) self.image = pygame.transform.scale(self.image, (50,50)) self.rect = self.image.get_rect() self.track = None
def __init__(self, group): super().__init__(group) self.sheet = load_image(['Menu', 'background', 'background.png'], colorkey=None) self.frames = sprite_sheet(self.sheet, 5, 2) self.going_to = 0 self.image = self.frames[self.going_to] self.rect = self.image.get_rect() self.rect.x = 0 self.rect.y = 0
def main(): img_high = high_pass_filter('images/97.jpg', 20) img_low = low_pass_filter('images/97.jpg', 16) figures = [] figures.append(('Orignal image', load_image('images/97.jpg', type=0))) figures.append(('Low pass filter', img_low.copy())) figures.append(('High pass filter', img_high.copy())) plot_figures(figures, 2, 2)
def __init__(self, groups, size, pos, path): x, y = pos if (isinstance(groups, tuple) or isinstance(groups, list)) is False: groups = (groups,) super().__init__(*groups) self.image = load_image([TILES_PATH, path]) self.image = pygame.transform.scale(self.image, size) self.mask = pygame.mask.from_surface(self.image) self.rect = self.image.get_rect() self.rect.x, self.rect.y = x * BLOCK_SIZE[0], y * BLOCK_SIZE[0] self.pos_x, self.pos_y = self.rect.x, self.rect.y self.rel_pos_x, self.rel_pos_y = self.rect.x, self.rect.y
class Goomba(BaseCharacter): """Класс Гумбы (враждебный ходячий гриб)""" # Здесь происходит загрузка изображений Гумбы для разных миров IMAGES = {name: surf for name, surf in zip(['normal', 'underground', 'castle', 'underwater'], cut_sheet(load_image("Goomba.png"), 3, 4))} def __init__(self, x, y, world): self.SMERT_TIME = 5 # Общее время отображения картинки расплющенного Гумбы в кадрах self.smert = 0 # Счетчик, показывающий сколько прошло кадров с момента смерти # Когда self.smert станет равен self.SMERT_TIME, Гумба будет удален self.cur_frame = 0 # Счетчик кадров self.frames = Goomba.IMAGES[world] # Все изображения Гумбы для этого мира # 0 и 1 картинка - шаги, 2 - смерть self.image = self.frames[self.cur_frame] super().__init__(x, y, all_sprites, enemies_group) self.vx = -1 # Скорость в пикселях на кадр def update(self): # Блок кода, отвечающий за задержку для показа соотвествующей картинки перед смертью if self.smert: self.smert += 1 if self.smert == self.SMERT_TIME: self.kill() return self.cur_frame = (self.cur_frame + 1) % 60 # Обновление счетчика кадров self.image = self.frames[self.cur_frame // 15 % 2] # Каждые 15 кадров меняем картинку, # тем самым создается анимация шагов self.update_coords() self.check_tile_collisions() self.check_enemies_collisions() self.sides_group.draw(screen) # Отрисовка коллизий def die(self, rate): """rate - множитель очков, выдающихся при убийстве Гумбы. Позволяет делать комбо""" self.image = self.frames[2] self.smert = max(1, self.smert) # Запуск счетчика смерти. max нужен, # чтобы счетчик не сбрасывался при возможных повторных вызовах метода PointsUp(*self.rect.topleft, 200 * rate) # Создаем высвечивающиеся очки hud.add_score(200 * rate) # Добавляем счет в худ def fast_die(self): """Метод нужен для убийства черепахой, огненным шаром, движущимся блоком. Здесь не особо полезен, просто предоставляет такой же интерфейс, как у Купы""" self.die(0.5)
class FlagPole(pygame.sprite.Sprite): """Класс флагштока. Проверкой коллизии занимается Player""" image = load_image("flagpole.png") def __init__(self, x, y): """y - нижняя часть, так удобнее, не нужно помнить высоту флагштока""" super().__init__(all_sprites, castle_group) self.image = FlagPole.image self.rect = self.image.get_rect() # Перевод координат из блоков в пиксели. self.rect.x, self.rect.y = (x - 1) * PPM, (y - 10) * PPM self.flag = Flag(x, y) # Создаем флажок def start(self): self.flag.start()
def main(): imageSource = 'images/img1original.tif' image = load_image(imageSource, type=0) gaussian_noise_image = add_gaussian_noise(image.copy(), 0, 300) salt_and_peper_noise_image = add_salt_and_pepper_noise( image.copy(), 0.04, 0.5) figures = [] figures.append(('Orignal Image', image.copy())) figures.append(('Gaussian noise Image', gaussian_noise_image.copy())) figures.append( ('Salt and Pepper Image', salt_and_peper_noise_image.copy())) plot_figures(figures, 1, 3)
def main(): img = load_image('images/img1noisy.tif', type=0) rows, cols = img.shape rows = rows // 2 cols = cols // 2 img_left = img[:, :cols + 1] img_right = img[:, cols:] remove_noise(img_left, 'Left', 3, max_filter) remove_noise(img_left, 'Left', 3, min_filter) remove_noise(img_left, 'Left', 3, mean_filter) remove_noise(img_left, 'Left', 3, median_filter) remove_noise(img_right, 'Right', 3, max_filter) remove_noise(img_right, 'Right', 3, min_filter) remove_noise(img_right, 'Right', 3, mean_filter) remove_noise(img_right, 'Right', 3, median_filter)
class ItemBase(BaseCharacter): """Базовый класс для различных бонусов. Бонусы никак не взаимодействуют с врагами.""" # Загрузка всех изображений и распределение их на группы ITEMS = { name: surf for name, surf in zip( ['normal', 'underground', 'castle', 'underwater'], cut_sheet(load_image("Items.png"), 19, 4)) } def __init__(self, x, y): super().__init__(x, y, all_sprites, items_group) self.vx = 5 # Скорость в пикселях на кадр # Высота, до котор. нужно поднятся бонусу при появлении из блока, прежде чем начать движение self.uprise = self.rect.y - self.rect.h + self.rect.h // 3 self.create_sides() def move(self): """Метод, отвечающий анимацию появления бонуса из блока""" if self.uprise is not None and self.rect.y > self.uprise: self.rect.y -= 1 if self.rect.y == self.uprise: self.uprise = None return True def update(self): # Если бонус еще не до конца появился, то не обновляем координаты в зависимости от скорости if self.move(): return self.update_coords() self.check_player_collisions() vx = self.vx # Старое направление self.check_tile_collisions() if vx != self.vx: # При изменении направления отражаем картинку self.image = pygame.transform.flip(self.image, True, False) self.sides_group.draw(screen) # Отрисовка коллизий
class Flag(pygame.sprite.Sprite): """Класс флажка, может опускаться пока не достигнет блока""" image = load_image("flag.png") def __init__(self, x, y): super().__init__(all_sprites, castle_group) self.image = Flag.image self.rect = self.image.get_rect() # Перевод координат из блоков в пиксели. Флажок имеет смещение относительно флагштока self.rect.x, self.rect.y = (x - 1.5) * PPM, (y - 9) * PPM self.vy = 0 def update(self): """Если скорость не равна 0, то метод опускает флажок, сбрасывает скорость, когда флажок коснется блока""" self.rect.y += self.vy if self.vy and pygame.sprite.spritecollideany(self, tiles_group): self.vy = 0 def start(self): """Чтобы заставить флажок опуститься присваеваем ему вертикалькую скорость""" self.vy = 10
def main(): # sobel in x direction sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]) # sobel in y direction sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]) img = load_image('images/two_cats.jpg', type=0) # img_dft = compute_dft(img) img_dft = np.fft.fft2(img) sobelx_filter_dft = np.fft.fft2(sobel_x, s=img.shape) sobely_filter_dft = np.fft.fft2(sobel_y, s=img.shape) filteredx_img_dft = img_dft * sobelx_filter_dft filteredy_img_dft = img_dft * sobely_filter_dft filteredx_img_back = np.fft.ifft2(filteredx_img_dft) filteredy_img_back = np.fft.ifft2(filteredy_img_dft) ans = filteredy_img_back.real + filteredx_img_back.real ans = linear_transformation_to_pixel_value_range(ans) plot_image(ans, False)
class Castle(pygame.sprite.Sprite): """Класс замка в конце уровня""" image = load_image("castle_big.png") SMALL_HEIGHT = 4 BIG_HEIGHT = 10 def __init__(self, x, y, is_big): """y координата - нижняя сторона, т.к. замки имеют разную высоту""" super().__init__(all_sprites, castle_group) self.image = Castle.image self.rect = self.image.get_rect() x_off = 4 # Замок слегка сдвинут по x if is_big: # Вычисление верхней строны в зависимости от высоты. y -= Castle.BIG_HEIGHT else: # Маленький замок - это большой, низ которого спрятан под землей :) y -= Castle.SMALL_HEIGHT # Перевод координат из блоков в пиксели self.rect.x, self.rect.y = (x - x_off - 1) * PPM, y * PPM def get_centre(self): """Возвращает координаты двери""" return self.rect.x + 4 * PPM
def __init__(self, suit, value): pygame.sprite.Sprite.__init__(self) #call Sprite initializer self.suit = suit self.value = value self.image, self.rect = load_image('images/card-back.jpg', -1)
class Fire(BaseCharacter): """Класс фаерболов, выпусаемых Огненным Марио. Убивают врагов одним выстрелом, взрываются при контакте с боком блока, отскакивают от верха, не взаимодействуют с игроком""" IMAGES = cut_sheet(load_image("fire.png"), 4, 1)[0] # Загрузка всех изображений фаербола # Первое разбивается на 4 маленьких FLYING = [col for row in cut_sheet(IMAGES[0], 2, 2) for col in row] EXPLODE = IMAGES[1:] def __init__(self, x, y, direction): """direction зависит от Направления марио""" self.cur_frame = 0 # Счетчик кадров self.image = Fire.FLYING[self.cur_frame] super().__init__(x, y, all_sprites, items_group) self.vx = 5 * direction # Горизонтальная скорость в пикселях на кадр self.explosion = False # Если True воспроизводится анимация взрыва self.explosion_time = 0 # Счетчик кадров анимации взрыва self.explosion_end = 17 # Общее время анимации взрыва в кадрах def update(self): self.cur_frame = (self.cur_frame + 1) % 60 # Обновление счетчика кадров if self.explosion: # Воспроизведение анимации взрыва self.image = Fire.EXPLODE[self.explosion_time // 6] self.explosion_time += 1 if self.explosion_time == self.explosion_end: self.kill() return self.image = Fire.FLYING[self.cur_frame // 15 % 4] # Каждые 15 кадров обновляем изборажение # тем самым достигается анимация вращения в полете self.update_coords() # Обновляем y координату self.rect.x += self.vx # Обновляем x координату self.check_tile_collisions() self.check_enemies_collisions() self.sides_group.draw(screen) # Отрисовка коллизий def check_tile_collisions(self): """Изменение направления движения при столкновении с блоком либо запуск взрыва. Переопределяет родительский метод check_tile_collisions, т.к. фаербол имеет уникальное поведение""" self.update_sides() for side in [self.left_side, self.right_side]: colided_tile = pygame.sprite.spritecollideany(side, tiles_group) if colided_tile: self.vx = 0 self.explosion = True self.update_sides() return colided_tile = pygame.sprite.spritecollideany(self.down_side, tiles_group) if colided_tile: self.rect.bottom = colided_tile.rect.y self.vy = -self.max_vy self.update_sides() colided_tile = pygame.sprite.spritecollideany(self.top_side, tiles_group) if colided_tile: self.rect.y = colided_tile.rect.bottom self.vy = self.max_vy self.update_sides() def check_enemies_collisions(self): """Быстрое убийство врага при соприкосновении""" collided_enemy = pygame.sprite.spritecollideany(self, enemies_group) if collided_enemy: collided_enemy.fast_die() self.explosion = True
class Koopa(BaseCharacter): """Класс Купы (враждебной черепахи). Может скрываться в панцирь, кататься по уровню, убивая других врагов и игрока""" # Загрузка всех изображений и распределение их на группы. # Изображение скрытой в панцирь Купы приходится грузить отдельно, т.к. оно имеет другую высоту IMAGES = { name: (surf1 + surf2) for name, surf1, surf2 in zip( ['normal', 'underground', 'castle', 'underwater'], cut_sheet(load_image("Koopa.png"), 4, 4), cut_sheet(load_image("Koopa_hidden.png"), 2, 4)) } L_KOOPA = {key: images[:2] + images[4:6] for key, images in IMAGES.items()} # Зеркальные изображения для другого направления движения R_KOOPA = { key: [pygame.transform.flip(frame, True, False) for frame in images] for key, images in L_KOOPA.items() } def __init__(self, x, y, world): self.world = world self.smert = 0 # Счетчик кадров прошедших после того, как игрок наступил на Купу self.REVIVAL_TIME = 60 * 6 # Время появление лапок Купы из панциря в кадрах self.SMERT_TIME = 60 * 8 # Время выхода Купы из панциря в кадрах self.cur_frame = 0 # Счетчик кадров self._load_frames() self.image = self.frames[self.cur_frame] super().__init__(x, y, all_sprites, enemies_group) self.vx = -2 # Скорость в пикселях на кард self.value = 400 # Количество очков за убийство def _load_frames(self): """Внутренний метод загрузки кадров""" # Все кадры купы для этого мира self.l_frames = Koopa.L_KOOPA[self.world] self.r_frames = Koopa.R_KOOPA[self.world] self.frames = self.l_frames def load_image(self, index): """Метод загрузки изображений с сохранением координат после изменения высоты изображения""" topleft = self.rect.topleft self.image = self.frames[index] self.rect = self.image.get_rect() self.rect.topleft = topleft self.update_sides() def update(self): self.update_coords() self.check_tile_collisions() # Выбор кадров в зависимости от направления движения self.frames = self.l_frames if self.vx < 0 else self.r_frames self.check_enemies_collisions() self.sides_group.draw(screen) # Отрисовка колизий if self.smert: # Анимации скрытой Купы, скрытой Купы с лапками, выхода Купы из панциря if not self.vx: self.smert += 1 if self.smert == self.REVIVAL_TIME: # скрытая Купа с лапками self.image = self.frames[3] elif self.smert == self.SMERT_TIME: self.load_image(self.cur_frame // 15 % 2) # обычная шагающая Купа self.smert = 0 self.vx = -2 else: self.cur_frame = (self.cur_frame + 1) % 60 # Обновление счетчика кадров self.image = self.frames[self.cur_frame // 15 % 2] # Каждый 15 кадр обновляем картинку, # тем самым создается анимация шагов def die(self, rate): """rate - множитель очков, выдающихся при убийстве Купы. Позволяет делать комбо""" if not self.smert: # Спрятаться в панцирь и остановиться self.load_image(2) self.smert = 1 self.vx = 0 else: if not self.vx: # Выбор направления движения катающейся в панцире Купы right = (self.rect.x + self.rect.w // 2) > ( Map.get_player().rect.x + Map.get_player().rect.w // 2) self.vx = 10 if right else (-10) else: # Окончательное убийство Купы PointsUp(*self.rect.topleft, self.value * rate) hud.add_score(self.value * rate) self.kill() def fast_die(self): """Метод нужен для убийства черепахой, огненным шаром, движущимся блоком.""" PointsUp(*self.rect.topleft, self.value // 2) hud.add_score(self.value // 2) self.kill() def check_enemies_collisions(self): if self.smert and self.vx: # Убийство врагов ездящей Купой [ enemy.die(2) if enemy is not self else None for enemy in pygame.sprite.spritecollide( self, enemies_group, False) ] else: # В обычном состоянии Купа меняет направление при столкновении с врагом super().check_enemies_collisions()