0

我目前正在开发一个平台游戏,它依赖于对象(以平台的形式)作为它们的碰撞,以防止玩家退出窗口。这是我与平台/块碰撞的代码:

#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

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

4

1 回答 1

0

如果您只想将播放器限制为边界矩形,我建议使用pygame.Rect.clamp_ip

将矩形移到另一个内部,就位

分别定义边界矩形。如果播放器被限制在屏幕上,您可以使用和获得一个定义显示Surface边框的矩形:pygame.display.get_surface()pygame.Surface.get_rect

border_rect = pygame.display.get_surface().get_rect()

通过以下方式夹住播放pygame.Rectborder_rect

self.rect.clamp_ip(border_rect)

您可以使用 1 行代码执行此操作:

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()
于 2021-09-14T16:25:36.797 回答