Pygame 屏幕不会闪烁

Posted

技术标签:

【中文标题】Pygame 屏幕不会闪烁【英文标题】:Pygame screen won't blit 【发布时间】:2016-03-04 18:53:37 【问题描述】:

我有一个类似 Agar.io 的测试游戏,其中方形玩家触摸“位”并成长。问题是位生成。该位每秒生成一次,并有自己的表面。但是,该程序不会将位(没有双关语)插入初始表面。

代码如下:

import pygame
import random
pygame.init()
clock = pygame.time.Clock()
display = pygame.display
screen = display.set_mode([640,480])
rect_x = 295
rect_y = 215
display.set_caption("Agar")
d = False
bits = []
size = 50
steps = 0
class Bit:
    cscreen = display.set_mode([640,480])
    circ = pygame.draw.circle(cscreen, (65, 76, 150), (random.randrange(40, 600), random.randrange(40, 440)), 5)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            d = True
    if d == True:
        break

    # Fill background
    screen.fill((5, 58, 0))

    # Create player object
    player = pygame.draw.rect(screen, (250, 197, 255), [rect_x, rect_y, size, size])

    # Moving
    if pygame.key.get_pressed()[pygame.K_UP]:
        rect_y -= 2
    if pygame.key.get_pressed()[pygame.K_DOWN]:
        rect_y += 2
    if pygame.key.get_pressed()[pygame.K_RIGHT]:
        rect_x += 2
    if pygame.key.get_pressed()[pygame.K_LEFT]:
        rect_x -= 2

    # Bit generation
    if steps == 60:
        new_bit = Bit()
        bits.append(new_bit.circ)
        screen.blit(new_bit.cscreen, (0,0))
        steps = 0
    steps += 1

    # Collision detection
    collision = player.collidelist(bits)
    if collision != -1:
        bits[collision].cscreen.fill((0,0,0,0))
        # Make player larger
        size += 10

    # FPS limit
    clock.tick(60)

    # Refresh
    display.flip()

附:没有错误信息。

提前致谢。

【问题讨论】:

你在任何地方打电话给display.update()吗? 我正在调用 display.flip(),够了吗?还是我必须这样做? 【参考方案1】:

要让每个Bit 对象具有不同的位置和实例变量,您需要在位类中有一个__init__ 方法。通过添加__init__ 并将self. 添加到变量中,blitting 起作用了。

不过是一句警告。当您为每个对象创建一个单独的cscreen,然后将该cscreen 传送到您的实际屏幕时,您将摆脱所有其他已被传送的cscreen,一次只能看到1 个Bit。即使您在__init__ 之外有cscreen,现在擦除旧的也会有问题,所以我建议您采取不同的方法。

我的建议是找一个点的小图,在Bit__init__方法中写下这些线条。

self.image = pygame.image.load("reddot.png")
self.rect = self.image.get_rect()

一旦您创建了您的位,请将其添加到 pygame.sprite.Group()。这些组有非常方便的内置方法。其中之一是.draw()。它将通过您的Bits 组,并使用每个组的self.imageself.rect 每次都将它们绘制在正确的位置,而您不必担心。当Bit 被吃掉时,您可以将Bit 从群组中删除,现在它会为您删除。

随机附注:我建议您将事件循环更改为在event.type == pygame.QUIT 时中断。这样一来,Python 就不需要在每一帧上检查if d == True 语句,同时使代码更具可读性。如果它只是跳出 for 循环(对我来说它很好退出),你可以在导入 sys 后使用 sys.exit()

【讨论】:

谢谢,帮了大忙。 呃,还是不行。我已经制作了 Bits 精灵和组。这是代码:gist 将 bits.draw 更改为 bits.draw(screen) .. 之后,我得到了显示给我的图像。如果不确定如何正确使用这些功能,请查看 pygame.org/docs。我看了你的代码,大部分看起来都不错。关于碰撞,如果你有一个包含所有位的 pygame 组,并且想检查你的玩家是否与其中任何一个发生碰撞,我建议使用 pygame.sprite.spritecollideany(sprite, group)。如果您还有其他问题,请告诉我:D 另外,随机发生器不能正常工作。所有位都出现在同一个位置。这是为什么呢? 在你的 Bit 的 init 类中,添加这一行: self.rect = self.rect.move(randrange(40, 600), randrange(40, 600)) 后进行更改时,您永远不会像在发布的问题中那样随机移动事物。默认情况下,图像矩形位于左上角。这将为您移动它们

以上是关于Pygame 屏幕不会闪烁的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PyGame 动画闪烁

iOS - 来自后台时上一个屏幕闪烁

如何消除java动画闪烁

启用 DEPTH_TEST 时 OpenGL 屏幕闪烁

如何立即显示密码活动,而现有活动不会在后台闪烁几秒钟?

升级win10后屏幕闪烁怎么办?