Pygame clamp_ip() 没有将我的矩形保留在屏幕上

Pygame clamp_ip() is not keeping my rectangle on screen

我一直在尝试在 pygame 中制作一个可以根据玩家命令旋转然后根据该角度向前/向后移动的矩形。我一直在尝试使用 clamp_ip() 将这个矩形包含在我的屏幕内,但是,该矩形仍然可以自由移动。这是我的代码。

import pygame
import random
import math


def main():
    pygame.init()
    screen_width = 1000
    screen_height = 500
    screen = pygame.display.set_mode((screen_width, screen_height))
    screen_rect = screen.get_rect()
    clock = pygame.time.Clock()
    white = (255, 255, 255)
    black = (0, 0, 0)
    tank_width = 50
    tank_height = 100
    x1 = 0
    y1 = 0
    angle = 0
    dt = 0
    game = True

    surface = pygame.Surface((tank_width, tank_height))
    surface.set_colorkey((white))
    surface.fill((white))
    rect = surface.get_rect(center=(screen_rect.center))
    tank = pygame.draw.rect(
        surface, pygame.Color(black), (0, 0, tank_width, tank_height)
    )

    while game == True:

        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                game = False

        pressed = pygame.key.get_pressed()
        if pressed[pygame.K_RIGHT]:
            angle -= 1
        if pressed[pygame.K_LEFT]:
            angle += 1
        if pressed[pygame.K_UP]:
            x1 = x1 - (5 * math.sin(angle * (math.pi / 180)))
            y1 = y1 - (5 * math.cos(angle * (math.pi / 180)))
        if pressed[pygame.K_DOWN]:
            x1 = x1 + (5 * math.sin(angle * (math.pi / 180)))
            y1 = y1 + (5 * math.cos(angle * (math.pi / 180)))

        rotated = pygame.transform.rotate(surface, angle)
        rect = rotated.get_rect(center=rect.center)

        rect.clamp_ip(screen_rect)

        screen.fill(pygame.Color(white))
        screen.blit(rotated, (x1, y1))
        pygame.display.update()
        dt = clock.tick(60)


if __name__ == "__main__":
    main()

谢谢

你夹rect,但你画x1y1。使用 x1y1 更新 rect 并使用 rect 绘图:

while game == True:
    # [...]

    rect = surface.get_rect(topleft = (x1, y1))         # <---
    rotated = pygame.transform.rotate(surface, angle)
    rect = rotated.get_rect(center=rect.center)
    rect.clamp_ip(screen_rect)

    screen.fill(pygame.Color(white))
    screen.blit(rotated, rect)                          # <---
    pygame.display.update()