Pygame 屏幕不会闪烁
Pygame screen won't blit
我有一个类似 Agar.io 的测试游戏,其中方形玩家触摸 "bit"s 并成长。问题是位生成。比特每秒产生一次,并有自己的表面。但是,该程序不会将位(没有双关语意)写入初始表面。
代码如下:
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()
P.S。没有错误信息。
提前致谢。
要让每个 Bit
对象有不同的位置和实例变量,您需要在位 class 中有一个 __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.image
和 self.rect
每次都将它们绘制在正确的位置,而无需您担心。当 Bit
被吃掉后,您可以从群组中删除 Bit
,现在它已为您删除。
随机附注:我建议您将事件循环更改为在 event.type == pygame.QUIT
时中断。这样一来,Python 就不需要在每一帧都检查 if d == True
语句,同时使代码的可读性稍微好一些。如果它只是跳出 for 循环(对我来说它退出得很好),你可以在导入 sys
后使用 sys.exit()
我有一个类似 Agar.io 的测试游戏,其中方形玩家触摸 "bit"s 并成长。问题是位生成。比特每秒产生一次,并有自己的表面。但是,该程序不会将位(没有双关语意)写入初始表面。
代码如下:
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()
P.S。没有错误信息。
提前致谢。
要让每个 Bit
对象有不同的位置和实例变量,您需要在位 class 中有一个 __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.image
和 self.rect
每次都将它们绘制在正确的位置,而无需您担心。当 Bit
被吃掉后,您可以从群组中删除 Bit
,现在它已为您删除。
随机附注:我建议您将事件循环更改为在 event.type == pygame.QUIT
时中断。这样一来,Python 就不需要在每一帧都检查 if d == True
语句,同时使代码的可读性稍微好一些。如果它只是跳出 for 循环(对我来说它退出得很好),你可以在导入 sys
sys.exit()