Seite 1 von 1

verständniss problem liste Leeren

Verfasst: Dienstag 13. Mai 2008, 17:36
von sea-live
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]

Verfasst: Dienstag 13. Mai 2008, 17:43
von sea-live
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))

Re: verständniss problem liste Leeren

Verfasst: Dienstag 13. Mai 2008, 17:43
von keppla
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.

Verfasst: Dienstag 13. Mai 2008, 18:14
von sea-live
DANKE DAS WARS

der unterschied war mir nicht klargeworden!

Verfasst: Dienstag 13. Mai 2008, 18:19
von EyDu
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"]]

Verfasst: Dienstag 13. Mai 2008, 19:19
von Hyperion
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 ;-)

Verfasst: Dienstag 13. Mai 2008, 19:23
von EyDu
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.

Verfasst: Mittwoch 14. Mai 2008, 17:28
von sea-live
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