2016-06-21 8 views
0

HeyGuys! Ich bin gerade dieser Seite beigetreten, also gehen Sie ruhig mit mir um, wie ich über diese Frage vorgehe.Pygame Sprites Fehler?

Also habe ich vor kurzem begonnen, mit PyGames herumzuspielen und ein paar Tests mit den pygame.sprite.Sprite-Modulen durchgeführt. Hier ist mein Code:

#Game 

import pygame 

pygame.init() 

screen_width, screen_height = 800, 600 
screen = pygame.display.set_mode((screen_width,screen_height)) 
clock = pygame.time.Clock() 
black = (0,0,0) 
white = (255,255,255) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 

class Block(pygame.sprite.Sprite): 
    def __init__(self, block_color = white, block_width = 64, block_height = 64): 
     super(Block, self).__init__() 
     self.image = pygame.Surface((block_width, block_height)) 
     self.image.fill(block_color) 
     self.rect = self.image.get_rect() 

    def set_position(self, x, y): 
     self.rect.x = x 
     self.rect.y = y 

    def change_color(self, color): 
     self.image.fill(color) 

    def load_image(self, url): 
     self.image = pygame.image.load(url) 
     self.rect = self.image.get_rect() 

block_group = pygame.sprite.Group() 
a_block = Block(green) 
b_block = Block(red) 
c_block = Block(blue) 
d_block = Block() 
a_block.set_position(0,0) 
b_block.set_position(0,64) 
c_block.set_position(64,0) 
d_block.set_position(64,64) 
d_block.load_image("brick.png") 

block_group.add(a_block,b_block,c_block,d_block) 

running = True 
while running: 
    screen.fill(black) 
    block_group.draw(screen) 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      quit() 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       pygame.quit() 
       quit() 
    pygame.display.update() 
    clock.tick(10) 

Wie Sie vielleicht schon entnehmen kann, wollte ich this schaffen, sondern stattdessen this zu bekommen, die beide falsch sind. Das Merkwürdige ist, dass jedes Mal, wenn ich die Datei starte, # 1 und # 2 ohne Muster gezeichnet werden, also frage ich mich, ob es etwas damit zu tun hat, wie ich den Bildschirm in meiner laufenden while-Schleife aktualisiere .

Irgendwelche Gedanken, wie ich das beheben kann? Vielen Dank im Voraus und ich hoffe, diese Seite öfter zu benutzen!

Antwort

0

Wenn Sie

def load_image(self, url): 
    self.image = pygame.image.load(url) 
    self.rect = self.image.get_rect() 

nennen setzen Sie das Rechteck des Sprite auf das Rechteck des Bildes. Dieses Rechteck hat jedoch die Position (0,0). Dies bedeutet, dass sowohl das grüne Rechteck als auch der Block bei (0,0) gezeichnet werden.

Eine Sprite-Gruppe behält nicht unbedingt die Reihenfolge der Sprites bei. Dies erklärt, warum # 1 (block_d zuletzt gezeichnet wird) oder # 2 (block_a wird zuletzt gezeichnet).

Kehren Sie den Bildlade- und Positionseinstellungscode um und Sie sollten gut unterwegs sein.

block_group = pygame.sprite.Group() 
a_block = Block(green) 
b_block = Block(red) 
c_block = Block(blue) 
d_block = Block() 
d_block.load_image("brick.png") 
a_block.set_position(0,0) 
b_block.set_position(0,64) 
c_block.set_position(64,0) 
d_block.set_position(64,64) 

block_group.add(a_block,b_block,c_block,d_block) 

Wenn Sie eine Sprite-Gruppe benötigen, die die Reihenfolge, in der bewahrt die Sprites hinzugefügt wurden, können Sie pygame.sprite.OrderedUpdates verwenden.

+0

Danke für die aufschlussreiche Antwort, jetzt funktioniert mein Code wie ich wollte: ^). – Yourchingoo

+0

Ich bin froh, dass ich helfen und StackOverflow willkommen heißen kann! Wenn dies Ihr Problem löste, könnten Sie diese Antwort als die richtige Antwort mit dem Häkchen akzeptieren, damit andere wissen, dass Ihr Problem gelöst wurde. :) – Isa

+0

gotchyu breh .... – Yourchingoo