Pygame的屏幕不会变色

乌兰索伊

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

PS没有错误消息。

提前致谢。

戴维·杰伊·布雷迪

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

但是有一点警告。cscreen为每个对象创建一个单独的对象,然后将其蒙版cscreen到实际屏幕时,您将摆脱其他所有cscreen被蒙版的问题,一次只能Bit看到一个。即使您cscreen不在__init__,您现在也遇到了擦除较旧版本的问题,因此我建议您采用其他方法。

我的建议是找到一个小点的图片,然后在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.exit()在导入后使用sys

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章