Pygame- Screen.blit (source, dest, area) возвращает пустой прямоугольник - PullRequest
2 голосов
/ 20 мая 2019

Я пытаюсь создать анимацию, в которой изображение одновременно перемещается вниз и исчезает, например:

enter image description here

Однако я могу 'Похоже, это работает правильно.Я хочу, чтобы изменялась только часть экрана с анимацией, поэтому я сделал что-то вроде этого ...

orect = pygame.Rect(oSprite.rect)
    for i in range(10):
        screen.fill(Color(255,255,255),rect=orect)
        oSprite.rect.top += 12
        print(orect)
        print(screen.blit(oSprite.image, oSprite.rect, orect))
        pygame.display.update(orect)
        timer.tick(30)

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

В документах screen.blit(source, dest, area) должен возвращать Rect, представляющий пиксели, которые изменились, но когда я запускаю свой код, я получаю это (в 10 раз больше):

<rect(336, 48, 76, 74)>
<rect(336, 60, 0, 0)>

Вторая строка - это то, чтобыл возвращен screen.blit(), что означает, что он изменил область 0x0, и действительно, все, что я вижу на экране, когда код выполняется, - это внезапное сокращение до белого, а не какая-либо анимация вообще.Почему это может произойти?Как видно из первого оператора print (), прямоугольник, который я ввел для значения области, был 76x74, а не 0x0.

1 Ответ

3 голосов
/ 20 мая 2019

Вам нужно перетаскивать поверх поверхности oSprite.image, а не поверхности экрана.

Это позволит нарисовать другое изображение поверх oSprite.image , не расширяясь на экране, еслионо больше.

oSprite.image.blit(new_image, (0,0))

Отредактировано: Возьмите этот пример, запустите его и посмотрите, что происходит:

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((500,500))
run    = True

#Animation Speed
speed = 0.1

#Load an image.
player = pygame.image.load("player.png").convert_alpha()
x,y    = (0,0)

#Create a rectangular area to blit the player inside.
surf = pygame.Surface((player.get_width(),player.get_height()))


def Animate():
    global y

    if y > player.get_width():
        y = 0

    else:
        y += speed

while run:

    for event in pygame.event.get():
        if event.type==QUIT:
            run=False
            break;


    #Clear the surface where you draw the animation.
    surf.fill((255,255,255))

    #Draw the image inside the surface.
    surf.blit(player, (x,y))

    #Draw that surface on the screen.
    screen.blit(surf, (20,20))

    #Animate the image.
    Animate()

    pygame.display.update()

pygame.quit()




pygame.quit()

Представьте себе, что surf это лист бумаги, и вы рисуете внутри него изображение , а затем кладете этот лист бумаги на экран.

...