Mister_G
@Mister_G
молодой маслёнок

Как создать новый ряд капель после удаления предыдущего?

Перепробовал много различных способов создания нового ряда, после удаления предыдущего. Ничего не выходит
Задание из книги Эрика Метиза

13-3. Капли: найдите изображение дождевой капли и создайте сетку из капель. Капли
должны постепенно опускаться вниз и исчезать у нижнего края экрана.
13-4. Дождь: измените свой код в упражнении 13-3, чтобы при исчезновении ряда капель
у нижнего края экрана новый ряд появлялся у верхнего края и начинал падение.


Основной файл
import sys
import pygame
from settings_stars import Settings
import functions_stars as fs
from pygame.sprite import Group


def run_game():
    pygame.init()
    settings = Settings()
    screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
    pygame.display.set_caption(settings.display_name)

    patrik = Group()
    fs.create_fleet(settings, screen, patrik)

    while True:
        fs.check_ivents()
        fs.update_drop(settings, patrik, screen)
        fs.update_screen(settings, screen, patrik)
        

        pygame.display.flip()

run_game()


Функции игры, где происходят все основные события
Конкретно проблема в функции delete_drops, после удаления ряда капель, я хочу чтобы она появлялась вновь сверху экрана
import sys
import pygame
from patrik import Patrik
import random

def check_ivents():
    """Обрабатывает нажатия клавиш и события мыши."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

def update_screen(settings, screen, patrik):
    """Обновляет изображение на экране и отображает новый экран."""
    screen.fill(settings.bg_color)
    patrik.draw(screen)


def get_number_aliens_x(settings, drop_width):
    """Вычисляет количество пришельцев в ряду."""
    available_space_x = settings.screen_width - (2 * drop_width)
    number_drop = int(available_space_x / (2 * drop_width))
    return number_drop


def get_number_rows(settings, drop_height):
    """Вычисляет количество рядов."""
    available_space_y = settings.screen_height - (2 * drop_height)
    number_rows = int(available_space_y / (2 * drop_height))
    return number_rows


def create_alien(settings, screen, patriks, number_drop, number_rows):
    """Создаёт пришельца и размещает его в ряду"""
    patrik = Patrik(settings, screen)
    patrik_width = patrik.rect.width



    patrik.rect.x = patrik_width + 2 * patrik_width * number_drop
    patrik.rect.y = patrik.rect.height + 2 * patrik.rect.height * number_rows

    patriks.add(patrik)


def create_fleet(settings, screen, patriks):
    """Создаёт флот пришельцев"""
    patrik = Patrik(settings, screen)
    number_drop = get_number_aliens_x(settings, patrik.rect.width)
    number_rows = get_number_rows(settings, patrik.rect.height)

    for row_number in range(number_rows):
        for patrik_number in range(number_drop):
            #Создание патрика и размещение его в ряду.
            create_alien(settings, screen, patriks, patrik_number, row_number)

def check_fleet_edges(settings, patriks, screen):
    """Регирует на достижение краёв экрана"""
    for patrik in patriks.sprites():
        if patrik.check_edges():
            delete_drops(settings, patriks, screen)


def delete_drops(settings, patriks, screen):
    screen_rect = screen.get_rect()
    for patrik in patriks.sprites():
        if patrik.rect.y == 800:
            patrik.rect.y = screen_rect.rect.top




def update_drop(settings, patriks, screen):
    """Проверяет достиг ли капли конца экрана"""
    check_fleet_edges(settings, patriks, screen)
    patriks.update()


класс представляющий капельку
import pygame
from pygame.sprite import Sprite
import random
from settings_stars import Settings


class Patrik(Sprite):
    """Класс представляющий капельку"""

    def __init__(self, settins, screen):
        """Инициализирует капельку и задаёт его начальную позицию"""
        super(Patrik, self).__init__()
        self.screen = screen
        self.settings = settins

        #Загрузка изображение капельки и назначение атрибута rect.
        self.image = pygame.image.load('images/gold_drop.png')
        self.rect = self.image.get_rect()

        #Каждый новая капелька появляется в левом верхнем углу экрана
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height


        #Сохранение точной позиции пришельца
        self.x = float(self.rect.x)
    
    def blitme(self):
        """Выводит пришельца в текущем положении."""
        self.screen.blit(self.image, self.rect)
    
    def check_edges(self):
        """Возвращает True, если капли находятся у края экрана."""
        screen_rect = self.screen.get_rect()
        if self.rect.bottom >= screen_rect.bottom:
            return True
        elif self.rect.left <= 0:
            return True

    def update(self):
        """Перемещает капли вниз"""
        self.rect.y += self.settings.drop_speed_factor


И настройки
class Settings():

    def __init__(self):
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (0, 84, 166)
        self.display_name = ("Stars")

        #скорость капелек
        self.drop_speed_factor = 1


Буду очень благодарен за подсказки и советы! Только учусь искусству программирования
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
Mister_G
@Mister_G Автор вопроса
молодой маслёнок
Додумался максимум до такого решения
flag = False
    for patrik in patriks.sprites():
        if patrik.check_edges():
            patriks.remove(patrik)
            flag = True
    if flag:
        create_fleet(settings, screen, patriks)
        print("Создали капли")

после достижения значения края экрана, флаг становится True, благодаря этому создаётся новый флот из капель
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы