Ящик прячет самоцвет
Часть раздела Игровой цикл путешествия по Pygame на Coddy. Урок 18 из 35.
Ящик рисуется перед драгоценным камнем, поэтому камень отображается поверх него. Если камень может оказаться под ящиком, рисуй ящик после камня: то, что рисуется последним, перекрывает уже нарисованное.
Затем нажатие на ящик не должно доходить до проверки камня и подбирать камень, которого игрок не видит. Обе проверки if выполняются. С elif вторая выполняется только тогда, когда первая оказалась ложной, поэтому нажатие обрабатывает только одна из них:
if crate.collidepoint(event.pos):
dragging = True
elif gem.collidepoint(event.pos):
print("Got it!")Сначала проверяй то, что нарисовано сверху. Тогда нажатие на ящик никогда не дойдёт до камня под ним.
Более тёмный край придаёт коробке вид цельного предмета. Нарисуй тот же Rect ещё раз более тёмным цветом с заданной шириной — будет нарисован только его контур поверх заливки.
Задание
ЛегкоПусть ящик закрывает драгоценный камень, а нажатие на него не засчитывается как нажатие на драгоценный камень.
- Перемести строку отрисовки ящика ниже контура драгоценного камня, а затем нарисуй
crateещё раз в(110, 70, 35)с шириной3, обозначив его край. - В ветке
MOUSEBUTTONDOWNзамениifдля драгоценного камня наelif, расположив его после проверки ящика.
Нажми «Играть», перетащи ящик на драгоценный камень и щёлкни по нему: драгоценный камень останется скрытым, и розовая отметка не появится. Затем нажми «Проверить».
Попробуйте сами
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()
Все уроки раздела Игровой цикл
Потренируйтесь самостоятельно: Песочница Pygame