Menu
CoddyTech

A caixa esconde a joia

Parte da seção O loop do jogo do Journey de Pygame da Coddy. Lição 18 de 35.

A caixa é desenhada antes da gema, então a gema aparece por cima dela. Para que a gema possa ficar escondida sob uma caixa, desenhe a caixa depois da gema: o que é desenhado por último cobre o que já está ali.

Então, um clique na caixa não deve chegar ao teste da gema e pegar uma gema que o jogador não consegue ver. Os dois testes if são executados. Com elif, o segundo só é executado quando o primeiro é falso, então apenas um deles recebe o clique:

if crate.collidepoint(event.pos):
    dragging = True
elif gem.collidepoint(event.pos):
    print("Got it!")

Teste primeiro o que está desenhado por cima. Assim, um clique na caixa nunca chega à gema que está atrás dela.

Uma borda mais escura faz uma caixa parecer sólida. Desenhe o mesmo Rect novamente com uma cor mais escura e uma largura, e somente seu contorno será desenhado, sobre o preenchimento.

challenge icon

Desafio

Fácil

Faça a caixa esconder a gema e impeça que um clique nela colete a gema.

  1. Mova a chamada de desenho da caixa para depois do contorno da gema e, abaixo dele, desenhe crate novamente em (110, 70, 35) com largura 3, como borda.
  2. No ramo MOUSEBUTTONDOWN, troque o if da gema por elif, abaixo do teste da caixa.

Pressione “Jogar”, arraste a caixa sobre a gema e clique nela: a gema permanece escondida e nenhuma marca rosa aparece. Em seguida, clique em “Verificar”.

Experimente você mesmo

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 as lições de O loop do jogo

Pratique por conta própria: Playground de Pygame