В настоящее время выполняю упражнение из книги:
"Изучаем Python Программирование игр визуализация данных веб-приложения." - Эрик Мэтиз
Глава 13
13-3 . Капли: найдите изображение дождевой капли и создайте сетку из капель . Капли должны постепенно опускаться вниз и исчезать у нижнего края экрана .
13-4 . Дождь: измените свой код в упражнении 13-3, чтобы при исчезновении ряда капель у нижнего края экрана новый ряд появлялся у верхнего края и начинал падение .
С первым заданием я справился, все работает.
При выполнении второго дошел до второй части и не знаю, что делать.
Программа запускается и когда капли достигают нижней части экрана выбивает ошибку:
TypeError: create_drop() missing 5 required positional arguments: 'ai_settings', 'screen', 'drops', 'drop_number', and 'row_number'
Если добавлю атрибуты в функцию create_drop() , ошибки продолжаются.
п.с. При падении капель, если убрать вызов функции создания нового ряда они удаляются без проблем.Но мне нужно , чтобы не только удалялись, но и создавался новый ряд. а так же шел вниз за удаляющимся рядом капель.
Всем заранее спасибо за ответы и помощь!
Код программы.
start_rain.py:
import pygame
from pygame.sprite import Group
import game_functions as gf
from settings import Settings
def run_game():
# Инициализирует приложение и создает объект экрана.
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Project Drops")
bg_color = (230, 230, 230)
drops = Group()
gf.create_fleet(ai_settings,screen, drops)
# Запуск основного цикла программы.
while True:
# Отслеживание событий клавиатуры и мыши.
gf.check_events(ai_settings, screen)
gf.update_drops(ai_settings, drops)
#"""Обновляет изображения на экране и отображает новый экран."""
gf.update_screen(ai_settings, screen, drops)
run_game()
settings.py:
class Settings():
#Класс для хранения всех настроек приложения
def __init__(self):
#Инициализирует настройки приложения
# Параметры экрана
self.screen_width = 800
self.screen_height = 600
self.bg_color = (230, 230, 230)
self.drop_speed_factor = 1
game_functions.py:
import sys
import pygame
from drop import Drop
def get_number_rows(ai_settings, drop_height):
#Определяет количество рядов, помещающихся на экране.
available_space_y = (ai_settings.screen_height - (3 * drop_height))
number_rows = int(available_space_y / (2 * drop_height))
return number_rows
def get_number_drops_x(ai_settings, drop_width):
#Вычисляет количество капель в ряду.
available_space_x = ai_settings.screen_width - 2 * drop_width
number_drops_x = int(available_space_x / (2 * drop_width))
return number_drops_x
def create_drop(ai_settings, screen, drops, drop_number,row_number):
#Создает каплю и размещает ее в ряду."""
drop = Drop(ai_settings, screen)
drop_width = drop.rect.width
drop.x = drop_width + 2 * drop_width * drop_number
drop.rect.x = drop.x
drop.rect.y = drop.rect.height + 2 * drop.rect.height * row_number
drop.y = drop.rect.height + 2 * drop.rect.height * row_number
drop.rect.y = drop.y
drops.add(drop)
def create_fleet(ai_settings, screen, drops):
#Создает ряд капель
drop = Drop(ai_settings, screen)
number_drops_x = get_number_drops_x(ai_settings, drop.rect.width)
number_rows = get_number_rows(ai_settings,drop.rect.height)
for row_number in range(number_rows):
for drop_number in range(number_drops_x):
create_drop(ai_settings, screen, drops, drop_number,
row_number)
def check_keydown_events(event):
#Реагирует на нажатие клавиш."""
if event.key == pygame.K_q:
sys.exit()
def check_events(ai_settings, screen):
#Обрабатывает нажатия клавиш
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen)
def update_screen(ai_settings, screen,drops):
# Обновляет изображения на экране и отображает новый экран.
# При каждом проходе цикла перерисовывается экран.
screen.fill(ai_settings.bg_color)
drops.draw(screen)
# Отображение последнего прорисованного экрана.
pygame.display.flip()
def check_fleet_edges(ai_settings,drops):
#Реагирует на достижение капли края экрана."""
flag = False
for drop in drops.sprites():
if drop.check_edges():
drop.remove(drops)
flag = True
if flag:
create_drop()
print("new drop create")
def update_drops(ai_settings,drops):
#Обновляет позиции всех капель в ряду.
check_fleet_edges(ai_settings,drops)
drops.update()
drop.py:
import pygame
from pygame.sprite import Sprite
class Drop(Sprite):
#Класс, представляющий одну каплю.
def __init__(self, ai_settings, screen):
#Инициализирует каплю и задает ее начальную позицию.
super().__init__()
self.screen = screen
self.ai_settings = ai_settings
# Загрузка изображения капли и назначение атрибута rect.
self.image = pygame.image.load('/Users/имяфамиля/Desktop/drop_Project/image/drop.bmp')
self.rect = self.image.get_rect()
# Каждый новая капля появляется в левом верхнем углу экрана.
self.rect.x = self.rect.width
self.rect.y = self.rect.height
# Сохранение точной позиции капли.
self.y = float(self.rect.y)
self.x = float(self.rect.x)
def update(self):
#Перемещает капли вниз."""
self.y += self.ai_settings.drop_speed_factor
self.rect.y = self.y
def check_edges(self):
#"""Возвращает True, если капли находятся внизу экрана."""
screen_rect = self.screen.get_rect()
if self.rect.bottom >= screen_rect.bottom:
return True
размер изображения 30 на 30
Жду ваших ответов!