微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pygame 在触摸底部时无法阻止图像移出屏幕

如何解决pygame 在触摸底部时无法阻止图像移出屏幕

我正在尝试创建一个窗口,如果精灵试图越过边缘,它就会在该窗口中停止。

这对窗口的所有侧面都有效,除了底部

这是函数

 def barrier(self,width,height):
    if self.rect.right >= width:
        self.rect.right = width
    if self.rect.left <= 0:
        self.rect.left = 0
    if self.rect.bottom >= height:
        self.rect.bottom = height
    if self.rect.top <= 0:
        self.rect.top = 0

完整代码

class Block(pygame.sprite.Sprite):
    def __init__(self,xcor,ycor,height):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((width,height))
        self.image.fill((0,0))
        self.rect = self.image.get_rect(center = (xcor,ycor))
        self.rand = random.randint(1,8)
    def randmovement(self,speed):
        x = random.randint(1,40)
        if x == 40:
            self.rand = random.randint(1,8)
        if self.rand == 1:
            self.rect.y -= speed
        if self.rand == 2:
            self.rect.y += speed
        if self.rand == 3:
            self.rect.x += speed
        if self.rand == 4:
            self.rect.x -= speed
    def barrier(self,wid,hght):
        if self.rect.right >= wid:
            self.rect.right = wid
        if self.rect.left <= 0:
            self.rect.left = 0
        if self.rect.bottom >= hght:
            self.rect.bottom = hght
        if self.rect.top <= 0:
            self.rect.top = 0

pygame.init()

screenwidth = 1920
screenheight = 1080

screen = pygame.display.set_mode((screenwidth,screenheight))
clock = pygame.time.Clock()

blockgroup = pygame.sprite.Group()

for _ in range(20):
    block = Block(screenwidth/2,screenheight/2,40,40)
    blockgroup.add(block)

while True:
    screen.fill((255,255,255))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    for block in blockgroup.sprites():
        block.randmovement(3)
        block.barrier(screenwidth,screenheight)
    
    blockgroup.update()
    blockgroup.draw(screen)
    pygame.display.update()
    clock.tick(60)

我认为这与精灵本身有关。它是 pygame.Surface() 类的一个实例,我只是在它周围放了一个矩形,但我似乎无法理解为什么它只在 pygame 窗口的底部失败。运行时

print(self.rect.bottom)

它返回预期值(屏幕的高度)。 看起来矩形已经移动到正确的位置,但实际图像继续移出屏幕。图像没有透明区域,只是一个黑色矩形。

编辑:我找到了一个解决方案,它与 pygame 窗口的大小有关。我注意到当主窗口变小时,屏障工作正常。当将高度值降低 200 左右时,屏障似乎起作用了。当然,我不想有一个更小的窗口,所以在barrier()函数中,我只是将那里的高度减少了200。

屏幕的高度是1080,所以把高度值设置为900当然会失败。我认为这可能是 pygame 的错误,而不是我的代码中的错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。