python - sprites - Mover un sprite al otro lado cuando un sprite se mueve fuera de la pantalla Pygame
pygame tutorial español pdf (1)
No estoy muy familiarizado con pygame pero creo que este juego (md5: 92f9f508cbe2d015b18376fb083e0064 file: spacegame.zip) tiene la función que estás buscando. Gracias al autor, DR0ID_, por ponerlo a disposición del público en su sitio web
Para implementar la función "envolver" en tu juego de coche, utilicé esta función de "game.py":
def draw(self, surface):
wrap = 0
for s in self.sprites():
r = s.rect
if r.left<0:
r.move_ip(800, 0)
wrap = 1
elif r.right > 800:
r.move_ip(-800, 0)
wrap = 1
if r.top < 0:
r.move_ip(0, 600)
wrap = 1
elif r.bottom > 600:
r.move_ip(0, -600)
wrap = 1
if wrap:
surface_blit(s.image, r)
wrap = 0
Después de algunos ajustes terminé con este ejemplo de trabajo:
import sys, pygame, math
from pygame.locals import *
pygame.init()
# Added HEIGHT and WIDTH as fixed variables
WIDTH = 800
HEIGHT = 600
SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))
car = pygame.transform.scale(pygame.image.load(''Car.png'').convert_alpha(), (64, 64))
pygame.display.set_caption(''Car Game'')
pygame.display.set_icon(car)
FPS = pygame.time.Clock()
carX = 400
carY = 100
angle = 90
speed = 0
while True:
if angle == 360: angle = 0
if angle == -1: angle = 359
SCREEN.fill((0,0,0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
keys = pygame.key.get_pressed()
if keys[K_a] or keys[K_LEFT]:
angle += speed
elif keys[K_d] or keys[K_RIGHT]:
angle -= speed
if keys[K_w] or keys[K_UP]:
speed += 1
elif keys[K_s] or keys[K_DOWN]:
speed -= 0.5
carX += speed*math.cos(math.radians(angle))
carY -= speed*math.sin(math.radians(angle))
speed *= 0.95
rotcar = pygame.transform.rotate(car, angle)
position = rotcar.get_rect(center = (carX,carY))
# Basically a copy/paste of the "draw"-function from the spacegame.zip
wrap_around = False
if position[0] < 0 :
# off screen left
position.move_ip(WIDTH, 0)
wrap_around = True
if position[0] + rotcar.get_width() > WIDTH:
# off screen right
position.move_ip(-WIDTH, 0)
wrap_around = True
if position[1] < 0:
# off screen top
position.move_ip(0, HEIGHT)
wrap_around = True
if position[1] + rotcar.get_height() > HEIGHT:
# off screen bottom
position.move_ip(0, -HEIGHT)
wrap_around = True
if wrap_around:
SCREEN.blit(rotcar, position)
position[0] %= WIDTH
position[1] %= HEIGHT
carX %= WIDTH
carY %= HEIGHT
SCREEN.blit(rotcar, position)
pygame.display.update()
FPS.tick(24)
Si tengo un sprite (Ver a continuación) que puedo mover, la pantalla con las teclas de flecha. (Arriba y Abajo giran hacia adelante y hacia atrás, hacia la izquierda y hacia la derecha). Me preguntaba si sería posible pasar al otro lado de la pantalla cuando se apaga. Pero funciona de la forma que sea el ángulo, de modo que si se mueve a la mitad en el borde, la mitad aparece en un lado. (Tipo de serpiente) ¿Hay alguna manera de hacer esto?
Aquí está mi código hasta ahora:
import sys, pygame, math
from pygame.locals import *
pygame.init()
SCREEN = pygame.display.set_mode((800, 600))
car = pygame.transform.scale(pygame.image.load(''Car.png'').convert_alpha(), (64, 64))
pygame.display.set_caption(''Car Game'')
pygame.display.set_icon(car)
FPS = pygame.time.Clock()
carX = 400
carY = 100
angle = 90
speed = 0
while True:
if angle == 360: angle = 0
if angle == -1: angle = 359
SCREEN.fill((0,0,0))
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
keys = pygame.key.get_pressed()
if keys[K_a] or keys[K_LEFT]:
angle += speed
elif keys[K_d] or keys[K_RIGHT]:
angle -= speed
if keys[K_w] or keys[K_UP]:
speed += 1
elif keys[K_s] or keys[K_DOWN]:
speed -= 0.5
carX += speed*math.cos(math.radians(angle))
carY -= speed*math.sin(math.radians(angle))
speed *= 0.95
rotcar = pygame.transform.rotate(car, angle)
position = rotcar.get_rect(center = (carX,carY))
SCREEN.blit(rotcar, position)
pygame.display.update()
FPS.tick(24)