python - Pygame 屏幕不会闪烁

标签 python pygame blit

我有一个类似 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()

附注没有错误消息。

提前致谢。

最佳答案

要使每个 Bit 对象具有不同的位置和实例变量,您需要在位类中具有 __init__ 方法。通过添加 __init__ 并将 self. 添加到变量中,位图传输就可以工作。

但有一句警告。当您为每个对象创建一个单独的cscreen,然后将该cscreen传输到您的实际屏幕时,您就摆脱了所有其他cscreen blitted,一次只能查看 1 位。即使您在 __init__ 之外使用了 cscreen,现在删除旧屏幕也会遇到问题,所以我建议您采取不同的方法。

我的建议是找到一个点的小图片,并将这些行写入 Bit__init__ 方法中。

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

创建位后,将其添加到 pygame.sprite.Group() 中。这些组有非常方便的内置方法。其中之一是 .draw()。它将遍历您的组并使用每个位的self.imageself.rect每次将它们绘制在正确的位置,而无需你必须担心它。当Bit被吃掉时,您可以从组中删除Bit,现在它会被删除。

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

后使用 sys.exit()

关于python - Pygame 屏幕不会闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35803888/

相关文章:

python - 图像不响应不同的按键 Pygame Python

python - 软件设计与开发专业 : Pygame Smudge Trails

c++ - 将一个表面传送到另一个表面(SDL2、C++、VS2015)

python - Pygame 中的撤消步骤

python - 如何使这个 pygame Sprite 的旋转(以中心为中心)工作?

python - 如何使用pygame使圆形物体跳跃?

python - Django - 按相关字段对列表进行排序

python - 创建一个仅提取包含特定单词的行的新数据框

python - 将列表项追加到列表列表中

python - TortoiseHG 图标丢失(Ubuntu Linux 16)