Pygame Sprites bug?

时间:2016-06-21 22:29:29

标签: python pygame

HeyGuys!我刚刚加入了这个网站,所以我可以轻松地了解这个问题。

所以,我最近开始玩PyGames并使用pygame.sprite.Sprite模块进行了一些测试。这是我的代码:

#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)

正如您可以推断的那样,我打算创建this,而是获取 this这两个都是错的。奇怪的是,每次运行文件时,#1和#2都是异想天开地绘制而没有模式,所以我想知道它是否与我在运行时循环更新屏幕的方式有关。

有关我如何解决这个问题的任何想法?在此先感谢,我希望更频繁地使用这个网站!

1 个答案:

答案 0 :(得分:0)

致电时

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

将Sprite的矩形设置为图像的矩形。但是,该矩形的位置为(0,0)。这意味着绿色矩形和块都在(0,0)处绘制。

精灵组不一定保留精灵的顺序,这可以解释为什么你看到#1(最后绘制block_d)或#2(最后绘制block_a)的行为。

反转你的图像加载和位置设置代码,你应该好好去。

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)

如果您需要一个Sprite组来保留添加Sprite的顺序,您可以使用pygame.sprite.OrderedUpdates