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都是异想天开地绘制而没有模式,所以我想知道它是否与我在运行时循环更新屏幕的方式有关。
有关我如何解决这个问题的任何想法?在此先感谢,我希望更频繁地使用这个网站!
答案 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
。