Как Pygame узнает, что такое слой 1 (фон) по сравнению со спрайтами, отображаемыми на экране?

#python #pygame

Вопрос:

Мой учитель просматривал мой код сегодня и хотел, чтобы я объяснил ему, почему я могу использовать

 WIDTH, HEIGHT = 900, 500
PLAYER, SIZE = 34, 34
WIN = pygame.display.set_mode((WIDTH,HEIGHT))

Player_1 = pygame.transform.scale(pygame.image.load(os.path.join('skins', 'player.png')), (PLAYER,SIZE))
P1 = pygame.transform.rotate(Player_1, 270)
Player_2 = pygame.transform.scale(pygame.image.load(os.path.join('skins', 'enemy.png')), (PLAYER,SIZE))
P2 = pygame.transform.rotate(Player_2, 270)
SKY = pygame.transform.scale(pygame.image.load(os.path.join('skins', 'bg.png')), (WIDTH,HEIGHT))
#this will search our folder 'skins' for the file 'bg' to make our background
BULLET_SPEED = 5
BULLET_NUMBER = 5

BULLET_FIRE_SOUND = pygame.mixer.Sound(os.path.join('soundEffects', 'tiro.wav'))
BULLET_DAMAGE_SOUND = pygame.mixer.Sound(os.path.join('soundEffects', 'batida.wav'))


def draw(yellow, blue, yellow_bullets, blue_bullets, yellow_health, blue_health):
    WIN.blit(SKY, (0,0)) 
    pygame.draw.rect(WIN, WHITE, MID_BORDER)
    WIN.blit(P1, (yellow.x, yellow.y))
    WIN.blit(P2, (blue.x, blue.y))
    #pygame starts tracking at the top left with 0,0
    for bullet in blue_bullets:
        pygame.draw.rect(WIN, BLUE, bullet)
    for bullet in yellow_bullets:
        pygame.draw.rect(WIN, YELLOW, bullet)
    yellow_health_txt = HEALTH_FONT.render("Health: "   str(yellow_health), 1, WHITE)
    blue_health_txt = HEALTH_FONT.render("Health: "   str(blue_health), 1, WHITE)
    WIN.blit(yellow_health_txt,(10,10))
    WIN.blit(blue_health_txt,(WIDTH - blue_health_txt.get_width() - 10, 10))


    pygame.display.update()
 

и pygame знал bg.png , что файл должен быть фоновым и player/enemy.png на переднем плане.

Я объяснил, что, возможно, это произошло из bg.png HEIGHT WIDTH -за того, что я взял и, следовательно, растянул весь экран, но почти сразу же я увидел изъян в этой логике, player/enemy.png который легко мог быть скрыт bg.png и полностью скрыт.

Очевидно, что это не тот порядок, в котором я объявляю их, как я объявляю bg.png последним.

Итак, есть ли какой-либо способ понять логику того, как pygame проводит различие между фоном и передним планом, или это еще глубже

т.е.: layer {1..100 }

Извините, если это глупый вопрос или на него был дан ответ, я не смог найти его при исследовании.

Редактировать

После дальнейшего рассмотрения я думаю, что я также получу, что я инициализирую SKY , в (0,0) каком верхнем левом углу.

Это то, что определило это как фон? И (yellow.x, yellow.y) это указывает на положение, в котором появляются мои спрайты?

Комментарии:

1. Можете ли вы также опубликовать переменные PLAYER и SIZE MID_BORDER т. Д.?

2. вы не возражаете, если я просто позволю вам просмотреть код на GitHub? Я не знаю, дал бы я тебе именно то, о чем ты просишь. github.com/AmishMoses/PyGames/blob/main/JetFighter/…

3. Я просто говорю, что, возможно, координаты перекрываются из-за положения спрайтов. Мы не сможем запустить код, если не будем знать, где находятся спрайты blit .

4. О, мои спрайты не перекрываются, я использовал MID_BORDER и « def main(): желтый = pygame. Прямой(200, 250, 32, 32) синий = pygame. Прямая кишка(650, 250, 32, 32) « чтобы разделить два спрайта (не то, чтобы я это полностью понял), мой главный вопрос заключался в том, как pygame узнал, что поместить в качестве фона, а что на передний план.

5. D_00 спасибо, что отредактировали мой вопрос и попытались мне помочь. Я знаю, что иногда бывает неприятно помогать кому-то настолько новому.

Ответ №1:

Pygame рисует поверхности в том порядке, в котором вы .blit() их видите, так как SKY (то есть bg.png изображение) сначала блит, это фон.

Комментарии:

1. О, спасибо тебе! Я не мог найти этого в своем чтении. Я так новичок в pygame и во всех его причудах. Это был мой первый проект, и вы и еще несколько человек значительно облегчили его понимание! Я не могу поддержать ваш ответ, потому что я такой нуб, но действительно спасибо.