La caja oculta la gema
Parte de la sección El bucle del juego del Journey de Pygame de Coddy. Lección 18 de 35.
La caja se dibuja antes que la gema, así que la gema aparece encima. Para que una caja pueda ocultar la gema, dibuja la caja después de la gema: lo último que se dibuja cubre lo que ya está ahí.
Entonces, al hacer clic en la caja, la prueba de la gema no debe detectar el clic y recoger una gema que el jugador no puede ver. Se ejecutan las dos pruebas if. Con elif, la segunda solo se ejecuta cuando la primera es falsa, así que solo una de ellas recibe el clic:
if crate.collidepoint(event.pos):
dragging = True
elif gem.collidepoint(event.pos):
print("Got it!")Prueba primero lo que está dibujado encima. Así, un clic en la caja nunca llega a la gema que hay detrás.
Un borde más oscuro hace que una caja parezca sólida. Dibuja el mismo Rect otra vez con un color más oscuro y un grosor; solo se dibujará el contorno, sobre el relleno.
Desafío
FácilDeja que la caja oculte la gema y evita que al hacer clic sobre ella se recoja la gema.
- Mueve la línea de dibujo de la caja para que aparezca después del contorno de la gema y, debajo, dibuja
crateotra vez en(110, 70, 35)con un ancho de3, como borde. - En la rama
MOUSEBUTTONDOWN, cambia elifde la gema porelif, debajo de la comprobación de la caja.
Pulsa «Jugar», arrastra la caja sobre la gema y haz clic en ella: la gema permanece oculta y no aparece ninguna marca rosa. Después, pulsa «Comprobar».
Pruébalo tú mismo
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Hunt")
clock = pygame.time.Clock()
gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
dragging = False
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if crate.collidepoint(event.pos):
dragging = True
if gem.collidepoint(event.pos):
score += 1
gem.x = random.randint(15, 435)
gem.y = random.randint(55, 315)
elif event.type == pygame.MOUSEBUTTONUP:
dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
crate.move_ip(event.rel)
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (150, 100, 50), crate)
gem_points = [gem.midtop, gem.midright, gem.midbottom, gem.midleft]
pygame.draw.polygon(screen, (80, 220, 255), gem_points)
if gem.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)
for i in range(score):
pygame.draw.rect(screen, (240, 110, 180), (10 + 10 * i, 14, 8, 8))
mouse_x, mouse_y = pygame.mouse.get_pos()
pygame.draw.circle(screen, (240, 240, 240), (mouse_x, mouse_y), 10, 2)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Todas las lecciones de El bucle del juego
1Mueve un cuadrado
Abre una ventanaRellena el fondo4Movimiento basado en el tiempo
Tiempo deltaPíxeles por segundoVector2Aceleración y fricciónReaparecer al otro lado de la pantallaPractica por tu cuenta: Playground de Pygame