Python Pygame屏幕获胜';t blit

Python Pygame屏幕获胜';t blit,python,pygame,blit,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 = 21

我有一个类似于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类中有一个
\uuuuu init\uuuu
方法。通过添加一个
\uuuu init\uuuu
,并将
self.
添加到变量中,blitting工作

但我要提醒你一句。当您为每个对象创建一个单独的
cscreen
,然后将该
cscreen
blit到您的实际屏幕时,您就可以去掉所有被blit的
cscreen
,一次只能查看1位
。即使您有
cscreen
\uuuuu init\uuuuu
之外,现在删除旧的也会有问题,因此我建议您采取不同的方法

我的建议是找到一个点的小图片,并在
位的
\uuuu init\uuuu
方法中写入这些行

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


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

之后,您可以使用
sys.exit()
,您是否在任何地方调用
display.update()
?我正在调用display.flip(),这就足够了吗?还是我必须这么做?谢谢,这帮了大忙。嗯,还是不行。我已经制作了小精灵和小组。下面是代码:将bit.draw更改为bit.draw(屏幕)。。在做了这些之后,我得到了这个形象。如果不确定如何正确使用这些功能,请查看pygame.org/docs。我看过你的代码,大部分看起来都不错。关于碰撞,如果您有一个包含所有位的pygame组,并且想要检查您的玩家是否与其中任何位发生碰撞,我建议使用pygame.sprite.spriteCollizeAny(sprite,Group)。如果您有更多问题,请告诉我:DAlso,随机化器工作不正常。所有位都出现在同一点上。为什么会这样?在Bit的init类中,添加以下行:self.rect=self.rect.move(randrange(40600),randrange(40600)),在进行更改后,您不会像在发布的问题中那样,在另一行中随机移动东西。默认情况下,图像矩形位于左上角。这将为您移动它们