问题描述
我正在尝试使用pygame制作游戏,我几乎完成了,但是我想使正在绘制在墙上的对象的框不闪烁,这些红色框在整个游戏中都会闪烁,我不希望它们最后,我要在if条件下调用playercollide函数,在这里,每当我创建新的碰撞器时,我每次都必须在if条件中添加该函数,我想要的是collider对象自动调用此函数,而无需我在对撞机对象的每个实例的if语句中调用它。请指导我如何操作。
def redrawGameWindow():
win.blit(bg,(-50,-200))
man.draw(win)
#man.drawhitBox(win)
pygame.display.update()
#mainloop
man = player(200,410,64,64)
run = True
while run:
collider1 = wall(500,400,200,True)
collider2 = wall(200,100,50,False)
collider3 = wall(700,False)
collider4 = wall(900,True)
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
x,y = man.x,man.y
if keys[pygame.K_a] and man.x > man.vel:
x -= man.vel
man.left = True
man.right = False
elif keys[pygame.K_d] and man.x < scrWidth - man.width - man.vel:
x += man.vel
man.right = True
man.left = False
elif keys[pygame.K_w] and man.y > man.vel:
y -= man.vel
man.left = False
man.right = False
elif keys[pygame.K_s] and man.y < scrHeight - man.height - man.vel:
y+= man.vel
man.left = False
man.right = False
else:
man.right = False
man.left = False
man.walkCount = 0
man.hitBox(15,31,17)
player_rect = pygame.Rect(x,y,55)
if collider2.playerCollide(player_rect) == False and collider1.playerCollide(player_rect) == False and collider3.playerCollide(player_rect) == False and collider4.playerCollide(player_rect) == False:
man.x,man.y = x,y
redrawGameWindow()
pygame.quit()
解决方法
此问题是由于多次调用pygame.display.update()
引起的。从类pygame.display.update()
中删除对wall
的调用,并在pygame.display.update()
的末尾只做1个redrawGameWindow
。
但是,必须在绘制框之前绘制背景,否则背景将覆盖框:
def redrawGameWindow():
# win.blit(bg,(-50,-200)) <--- DELETE
man.draw(win)
#man.drawhitbox(win)
pygame.display.update()
run = True
while run:
win.blit(bg,-200)) # <--- ADD
collider1 = wall(500,400,200,True)
collider2 = wall(200,100,50,False)
collider3 = wall(700,False)
collider4 = wall(900,True)
# [...]
redrawGameWindow()
通过创建对撞机列表来简化代码:
colliders = [
wall(500,True),wall(200,False),wall(700,wall(900,True)]
player_rect = pygame.Rect(x,y,55)
if not any(c.playerCollide(player_rect) for c in colliders):
man.x,man.y = x,y