El personaje de PyGame se apaga

Estoy tratando de hacer un juego con pygame, pero no puedo averiguar cómo evitar que mi personaje salga de la pantalla (establecer un límite). Tengo una imagen .png controlada por la entrada del usuario, pero es posible que el personaje salga del área visible de la pantalla normalmente. No puedo averiguar cómo hacer esto. Hice un rectángulo alrededor de la ventana, ( pygame.draw.rect ) pero no puedo asignar el rect a una variable para que pueda crear una colisión. También probé esto:

 if not character.get_rect() in screen.get_rect(): print("error") 

Pero no funcionó, solo envió spam a la consola de Python con mensajes de “error”.

(Revisé la otra publicación con esta pregunta pero nada funcionó / ​​no lo entendí)

Entonces, mi pregunta es, ¿cómo puedo evitar que mi personaje salga de la pantalla y cuál es la mejor manera de hacerlo?

~ gracias

EDITAR: Mi juego no tiene un campo de juego / cámara de desplazamiento. (solo una vista fija en toda la ventana)

 if not character.get_rect() in screen.get_rect(): print("error") 

Veo lo que estás intentando aquí. Si desea verificar si un Rect está dentro de otro, use contains() :

contiene ()
prueba si un rectángulo está dentro de otro
contains(Rect) -> bool
Devuelve verdadero cuando el argumento está completamente dentro de la Recta.

Si simplemente desea detener el movimiento en los bordes de la pantalla, una solución fácil es usar clamp_ip() :

clamp_ip ()
Mueve el rectángulo dentro de otro, en su lugar.
clamp_ip(Rect) -> None
Igual que el Rect.clamp () [Devuelve un nuevo rectángulo que se mueve para que esté completamente dentro del argumento Rect. Si el rectángulo es demasiado grande para caber dentro, está centrado dentro del argumento Rect, pero su tamaño no se modifica.] Método, pero opera en su lugar.

Aquí hay un ejemplo simple donde no puedes mover el rectángulo negro fuera de la pantalla:

 import pygame pygame.init() screen=pygame.display.set_mode((400, 400)) screen_rect=screen.get_rect() player=pygame.Rect(180, 180, 20, 20) run=True while run: for e in pygame.event.get(): if e.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() if keys[pygame.K_w]: player.move_ip(0, -1) if keys[pygame.K_a]: player.move_ip(-1, 0) if keys[pygame.K_s]: player.move_ip(0, 1) if keys[pygame.K_d]: player.move_ip(1, 0) player.clamp_ip(screen_rect) # ensure player is inside screen screen.fill((255,255,255)) pygame.draw.rect(screen, (0,0,0), player) pygame.display.flip() 

Cuando usó pygame.draw.rect , en realidad no creó un límite “físico”, simplemente estableció el color de los píxeles en la pantalla en una forma rectangular.

Si conoce el tamaño de la pantalla y el desplazamiento de todos los objetos en la pantalla (solo se aplica si su juego tiene un campo de juego o una cámara), entonces puede hacer algo como esto:

 # In the lines of code where you have the player move around # I assume you might be doing something like this if keys[pygame.K_RIGHT]: player.move(player.getSpeed(),0) # giving the x and y displacements if keys[pygame.K_LEFT]: player.move(-player.getSpeed(),0) 

 class Player: ... def move(self, dx, dy): newX = self.x + dx newY = self.y + dy self.x = max(0, min(newX, SCREEN_WIDTH)) # you handle where to store screen width self.y = max(0, min(newY, SCREEN_HEIGHT)) 

Tenga en cuenta que una herramienta útil para obtener el tamaño de la ventana de Pygame es pygame.display.get_surface().get_size() que le dará una tupla del ancho y la altura. Sin embargo, aún es mejor evitar llamar esto cada vez que necesite conocer los límites del jugador. Es decir, debe almacenar el ancho y el alto de la ventana para su posterior recuperación.

Aquí hay un código de control simple que uso en mis juegos para evitar que los sprites salgan de la pantalla:

 # Control so Player doesn't go off screen 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 

ANCHO y ALTURA son constantes que define para establecer el tamaño de su pantalla. Espero que esto ayude.