我创造了一个游戏,每当2个精灵碰撞时,得分应该增加1。现在,分数显示为0开始,然后一旦发生碰撞,它增加到39(有时它是27。数字的变化使我认为它以秒为单位递增)。在这里阅读其他一些答案让我意识到这很可能是我所拥有的问题
t = f.render("Score = " + str(score), False, black)
screen.blit(t, (0,0))
位于for循环中。但我已经尝试将它放在别处,然后分数根本不会出现在屏幕上。
这是我的代码中创建分数的部分
class Tub(Sprite):
def __init__(self):
Sprite.__init__(self)
self.image = image.load("tub.bmp").convert_alpha()
self.image = transform.scale(self.image, (100, 100))
self.rect = self.image.get_rect()
self.rect.x = width/2
self.rect.y = height - 100
def movement(self):
keys = pygame.key.get_pressed()
dist = 5
if keys [pygame.K_LEFT]:
self.rect.x -= dist
if keys [pygame.K_RIGHT]:
self.rect.x += dist
def hit(self, target):
return self.rect.colliderect(target)
class Singlescoop_pink(Sprite):
def __init__(self):
Sprite.__init__(self)
self.image = image.load("singlescoop_pink.bmp").convert_alpha()
self.image = transform.scale(self.image, (100, 100))
self.rect = self.image.get_rect()
self.rect.x = random.randint(0, width-100) #random x position, minus 100 so image does not go off screen
self.rect.y = -600 #start off screen so starting point to fall down is not visible
def movement(self):
self.rect.y += 5
if self.rect.y > height:
self.kill()
tub = Tub()
sspink = Singlescoop_pink()
sprites = pygame.sprite.RenderPlain(tub, sspink)
score = 0
def game_loop():
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
sys.exit()
if tub.hit(sspink):
sspink.kill()
global score
score += 1
tub.movement()
sspink.movement()
screen.fill(white)
t = f.render("Score = " + str(score), False, black)
screen.blit(t, (0,0))
sprites.update()
sprites.draw(screen)
display.update()
clock.tick(60)
game_loop()
答案 0 :(得分:2)
首先,请注意您可以将movement
功能重命名为update
,sprites.update()
将调用它们。
您必须了解,当您在kill
上致电Sprite
时,它不会神奇地从您的游戏中删除。它将从其所有精灵组中删除。你打电话给sspink.kill()
,但对象仍在那里,住在sspink
变量。
由于你调用sspink.movement()
,它仍会移动(并在主循环的每次迭代时与你的其他精灵碰撞)。但它不会被绘制到屏幕上,因为您使用精灵组(sprites.draw(screen)
)处理绘图,并且从该组中删除了sspink
。
您应该做的是以下内容:
为下降的块创建一个新的sprite组:
blocks = pygame.sprite.RenderPlain(sspink)
然后,使用pygame的pygame.sprite.spritecollide
函数,而不是调用tub.hit(sspink)
来检查碰撞(事实上,只需删除hit
函数),而不是:{/ p>
global score
score += len(pygame.sprite.spritecollide(tub, blocks, True))
此函数将检查tub
组中blocks
和精灵之间的碰撞,如果发生碰撞则杀死该组中的精灵,然后返回与{{1}碰撞的精灵}。
所以我们只计算碰撞了多少块(目前,它最多只有一个,但让我们能够面向未来)并将这个数字添加到分数中。
由于tub
会杀死精灵,因此spritecollide
组中不再存在,因此仅检查碰撞一次。由于它们也不再属于blocks
组,因此不会更新或绘制到屏幕上。
事实上,如果我们在开始时构建这样的组,你就不再需要sprites
(我们将其抽象出来了):
sspink