'int' object has no attribute

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

Hallo Leute,

ich bin gerade dabei ein Spiel anhand eines Tutorials nachzubauen. Leider hat sich nun aber ab einer gewissen Stelle ein Fehler eingeschlichen.

Ich habe die Schritte fast alle eins zu eins aus dem Tutorial übernommen und bin deshalb echt Ratlos.. Bitte um Hilfe:D

Fehlermeldung:

self.game.screen.blit(self.bullet_img, (self.x,self.y))
AttributeError: 'int' object has no attribute 'screen'




Danke für die Hilfe!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den gesamten Code zeigen, anhand dieser zwei Zeilen kann niemand erkennen, woher self.game kommt.
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

Hier der gesamte Code:


import pygame

class Game:
def __init__(self, width, height):
pygame.init()
self.width = width
self.height = height
self.screen = pygame.display.set_mode((self.width,self.height))
pygame.display.set_caption("intiwaisor")
self.clock = pygame.time.Clock()
self.running = True
self.spaceshipe = Spaceshipe(self,370,515)
self.background_img = pygame.image.load("spr_space_himmel.png")



while self.running:
self.clock.tick(60)
#self.screen.fill((200, 22, 120))
self.screen.blit(self.background_img, (0,0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False


if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self.spaceshipe.move(-10)
if event.key == pygame.K_RIGHT:
self.spaceshipe.move(10)
if event.key == pygame.K_SPACE:
self.spaceshipe.fire_bullet()

if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
self.spaceshipe.move(10)
if event.key == pygame.K_RIGHT:
self.spaceshipe.move(-10)

self.spaceshipe.update()
if len(self.spaceshipe.bullets) > 0:
for bullet in self.spaceshipe.bullets:
if bullet.is_fired == True:
bullet.update()

pygame.display.update()



class Spaceshipe:
def __init__(self,game,x,y):
self.x = x
self.y = y
self.change_x = 0
self.game = game
self.raumschiff_img = pygame.image.load("spr_spaceship.png")
self.bullets = []

def fire_bullet(self):
self.bullets.append(Bullet(self.game,self.x,self.y))
self.bullets[len(self.bullets) -1].fire()


def move(self, speed):
self.change_x += speed

def update(self):
self.x += self.change_x
if self.x < 0:
self.x = 0
elif self.x > 736:
self.x = 736
self.game.screen.blit(self.raumschiff_img ,(self.x,self.y))

class Bullet:
def __init__(self, x,y, game):
self.x = x
self.y = y
self.game = game
self.is_fired = False
self.bullet_speed = 10
self.bullet_img = pygame.image.load("spr_patrone.png")

def fire(self):
self.is_fired = True

def update(self):
self.game.screen.blit(self.bullet_img, (self.x,self.y))

if __name__ == "__main__":
game = Game(800,600)
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@norgsmen: Schau Dir mal an was `Bullet.__init__()` in welcher Reihenfolge erwartet und was Du stattdessen übergibst.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

__blackjack__ hat geschrieben: Sonntag 27. Juni 2021, 17:52 @norgsmen: Schau Dir mal an was `Bullet.__init__()` in welcher Reihenfolge erwartet und was Du stattdessen übergibst.
Dort wurde doch einmal der Parameter x,y und game übergeben und das habe ich doch dann auch in der Klasse weiter unten angegeben oder nicht?
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Das ist Kraut und Rüben.

Die Klasse Bullet ist so definiert:

Code: Alles auswählen

class Bullet:
    def __init__(self, x, y, game):
und dann wird eine Instanz so erzeugt:

Code: Alles auswählen

Bullet(self.game, self.x, self.y)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

ThomasL hat geschrieben: Sonntag 27. Juni 2021, 20:01 Das ist Kraut und Rüben.

Die Klasse Bullet ist so definiert:

Code: Alles auswählen

class Bullet:
    def __init__(self, x, y, game):
und dann wird eine Instanz so erzeugt:

Code: Alles auswählen

Bullet(self.game, self.x, self.y)
Was ist aber daran falsch?
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Die Reihenfolge ist falsch.
Die __init__() - Methode erwartet die Eingangsparameter in dieser Reihenfolge: x, y, game

Code: Alles auswählen

class Bullet:
    def __init__(self, x, y, game):
In der Klassen - Instanzierung übergibst du sie aber in dieser Reihenfolge: self.game, self.x, self.y

Code: Alles auswählen

Bullet(self.game, self.x, self.y)
Die Instanzvariable 'self.game' erhält dann fälschlicherweise den Integerwert von self.y

Das führt in dieser Zeile:

Code: Alles auswählen

self.game.screen.blit(self.bullet_img, (self.x, self.y))
zu diesem Fehler:
AttributeError: 'int' object has no attribute 'screen'
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

rogerb hat geschrieben: Sonntag 27. Juni 2021, 20:44 Die Reihenfolge ist falsch.
Die __init__() - Methode erwartet die Eingangsparameter in dieser Reihenfolge: x, y, game

Code: Alles auswählen

class Bullet:
    def __init__(self, x, y, game):
In der Klassen - Instanzierung übergibst du sie aber in dieser Reihenfolge: self.game, self.x, self.y

Code: Alles auswählen

Bullet(self.game, self.x, self.y)
Die Instanzvariable 'self.game' erhält dann fälschlicherweise den Integerwert von self.y

Das führt in dieser Zeile:

Code: Alles auswählen

self.game.screen.blit(self.bullet_img, (self.x, self.y))
zu diesem Fehler:
AttributeError: 'int' object has no attribute 'screen'

Endlich funktioniert es. Danke euch vielmals!!
Antworten