为我的精灵设置一个不可见的边界

Setting up an invisible boundary for my sprite

我目前正在开发一款平台游戏,该游戏依靠对象(以平台的形式)进行碰撞,以防止玩家退出 window。 这是我与 platforms/blocks:

冲突的代码
#check for collision
self.in_air = True
for tile in world.tile_list:
    #collison x
    if tile[1].colliderect(self.rect.x + dx,self.rect.y , self.width, self.height):
        dx = 0
    # collision y
    if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height):
        # below ground?
        if self.vel_y < 0:
            dy = tile[1].bottom - self.rect.top
            self.vel_y = 0
        # above ground?
        elif self.vel_y >= 0:
            dy = tile[1].top - self.rect.bottom
            self.vel_y = 0
            self.in_air = False

但是,这看起来不专业,我想添加代码,引入一个不可见的屏障,阻止玩家离开屏幕。 我尝试了不同的方法,但目前不确定,如有任何建议,我们将不胜感激。

如果你只想将播放器限制在一个边界矩形内,我建议使用 pygame.Rect.clamp_ip

moves the rectangle inside another, in place

分别定义边界矩形。如果播放器受限于屏幕,您可以从显示器 Surfacepygame.display.get_surface() and pygame.Surface.get_rect:

中获取定义边框的矩形
border_rect = pygame.display.get_surface().get_rect()

通过border_rect夹住播放器pygame.Rect:

self.rect.clamp_ip(border_rect)

只需一行代码即可完成:

self.rect.clamp_ip(pygame.display.get_surface().get_rect())

最小示例

import pygame

pygame.init()
window = pygame.display.set_mode((200, 200))
clock = pygame.time.Clock()

rect = pygame.Rect(0, 0, 40, 40)
rect.center = window.get_rect().center
speed = 10

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False    

    keys = pygame.key.get_pressed()
    rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * speed
    rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * speed  
    rect.clamp_ip(pygame.display.get_surface().get_rect())    

    window.fill(0)
    pygame.draw.rect(window, (255, 0, 0), rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
exit()