surface.fill () обновляет прямоугольник в цикле while? - PullRequest
0 голосов
/ 15 марта 2019

У меня есть две программы ниже, пытающиеся нарисовать шар на желтом экране.Один, где мой поверхностный объект заполняется вне цикла while, а другой - внутри цикла while.

Когда у меня есть .fill() вне цикла while, мое изображение перерисовывается, когда я пытаюсь его переместить.Поэтому, когда изображение уменьшается, оно рисует дублированное изображение всего на 10 пикселей ниже по экрану.

Когда у меня есть .fill() внутри цикла while, мое единственное изображение обновляется и перерисовывается в новом месте.

Почему это?

Код без трейлинга:

import pygame
import sys

length = 1200
width = 800


screen = pygame.display.set_mode((length, width))
screen_rect = screen.get_rect()

ball = pygame.image.load('ball.bmp')
ball_rect = ball.get_rect()
ball_rect.y = ball_rect.width
ball_rect.x = screen_rect.centerx


while True: 
    screen.fill((255, 255, 103))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                ball_rect.y += 15

    screen.blit(ball, ball_rect)
    pygame.display.flip()

Код трейлинг-изображения:

import pygame
import sys

length = 1200
width = 800


screen = pygame.display.set_mode((length, width))
screen_rect = screen.get_rect()
screen.fill((255, 255, 103))

ball = pygame.image.load('ball.bmp')
ball_rect = ball.get_rect()
ball_rect.y = ball_rect.width
ball_rect.x = screen_rect.centerx


while True: 


    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                ball_rect.y += 15

    screen.blit(ball, ball_rect)
    pygame.display.flip()

enter image description here

1 Ответ

1 голос
/ 15 марта 2019

Связанный код (изображение) не дает эффекта, который вы описываете. С левой стороны обновления screen вообще не производятся. На правой стороне, единственное сделанное обновление - screen.fill() желтого цвета.

Так что гипотетически говоря ...

Программа PyGame может рассматриваться как тип анимации . Во время основного цикла обычно имеется блок для обработки пользовательского ввода, вызовов для обновления позиций экранных объектов и вызовов для обновления, то есть «перекрашивания» экрана.

Каждый «кадр» этой анимации состоит из фона и, как правило, нескольких наложенных объектов. Это могут быть такие вещи, как растровые изображения игрока, боевые растровые изображения, элементы игрового поля, текстовые оценки и статусы и т. Д. Обычно сначала рисуется фон, а затем накладываемые элементы. Как только экран прорисован, движение объектов рассчитывается для следующего дисплея, оно перерисовывается и снова и снова ...

Первая ситуация, которую описывает вопрос, - это ситуация, когда экран обновляется таким образом, что предыдущий «кадр» анимации не был удален, и пользователь видит композицию из предыдущего и текущего отображения.

Во второй ситуации сначала стирается весь экран с screen.fill(). Таким образом удаляя любой след предыдущего кадра. Это типичная обработка.

Есть еще один способ. Этот метод отслеживает, где был изменен экран, и только конкретная область, которая требует обновления, перекрашивается. Этот подход потенциально может обеспечить гораздо более эффективный цикл ввода-обновления-рисования, поскольку он не перерисовывает элементы, которые не изменились.

...