verständniss problem liste Leeren

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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Dienstag 13. Mai 2008, 17:36

Guten tag
beim erzeugen meiner aliens in den verschiedenen LEVEL

wird immer nur das erste image aus images geladen
und die images liste wird länger bei levelwechsel
PROBLEM
wird nicht bei jedem Alien eine eigene IMAGESLISTE erstellt

Code: Alles auswählen

class Alien(pygame.sprite.Sprite):
    speed = -3
    shotprob = 100
    gun = (-6, 16)
    health = 4
    frame = 0
    animcycle = 8
    images = []
    def __init__(self):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.level = LEVEL
        if self.level ==1:
            self.images.append(load_image_alpha('TieA.bmp', -1))
            self.images.append(load_image_alpha('TieB.bmp', -1))
        if self.level == 3:
            self.images.append(load_image_alpha('Trooper_a.bmp', -1))
            self.images.append(load_image_alpha('Trooper_b.bmp', -1))
        if self.level == 5:
            self.images.append(load_image_alpha('Borgc.png', -1))
            self.images.append(load_image_alpha('Borgd.png', -1))
        self.image = self.images[0]
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Dienstag 13. Mai 2008, 17:43

wenn ich das so programmiere dann tut das API was ich möchte

jedoch hat das objekt dann alle bilder geladen

Code: Alles auswählen

class Alien(pygame.sprite.Sprite):
    speed = -3
    shotprob = 100
    gun = (-6, 16)
    health = 4
    frame = 0
    animcycle = 8
    images = []
    def __init__(self):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.level = LEVEL
        self.images.append(load_image_alpha('TieA.bmp', -1))
        self.images.append(load_image_alpha('TieB.bmp', -1))
        self.images.append(load_image_alpha('Trooper_a.bmp', -1))
        self.images.append(load_image_alpha('Trooper_b.bmp', -1))
        self.images.append(load_image_alpha('Borgc.png', -1))
        self.images.append(load_image_alpha('Borgd.png', -1))
        self.image = self.images[0]
        if self.level == 3:self.image = self.images[2]
        if self.level == 5:self.image = self.images[4]
        self.shoot = load_sound('Alien Shot.wav')
        self.die_sound = load_sound('die2.wav')
        self.x = random.randrange(450 - 12)
        self.x += 150
        self.y = random.randrange(480 - 12)
        self.rect = self.image.get_rect(center = (self.x, self.y))
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Dienstag 13. Mai 2008, 17:43

Ohne jetzt aus deiner Erklärung direkt schlau zu werden: bist du dir sicher, dass die Eigenschaften health, frame wirklich Klassen- und nicht Objekteigenschaften sein sollen?
Falls du mit IMAGELISTE alieninstance.images meinst: das ist auch eine klasseneigenschaft, und wird somit von allen Aliens geteilt.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Dienstag 13. Mai 2008, 18:14

DANKE DAS WARS

der unterschied war mir nicht klargeworden!
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 13. Mai 2008, 18:19

Hui, das schreit ja geradezu nach einer LC:

Code: Alles auswählen

self.images = [load_image_alpha(x, -1) for x in ["TieA.bmp", "TieB.bmp", "Trooper_a.bmp", "Trooper_b.bmp", "Borgc.png", "Borgd.png"]]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 13. Mai 2008, 19:19

Wobei man die Liste zuvor als Variable definieren sollte - alleine schon aus Gründen der leichteren Anpassbarkeit (wenn man das sowieso nicht in eine config-Datei auslagern möchte).

Problem dabei ist nun aber noch, dass nur bei einem bestimmten Level etwas geladen werden soll. Ich glaube zwar nicht, dass es in diesem Falle um das Ressourcensparen geht, aber auf Deine Art ginge das nicht so leicht ;-)
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 13. Mai 2008, 19:23

Hyperion hat geschrieben:Wobei man die Liste zuvor als Variable definieren sollte - alleine schon aus Gründen der leichteren Anpassbarkeit (wenn man das sowieso nicht in eine config-Datei auslagern möchte).
Das ist klar, aber in so einem kurzen Beispiel sieht eine Variable überfflüssig aus ;-)
Hyperion hat geschrieben:Ich glaube zwar nicht, dass es in diesem Falle um das Ressourcensparen geht, aber auf Deine Art ginge das nicht so leicht ;-)
Doch, man mache aus der Funktion einfach eine Instanz eines Textureloaders, welcher callable ist (man will seinen Code ja nicht anpassen :D). Der soll sich dann darum kümmern.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Mittwoch 14. Mai 2008, 17:28

ein riesen vorteil bei der variante

mit dem images = []
wenn nur 2 jeweils drinn sind ist die umschaltung des anycycluses

da es nur images[0] bzw [1] gibt

Code: Alles auswählen

        self.rect = self.image.get_rect(center = (self.x, self.y))
        self.frame += 1
        self.image = self.images[self.frame/self.animcycle%2]
der fehler war nur das problem das die images liste eine classenliste und nicht eine objectliste war

deswegen verständnissproblem im ersten post von mir

DANKE für mich ist das problem gelöst
Antworten