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!
'int' object has no attribute
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)
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)
- __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
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?__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.
Das ist Kraut und Rüben.
Die Klasse Bullet ist so definiert:
und dann wird eine Instanz so erzeugt:
Die Klasse Bullet ist so definiert:
Code: Alles auswählen
class Bullet:
def __init__(self, x, y, game):
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Was ist aber daran falsch?ThomasL hat geschrieben: Sonntag 27. Juni 2021, 20:01 Das ist Kraut und Rüben.
Die Klasse Bullet ist so definiert:und dann wird eine Instanz so erzeugt:Code: Alles auswählen
class Bullet: def __init__(self, x, y, game):
Code: Alles auswählen
Bullet(self.game, self.x, self.y)
Die Reihenfolge ist falsch.
Die __init__() - Methode erwartet die Eingangsparameter in dieser Reihenfolge: x, y, game
In der Klassen - Instanzierung übergibst du sie aber in dieser Reihenfolge: 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:
zu diesem Fehler:
Die __init__() - Methode erwartet die Eingangsparameter in dieser Reihenfolge: x, y, game
Code: Alles auswählen
class Bullet:
def __init__(self, x, y, game):
Code: Alles auswählen
Bullet(self.game, self.x, self.y)
Das führt in dieser Zeile:
Code: Alles auswählen
self.game.screen.blit(self.bullet_img, (self.x, self.y))
AttributeError: 'int' object has no attribute 'screen'
rogerb hat geschrieben: Sonntag 27. Juni 2021, 20:44 Die Reihenfolge ist falsch.
Die __init__() - Methode erwartet die Eingangsparameter in dieser Reihenfolge: x, y, gameIn der Klassen - Instanzierung übergibst du sie aber in dieser Reihenfolge: self.game, self.x, self.yCode: Alles auswählen
class Bullet: def __init__(self, x, y, game):
Die Instanzvariable 'self.game' erhält dann fälschlicherweise den Integerwert von self.yCode: Alles auswählen
Bullet(self.game, self.x, self.y)
Das führt in dieser Zeile:zu diesem Fehler:Code: Alles auswählen
self.game.screen.blit(self.bullet_img, (self.x, self.y))
AttributeError: 'int' object has no attribute 'screen'
Endlich funktioniert es. Danke euch vielmals!!