tutorial - ¿Cómo puedo crear un fondo de desplazamiento en python con pygame?
pygame tutorial español pdf (1)
Algunas cosas primero:
- arregla tu sangría
- la función de tu nave es prácticamente inútil
- usa Rect para manejar mover
- su verdadero problema es que su código nunca llega a
pygame.display.update()
debido a su segundo bucle while
Por lo tanto, para hacer un fondo interminable de desplazamiento, y la manera fácil es hacer lo siguiente:
Blit su imagen de fondo dos veces , una vez en la posición y
, y una vez en y + image_width
(reemplace y
con x
de lo que quiera). Luego, en cada iteración de tu mainloop, puedes restar de y
para crear el movimiento. Una vez que una imagen se movió es toda su altura, restablezca y
al valor inicial
Aquí hay un ejemplo completo, que muestra un fondo de desplazamiento (y cómo usar sprites, grupos, vectores y rects):
import pygame
pygame.init()
SCREEN = pygame.display.set_mode((300, 300))
move_map = {pygame.K_w: pygame.math.Vector2( 0, -1),
pygame.K_s: pygame.math.Vector2( 0, 1),
pygame.K_a: pygame.math.Vector2(-1, 0),
pygame.K_d: pygame.math.Vector2( 1, 0)}
class Actor(pygame.sprite.Sprite):
def __init__(self, group, color, pos, size=(30, 30)):
self.image = pygame.Surface(size)
self.image.fill(color)
self.rect = self.image.get_rect(center=pos)
pygame.sprite.Sprite.__init__(self, group)
class Bullet(Actor):
def __init__(self, *args):
Actor.__init__(self, *args)
self.speed = 10
def update(self):
self.rect.move_ip(self.speed, 0)
if not SCREEN.get_rect().colliderect(self.rect):
self.kill()
class Player(Actor):
def __init__(self, *args):
self._layer = 4
Actor.__init__(self, *args)
self.speed = 4
self.timeout = 0
def update(self):
p = pygame.key.get_pressed()
move_vector = pygame.math.Vector2(0, 0)
for v in [move_map[key] for key in move_map if p[key]]:
move_vector += v
if move_vector:
self.rect.move_ip(*move_vector.normalize() * self.speed)
self.rect.clamp_ip(SCREEN.get_rect())
if self.timeout :
self.timeout -= 1
if p[pygame.K_SPACE] and not self.timeout:
Bullet(self.groups()[0], (130, 200, 77), self.rect.center, (10, 3))
self.timeout = 5
class Background(pygame.sprite.Sprite):
def __init__(self, number, *args):
self.image = pygame.image.load(''back.jpg'').convert()
self.rect = self.image.get_rect()
self._layer = -10
pygame.sprite.Sprite.__init__(self, *args)
self.moved = 0
self.number = number
self.rect.x = self.rect.width * self.number
def update(self):
self.rect.move_ip(-1, 0)
self.moved += 1
if self.moved >= self.rect.width:
self.rect.x = self.rect.width * self.number
self.moved = 0
group = pygame.sprite.LayeredUpdates()
Player(group, (255, 255, 255), (100, 100))
Background(0, group)
Background(1, group)
clock = pygame.time.Clock()
run = True
while run:
for e in pygame.event.get():
if e.type ==pygame.QUIT:
run = False
SCREEN.fill((0,0,0))
group.update()
group.draw(SCREEN)
pygame.display.flip()
clock.tick(60)
Para probar esto, puede usar esta imagen ( back.jpg
como back.jpg
):
He estado tratando de hacer un juego de disparos espaciales durante los últimos 2 días y quiero hacer que el fondo se desplace, pero no sé cómo. Aquí está mi código:
import pygame
import time
pygame.init()
width = 800
height = 600
black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
ship_width = 35
ship_height = 64
disp = pygame.display.set_mode((width,height))
pygame.display.set_caption("Space Jump")
clock = pygame.time.Clock()
background = pygame.image.load("Space.png").convert()
shipImg = pygame.image.load("Ship.png")
def ship(x,y):
disp.blit(shipImg, (x,y))
def gameLoop():
x = (width * 0.45)
y = (height * 0.8)
x_ch = 0
y_ch = 0
gameExit = False
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_ch = -5
elif event.key == pygame.K_RIGHT:
x_ch = 5
elif event.key == pygame.K_UP:
y_ch = -5
elif event.key == pygame.K_DOWN:
y_ch = 5
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
x_ch = 0
if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
y_ch = 0
x += x_ch
y += y_ch
if x > width - ship_width or x < 0:
x_ch = 0
if y > height - ship_height or y < 0:
y_ch = 0
x_bg = 0
while True:
disp.blit(background, (0,x_bg)) # i tried this but when i launch
#a black screen just appears without
x_bg -= 1 #any image
ship(x,y)
pygame.display.update()
clock.tick(60)
gameLoop()
pygame.quit()
quit()
Tengo un fondo y quiero hacer que se desplace continuamente ¿me pueden ayudar?