Seite 1 von 1

'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 16:54
von norgsmen
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!

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 16:57
von __deets__
Bitte den gesamten Code zeigen, anhand dieser zwei Zeilen kann niemand erkennen, woher self.game kommt.

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 17:33
von norgsmen
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)

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 17:52
von __blackjack__
@norgsmen: Schau Dir mal an was `Bullet.__init__()` in welcher Reihenfolge erwartet und was Du stattdessen übergibst.

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 19:33
von norgsmen
__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?

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 20:01
von ThomasL
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)

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 20:16
von norgsmen
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?

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 20:44
von rogerb
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'

Re: 'int' object has no attribute

Verfasst: Sonntag 27. Juni 2021, 20:46
von norgsmen
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!!