Kłopot z przekazaniem atrybutu do metody

0

Cześć, ćwiczę sobie Pythona i napotkałem po raz pierwszy na ścianę i nie mam pojęcia co jest nie tak. Problem polega na błędzie File "C:\Users\PycharmProjects\13.1 stars\game_functions.py", line 14, in create_many_ships available_space_x = settings.screen_width - 2 * ship_width AttributeError: 'pygame.Surface' object has no attribute 'screen_width'''

i generalnie chyba rozumiem ten błąd, ale według mnie ten atrybut powinien zostać przekazany. Wklejam 3 części zależnego od siebie krótkiego kodu. Proszę uświadomcie mnie gdzie jest błąd. Zapamiętam to do końca życia bo przeanalizowałem po swojemu całość 4 razy i nie rozumiem.. Wiem, że proszę o dużo bo analizowanie mojego shitcode'u to żadna frajda, ale serio nie rozumiem gdzie jest błąd i trochę to frustrujące.

Główny plik w którym "gra" jest uruchamiana.

import pygame
import sys
from settings import Settings
import game_functions as gf
from pygame.sprite import Group


def start_game():
    pygame.init()
    settings = Settings()
    screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
    pygame.display.set_caption("meh")
    ships = Group()
    gf.create_many_ships(screen, screen, ships)
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
                
        gf.update_screen(settings, screen, ships)


start_game()

Teraz czas na klasę statki które chce wyświetlić na całym ekranie celem ćwiczenia pythona.

import pygame
from pygame.sprite import Sprite


class Ship(Sprite):
    """Klasa tworząca statek"""
    def __init__(self,settings, screen):
        """inicjalizacja i wczytanie statku"""
        super(Ship,self)

        self.screen = screen
        self.settings = settings

        self.image = pygame.image.load('ships/ship.bmp')
        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):
        """wyświetallnie statku"""
        self.screen.blit(self.image, self.rect)

I funkcje gry w tym funkcja która generuje błąd.

import pygame
from ships import Ship


def update_screen(settings, screen, ships):
    ships.draw(screen)
    screen.fill(settings.bg_color)
    pygame.display.flip()


def create_many_ships(settings, screen, ships):
    ship = Ship(settings, screen)
    ship_width = ship.rect.width
    available_space_x = settings.screen_width - 2 * ship_width
    number_ships_x = int(available_space_x / (2 * ship_width))
    ships.draw(screen)
    for ship_number in range(number_ships_x):
        ship = Ship(settings, screen)
        ship.x = ship_width + 2 * ship_width * ship_number
        ship.rect.x = ship.x
        ships.add(ship)

i ostatnia klasa settings w której są podstawowe informacje przechowywane :

class Settings():

    def __init__(self):
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = 230, 230, 230

1

Przekazujesz tutaj " gf.create_many_ships(screen, screen, ships)" dwa razy screen, a nie przekazujesz settings.

0

Dziękuje. /suicide. Teraz to jest mi ładnie głupio. Wszystkiemu się przyglądałem kilka razy poza samym wywołaniem które było kluczowe w tym przypadku.

Sorki panowie za zawracanie d**y pierdołami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1