Klasse schreibt man mit großem Anfangsbuchstaben.
Für Timer benutzt man kein datetime, sondern time.time() (ab Python3 time.monotonic).
`json.load` lädt direkt aus einer geöffneten Datei, das `my` in `myfile` ist unsinnig, weil es kein ourfile gibt.
Pfade setzt man nicht per + zusammen, os.getcwd zu benutzen ist unsinn, weil Pfade automatisch relativ zum aktuellen Verzeichnis sind.
Wie schon oben geschrieben iteriert man nicht über einen Index. Der Name `images` für einen Index ist sehr verwirrend.
`width` und `height` sind hoffentich schon ints.
Ein Attribut innerhalb einer for-Schleife zu setzten ist selten sinnvoll, und ein Zeichen dafür, dass irgendwas nicht stimmt, denn nur die letzte Zuweisung bleibt erhalten. Wie ist das mit sprite_w und sprite_h?
`screen_x` und `screen_y` werden immer nur zusammen benutzt. Warum nicht gleich ein Tuple?
Ein `x in range(...)` ist seltsam, man vergleich normalerweise mit <.
Code: Alles auswählen
#
# sprites einlesen.
# wichtig ist es hier den richtigen Pfad zu bauen damit die Dateien fuer
# die Grafiken und so weiter gefunden werden ( fuer Android ).
#
class Sprites(object):
def __init__(self, jsonfile, spritefile):
self.screen_xy = (0, 0) # x/y Position vom Sprite auf dem Bildschirm
self.anicounter = 0 # Zaehler der Animation
self.timer_range = 60 # Zeit des Timers bis die Animation gestartet wird
self.timer_stop = time.time() + randrange(self.timer_range))
self.sprite_w = 0 # Breite des aktuellen Sprites
self.sprite_h = 0 # Hoehe des aktuellen Sprites
self.audio_click = music('/gfx/audio/sfx/click_1.wav')
with open(jsonfile, 'rb') as file:
images = json.loads(file)
# print ("Sprites: " + str((len(obj))))
sprites_sheet = pygame.image.load(spritefile).convert()
self.sprites = [] # komplette Animation
for image in images:
# einzelne, leere Sprites erstellen in der Groesse der Sprites im .json File
sprite = pygame.Surface((image['width'], image['height']))
# die leeren Sprites, aus dem Spritesheet fuellen
sprite.blit(sprites_sheet, (0, 0), (image['x'], image['y'], image['width'], image['height']))
sprite.set_colorkey((0, 0, 0))
self.sprites.append(sprite)
# komisch:
self.sprite_w = image['width']
self.sprite_h = image['height']
#
# die Logik der Sprites starten ( Animation usw. )
#
def do_logic(self, screen):
screen.blit(self.sprites[self.anicounter], self.screen_xy)
self.rotate()
#
# Die Animation einmal abspielen und Timer wieder auf
# Zufall stellen
#
def rotate(self):
if time.time() > self.timer_stop:
self.anicounter += 1
if self.anicounter >= len(self.sprites):
self.anicounter = 0
self.timer_stop = time.time() + randrange(self.timer_range)
def get_size(self):
return self.sprite_w, self.sprite_h
#
# fuer neu berechnete Sprites werden die Koordinaten dann hier wieder gesetzt
#
def set_xy(self, x, y):
self.screen_x = (x, y)
self.screen_y = y
def get_xy(self):
return self.screen_xy
#
# wurde ein Sprite angeclickt? Wird ueber die Mausposition berechnet und True
# oder False zurueckgeben. Wenn Sprite angeclickt dann True an sonsten False
#
def checkclick(self):
screen_x, screen_y = self.screen_xy
sprite_w, sprite_h = self.get_size()
mouse_x, mouse_y = pygame.mouse.get_pos()
if screen_x <= mouse_x < screen_x + sprite_w:
if screen_y <= mouse_y < screen_y + sprite_h:
self.audio_click.do_logic(0)
return True
return False
Der Code hat jetzt aber auch nichts mit Deinem ursprünglichen Problem zu tun?